CI 묻고 답하기

제목 csrf 사용시 ajax를 한번이 아닌 여러번 호출할시의 질문입니다.
글쓴이 마카오최 작성시각 2016/03/29 22:15:45
댓글 : 4 추천 : 0 스크랩 : 0 조회수 : 19968   RSS

CI의 CSRF 기능은 참 쉽게 적용되어 좋네요.

적용하고 있는 과정중 생긴 질문입니다.

예를들어 최근게시물과 같은 형태의 리스트를 출력하고 이것을

more 버튼을 클릭하면 4개씩 클릭할때마다 추가되는 것을 ajax로 구현해놨습니다.

 

csrf 적용 옵션을 

$config['csrf_regenerate'] = TRUE;

위와 같이 하여 폼 서브밋시마다 새로운 csrf값이 들어가게 되어있습니다.

 

그런데 more 버튼을 클릭시 기존 폼에 히든으로 있던

<input type="hidden" id="<?=$this->security->get_csrf_token_name()?>" name="<?= $this->security->get_csrf_token_name() ?>" value="<?= $this->security->get_csrf_hash()?>" />

이 부분을 스크립트에서 ajax 요청 성공시 처리되는 부분에 

다시 새로운 csrf 값으로 적용시키면 되겠지? 하고 ...

$("#<?=$this->security->get_csrf_token_name()?>").val("<?=$this->security->get_csrf_hash()?>");

이런식으로 구현했으나 아무값도 찍히지 않고

페이지가 새로고침 되어야만 새로운 값이 찍히는데...

페이지 새로고침 없이 뭔가 새롭게 csrf를 생성 하는 것이 있을것 같은데 없네요..

CORE를 확장해서 remake_hash_cookie() 와 같이 전용 메소드를 추가 구현해줘야 하는것인가요? 

이것때문에 난생 처음으로 볼줄도 모르는 CORE를 살펴보게 되었습니다..

CORE에서 어떻게 생성되나 하고 살펴 보다가 또 다시 문득 생각 드는게 이런 경우를 나만 처리하려고 하는게 아닐텐데? 라는 의구심이 들더라구요..

 

csrf 옵션 중  csrf_regenerate 을 FALSE 로 처리하면 되겠지만 매번 같은 값이 보이는게 좀 찝찝하기도 하고요.. 

보통 이렇게 리스트를 ajax로 계속적으로 추가 추가 해야하는 상황에서 csrf 적용을 어떻게 처리해야 하나요?

 

 다음글 memcache save 사용시 row 활용에 대해 질... (1)
 이전글 고정형 My_pagination(ci 3.0) 적용시 ... (2)

댓글

/ 2016/03/30 09:13:59 / 추천 0
/ 2016/03/30 09:45:09 / 추천 0

@마카오최

아.. 질문을 잘못 해석했네요 csrf_regenerate을 true로 유지하면서 ajax 요청 성공하고 다시 ajax요청을 하려는 건가요? 그래서 csrf를 생성하는거고요. 근대 위대로 하면 기존에 생성했던 csrf를 다시 사용하는 거라 csrf_regenerate=true설정과 맞지 않는거 같아요.

/ 2016/03/30 09:47:12 / 추천 0
안해봐서 될지 안될지 모르겠지만 제 생각에는 ajax요청을 처음 한 부분에서 새로운 csrf 생성을 해서 반환한 후 ajax성공하는 콜백에서 이 값을 사용하면 되지 않을까 합니다.
마카오최 / 2016/03/30 11:04:02 / 추천 0

님 답변 감사합니다.

그렇습니다. 제 질문이 ajax 성공하는 콜백에서 새로 생성된 해쉬값을 인풋에 다시 심어주는 과정 중에 

그 해쉬값을 비동기 상태로 새로 생성하는 방법이 있나? 하고 여쭤보고 있는 것입니다. ㅠ

그 방법을 모르겠네요..

분명 페이지 전체가 새로 불러들여와졌을때는  ci가 동작하면서 해쉬값을 새로 생성하는데 바로 이 생성부분...

/system/core/security.php 내부에 생성 로직이 있긴 하는데 그 안에 일부 메소드를 그대로 호출해서 사용할수 있는 형태는 아닌것 같고,

아무래도 코어를 확장하는 형태로 가서 유효한 csrf를 새로 생성하는 메소드를 만드는 것이 옳은것인가? 잘 모르겠어서요..ㅠ

이렇게 되면 이것을 또 악용할수도 있겠구나 하는 생각도 들구요..

어렵네요 ㅠ

 

현재는 그냥 csrf_regenerate=false 로 다시 셋팅해놓은 상태입니다...