●23일차(20250118023.php)(토요일 코딩)
#미션1
CSRF 공격후 공격 흔적을 실시간으로 찾아라
#미션2
ci3.st.kr 생성후 ci3.zip이 정상적으로 운영되도록 조치하라
ci4.st.kr 생성후 ci4.zip이 정상적으로 운영되도록 조치하라
> 기존에 만든 계정들과 차이점을 무엇이며 보안 측면에서는 우수한가?
> 실수로 root권한으로 만들어버림 > public_html 아래에 chown -R ci3:ci3 public_html
#프레임워크
다 만들어진 코드(보안도 포함)
https://www.codeigniter.com/
https://www.codeigniter.com/download
> 프레임워크 설치
#ci3.st.kr
welcome : class or controller
welcome.php
ci3.st.kr/index.php/Auth/login
ci3.st.kr/index.php/Auth/signup
ci3.st.kr/index.php/Auth/mypage
views > auth > login.php,logout.php,mypage.php,signup.php 만들어줌
-> 처음에 루트계정으로 zip파일을 풀어버리고선 권한자 전부를 ci3로 바꿔버리는 일을 저질러 ci3.st.kr은 제대로 하지 못함
#ci4.st.kr
1. 웹페이지 세팅
nano /etc/apache2/sites-available/hosting.conf
hosting.conf
<VirtualHost *:80>
DocumentRoot /home/ci4/public_html/public
ServerName ci4.st.kr
ServerAdmin ci4@ci4.st.kr
ErrorLog /home/ci4/public_html/logs/error.log
CustomLog /home/ci4/public_html/logs/access.log combined
</VirtualHost>
<Directory "/home/ci4/public_html/public">
AllowOverride All
Require all granted
options None
#Order Allow,Deny
#Allow from all
#Deny from 100.100.100.1/32
</Directory>
> ci4 경로를 public_html/public으로 지정
AllowOverride All
> 줄여서 쓰는 url이 인식이됨
> 수정후 a2enmod rewrite
> systemctl restart apache2
cd /home/ci4/public_html
chmod -R 777 writable
> writable이 초록색으로 변한다
경로: /home/ci4/public_html
cp env .env
nano .env
environmetnt 주석 풀고 development 넣어주기
> 개발자 모드
2. edit plus 수정
auth는 디렉토리가 아닌 클래스
/public_html/app/config 아래에
[App.php]
----------------------------------------------
public string $baseURL = 'http://ci4.st.kr/';
----------------------------------------------
> 수정
[routes.php]
<?php
use CodeIgniter\Router\RouteCollection;
/**
* @var RouteCollection $routes
*/
$routes->get('/', 'Home::index');
$routes->get('/auth/', 'Auth::index');
$routes->post('/auth/login', 'Auth::login');
$routes->get('/auth/logout', 'Auth::logout');
$routes->get('/auth/mypage', 'Auth::mypage');
> 전송방식
auth를 누르면 login창 submit을 누르면 post로 넘어옴
Auth::? > ?는 함수
/public_html/app/controllers/ 아래에
[Auth.php]
<?php
namespace App\Controllers;
use App\Models\AuthModel;
class Auth extends BaseController
{
public function index(): string
{
return view('templates/header')
. view('auth/login')
. view('templates/footer');
}
public function login()
{
helper(['form','url']);
$session = session();
$model = new AuthModel();
/*
$rules = [
'id_param'=>?,
'pw_param'=>?
];
if() {
}
*/
$id_param =$this->request->getPost('id_param');
$pw_param =$this->request->getPost('pw_param');
$result=$model->checkUser($id_param,$pw_param); #True
if ($result) {
#$session->
#$session->
return redirect()->to('/');
}
$session->setFlashdata('msg','틀렸어');
return redirect()->to('/auth');
}
/*
public fuction login(): string
{
return view('auth/login');
}
*/
public function mypage(): string
{
return view('auth/mypage');
}
public function logout(): string
{
return view('auth/logout');
}
}
> home.php에서 복사해와서 수정
> 일일이 include 안해도 header footer가 뜸
public_html/app/views/templates 아래에
> footer.php와 header.php를 만들어줌
[header.php]
<!DOCTYPE html>
<html lang="en">
<head>
<title>산대특(프레임워크)</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="<?=base_url('static/bootstrap.min.css'); ?>">
<script src="<?=base_url('static/bootstrap.bundle.min.js'); ?>"></script>
</head>
<body>
<nav class="navbar navbar-expand-sm navbar-dark bg-dark">
<div class="container-fluid">
<a class="navbar-brand" href="/">CI4</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#mynavbar">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="mynavbar">
<ul class="navbar-nav me-auto">
<li class="nav-item">
<a class="nav-link" href="intro/profile">소개</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">Link</a>
</li>
<li class="nav-item">
<a class="nav-link" href="javascript:void(0)">Link</a>
</li>
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown">관리</a>
<ul class="dropdown-menu">
<li><a class="dropdown-item" href="/auth/">로그인</a></li>
<li><a class="dropdown-item" href="/auth/mypage.php">마이페이지</a></li>
<li><a class="dropdown-item" href="/auth/logout.php">로그아웃</a></li>
</ul>
</li>
</ul>
<form class="d-flex">
<input class="form-control me-2" type="text" placeholder="Search">
<button class="btn btn-primary" type="button">Search</button>
</form>
</div>
</div>
</nav>
</body>
</html>
public_html/app/views/auth
> login.php, logout.php, mypage.php 만들어줌
[login.php]
<div class="container mt-3">
<h2>로그인</h2>
<?php if(session()->getFlashdata('msg')): ?>
<div class="alert alert-danger">
<?=session()->getFlashdata('msg')?>
</div>
<?php endif; ?>
<form action="/auth/login" method="post">
<?csrf_field()?>
<div class="mb-3 mt-3">
<label for="id_param">아이디</label>
<input type="text" class="form-control" id="id_param" placeholder="아이디입력" name="id_param">
</div>
<div class="mb-3">
<label for="pw_param">비밀번호</label>
<input type="password" class="form-control" id="pw_param" placeholder="암호입력" name="pw_param">
</div>
<div class="form-check mb-3">
<label class="form-check-label">
<input class="form-check-input" type="checkbox" name="remember"> Remember me
</label>
</div>
<button type="submit" class="btn btn-primary" name="Login" value="Login"> 로그인</button>
</form>
</div>
> ?csrf_field()?는 무조건 들어가야함 csrf 공격을 막아주는 코드임
+) 형식 깨짐
public_html/public에 staic을 만들어주고 bootstrab을 넣어준다
> 로그인 화면이 이쁘게 나온다
모델을 불러오기 위해서
public_html/app/models 아래에 만들어줌
[AuthModel.php]
<?php
namespace App\Models;
use CodeIgniter\Model;
class AuthModel extends Model
{
public function checkUser($id_param,$pw_param)
{
return True;
}
}
[데이터베이스]
CREATE DATABASE ci4;
CREATE USER 'ci4'@'localhost' IDENTIFIED BY '123456';
GRANT ALL PRIVILEGES ON ci4.* TO 'ci4'@'localhost';
FLUSH PRIVILEGES;
CREATE USER 'ci4'@'192.168.56.104' IDENTIFIED BY '123456';
GRANT ALL PRIVILEGES ON ci4.* TO 'ci4'@'192.168.56.104';
FLUSH PRIVILEGES;
> 웹페이지에서 미리 맞춰주고 넣어줌(public_html/app/config/Database.php에서 수정)

> workbench로 가자
[workbench]
CREATE TABLE users (
idx int(6),
id_param varchar(15),
pw_param varchar(32),
last_login TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
failed_login INT(3),
PRIMARY KEY (idx)
);
> 만들어서 1 admin 123456 2025-01-18 00:00:00 0으로 넣어줌
[Authmodels.php]
<?php
namespace App\Models;
use CodeIgniter\Model;
class AuthModel extends Model
{
protected $table = 'users';
protected $primarykey = 'idx';
protected $allowedFields = ['id_param','pw_param'];
public function checkUser($id_param,$pw_param)
{
$user = $this->where('id_param',$id_param)->first();
if ($user && password_verify($pw_param,$user['pw_param'])){
return True;
}
return null;
}
}
> 제대로 수정
> 데이터베이스를 연결시켜서 가져옴
> submit을 누르면 틀렸어 라는 말이 나오게됨(옳은걸 쳐도)
[정리]
데이터베이스 관련
> models
연결이 잘 안돼
> controllers
글자가 깨져
> Views
ci4.st.kr를 치면 ci4.st.kr/index.php로 넘어가고
ci4.st.kr/auth를 치면 login.php로 get방식으로 넘어가(사이트만 딱 띄워줌)
로그인 창에서 submit을 누르면 post 방식으로 넘어간다(데이터베이스 연결후 매치)