내가 한 노력들

[ codeigniter 4 ] CSRF 공격 방지 본문

IT 공부/CodeIgniter

[ codeigniter 4 ] CSRF 공격 방지

JONGI-N CHOI 2022. 3. 12. 17:22

CSRF (Cross-site request forgery)

웹 애플리케이션 취약점 중 하나로 사용자가 자신의 의지와 무관하게 공격자가 의도한 행동을 하여 특정 웹페이지를 보안에 취약하게 한다거나 수정, 삭제 등의 작업을 하게 만드는 공격방법을 의미한다. 유명 경매 사이트 옥션의 개인정보 유출 사건에 사용된 공격 방식이다.

 

참고: https://velog.io/@gwanuuoo/CSRF-%EA%B3%B5%EA%B2%A9%EA%B3%BC-%EB%B0%A9%EC%96%B4-%EA%B8%B0%EB%B2%95

 

 

방지하기 위해서 여러 방법이있는데, 그 중에서 토큰 방식을 이용할려고 합니다. 

 

app\config\filters.php

public $globals = [
    'before' => [
        // 'honeypot',
        'csrf',
        // 'invalidchars',
    ],
    'after' => [
        'toolbar',
        // 'honeypot',
        // 'secureheaders',
    ],
];

우선 filters의 globals의 before에 있는 csrf의 주석처리를 해제합니다. 

 

 

<input type="hidden" name="csrf_test_name" value="bda667a3a17398d3413fa710ca66d5e0" />

 

그리고 form 태그가 사용되는 곳에 소스 보기를 해보면, 위와같은 hidden 필드가 하나 생성된 것을 볼 수 있습니다.

이 토큰 값을 이용해서, 값이 일치하는 경우에만 에러없이 동작이 되는 형태입니다. 

 

예를 들어서, 다른 value값인 경우에는 어떻게 동작되는지 확인해보면

<input type="hidden" name="<?= csrf_token() ?>" value="an invalid token">

form 태그 안에 위와같이 인위적으로 잘못된 token을 추가합니다 .

 

<input type="hidden" name="csrf_test_name" value="bda667a3a17398d3413fa710ca66d5e0" />
<input type="hidden" name="csrf_test_name" value="an invalid token">

그리고, 다시한번 소스 보기를 해보면, 기존의 crsf token과 인위적으로 추가한 token 두가지가 생긴 것을 볼 수 있습니다.

 

자동적으로 제일 뒤에있는 crsf값으로 선택이 됩니다. 

crsf값이 일치하지 않으면 error의 flash 메세지로 반환이 됩니다. 

 

<?php if (session()->has('error')): ?>
    <div class="error">
        <?= session('error') ?>
    </div>
<?php endif; ?>

view 단계에서 session을 error로해서 확인해보면

 

위와 같은 defult 메세지를 확인할 수 있습니다.