$config['csrf_protection'] = TRUE;
$config['csrf_regenerate'] = TRUE;
config에서 이렇게 설정해주고
<form method="post">
<input type="hidden" id="<?=$this->security->get_csrf_token_name() ?>" name="<?=$this->security->get_csrf_token_name() ?>" value="<?=$this->security->get_csrf_hash() ?>" />
</form>
으로 설정한 폼에서 데이터를 넣고 날짜를 바꾸는 페이지를 구현하였습니다.
method 를 get 방식으로 할 때는 F5(새로고침)했을 때 문제 없는데,
post 형식으로 바꾸면
The action you have requested is not allowed.
이렇게 에러가 납니다.
조회하는 페이지라 이 페이지를 $config['csrf_exclude_uris'] = array(); 이 값에 넣어서 예외처리를 해주면 되지만,
그러면 생성하는 페이지 (값을 받아서 DB에 넣는 처리를 하는 페이지)에서는 보안상 csrf를 처리하는 게 맞는 것 같은데
이런 생성하는 페이지들에서는 새로고침을 하게되면 에러가 나서 혼동이 옵니다..
제 개인적으로도 새로고침을 자주하는 편이라 생성하는 페이지에서 값을 처음부터 다시 입력하게 될 경우 새로고침을 누르거나,
앞으로 이동, 뒤로 이동 같은 경우에는 무조건 에러 페이지가 나온다는 건데
제가 csrf 적용하는걸 잘못이해하고 있는건지.. csrf를 제대로 적용하려면 어떻게 해야하나요..?
@변종원(웅파)님
답변 감사합니다!
false로 해서 시도해보니 잘 작동하네요!
의문점은 매뉴얼에 보면 csrf_regenerate 설명 부분에
토큰 재생성을 기본으로 할 시 더 강력한 보안을 유지합니다. 그러나 유효하지 못한 토근값이 되버릴수 있습니다(뒤로가기, 앞으로이동, 여러 탭/윈도우 사용, 비동기화 작업, 등).. 다음 구성 매개변수를 변경하여 동작을 변경할 수 있습니다.
이렇게 적혀있는데 csrf_regenerate를 false로 하면 보안은 약해지지만 csrf에 대한 기본적인 보안은 가능하게 해준다는 의미인건가요?
늘 도움주셔서 정말 감사합니다.
$config['csrf_regenerate'] = false; 로 해보세요
그리고 csrf는 post에서 악의적 전송을 막기위한 방법입니다. get방식에선 작동하지 않습니다.