CI 묻고 답하기

제목 안녕하세요 csrf에관하여 몇 가지 질문드립니다..
카테고리 CI 2, 3
글쓴이 socreativedev 작성시각 2016/10/03 14:25:08
댓글 : 1 추천 : 0 스크랩 : 1 조회수 : 15446   RSS
안녕하세요.
제가 php와 coodeigniter를 시작한지 얼마 안되어서 몇가지 헷갈리는게 있습니다.
구글링을 해봤는데 딱히 원하는 답변이 없더라고요.

계속 고민중인데, 답변 부탁드리겠습니다.
감사합니다.

(코드이그나이터3.0, php 7버전 사용중입니다.) 
#########상황#######

제가 config.php 에서 csrf_protection 옵션과 
global_xss_filtering옵션을 true로 만들었습니다.

이렇게 하다보니깐 폼입력에서 그냥 입력하고 보내버리면 문제가 생기더라고요

csrf어쩌고 저쩌고.... 그래서 찾아보니깐 

<input type="hidden" name= csrf_name value="<?php echo $this->security->get_csrf_hash(); ?>" />

이런 보안코드를 폼에 넣어야 한다고하더라고요

 

######질문##########

1. 정말 모든 폼에 하나하나 

<input type="hidden" name= csrf_name value="<?php echo $this->security->get_csrf_hash(); ?>" />

이걸 다 넣어줘야하나요?

 

header 같은거에 넣어서 모든폼에 일일이 하나하나씩 다 안넣어줄 방법은 없나요

 

2. 템플릿 엔진을 아래와같이 만들어서 $this->load->library('parser');

$data = array( 'csrfprotect' => '<input type="hidden" name= csrf_name value="<?php echo $this->security->get_csrf_hash(); ?>"/' );

$this->parser->parse('auth/login', $data);

 

뷰에다가

{csrfprotect}를 했습니다.

이렇게하니깐 '/' <- 이 문자를 view.php에서 생략해버리더라고요 혹시 view.php(html tag) /이걸 표현하는 방식이 있을까요?

 

3. 

csrf_protection 옵션과 
global_xss_filtering옵션을 true로하면 모든 폼에 자동으로 csrf검사를 하는건가요.

특정폼을 예외적으로 처리해주고싶다면 

$config['csrf_exclude_uris'] = array(); 여기에 넣어주는게 맞겠죠?

 

4. csrf라는게 폼에서 조작하는걸로 알고있습니다. 그렇다면 

csrf_protection, global_xss_filtering 옵션이 켜져있어도,

폼이 없는 페이지에는 csrf검사를 안 하나요?

즉, 제가 csrf_name이나  get_csrf_hash();를 모든페이지에 집어넣을필요없이 폼에만 집어넣어주면 되는건가요?

 

4. 만약에

다른 사이트에서 제 사이트로 json형식으로 데이터를 보낼때 csrf저 키 값을 같이 보내줘야하나요?

근데 보내야한다면,

config.php에서 csrf_regenerate 옵션이 켜져있다면 다른사이트는 csrf값을 알 수 없을텐데 어떻게 처리해아할까요?
 다음글 메모리부족으로 인한 에러 발생 문제 ini_set() ... (11)
 이전글 3.0버전에서 mysql은 꼭 mysqli 만 써야 하... (2)

댓글

이범준 / 2016/10/03 17:52:37 / 추천 1

1. 먼저 application/config/autoload.php 에서 helper 부분에 form을 추가해 주세요.

 

<form name="test" action="http://localhost/test">

<input type="hidden" name= csrf_name value="<?php echo $this->security->get_csrf_hash(); ?>" />

 

위 코드를 대신 작성 해 주는 게 form_open(); 메소드 입니다.

이 메소드의 첫 번째 파라미터는 form 태그의 action을 지정합니다.

 

2. 1번으로 해결할 수 있습니다.

 

3. 예, post 메소드로 접근하면 자동으로 체크 합니다.

예외처리도 그렇게 해 주시면 됩니다.

 

4. 폼이 없는 페이지는 검사를 안 한다기보다는 post 메소드로 접근하게 되면 무조건 검사를 한다고 생각하시면 될 듯합니다.

 

4-1. 이것 때문에 말씀하신 $config['csrf_exclude_uris'] 로 예외처리를 시켜 줍니다.

오픈 API면 그냥 예외처리 시켜 주시고 후처리하시면 되겠지만, 이용자가 구별될 필요가 있다면 따로 api key를 발급해서 인증하도록 해야겠죠.

 

요즘은 oauth 라는 인증방식을 많이들 쓰더라구요.