2011-03-20 2 views
7

CodeIgniter에서 매우 이상한 CSRF 보호 문제가 있습니다. config_open을 사용하여 양식을 시작하고 csrf_protection을 config 파일에서 true로 설정했는지 확인하고 숨겨진 csrf 이름과 값 필드가 여기에 표시된대로 csrf 쿠키와 일치하는지 확인했습니다. http://d.pr/3cfB.CodeIgniter의 CSRF 토큰 문제

양식을 제출할 때 "오류가 발생했습니다. 요청한 동작이 허용되지 않습니다."라는 메시지가 나타납니다. 오류와 이유를 모르겠다. csrf_protection을 해제하면 양식이 제대로 작동합니다.

나의 인증에 tank_auth 라이브러리를 사용하고 로그인 폼에 form_open도 사용한다는 것이 더 이상한 것입니다. csrf_protection이 켜졌을 때 로그인 양식에 숨겨진 csrf 필드가 있는지 확인하고 양식을 제출하고 문제없이 로그인 할 수 있었는지 확인했습니다.

이 문제를 디버그하려면 어떻게해야합니까?

답변

1

문제점을 발견했습니다. 내 사용자 지정 라이브러리 중 하나에서 나는 parent : _ sanitize_globals()를 가지고 있는데, 이는 분명 오류의 원인이었습니다. 어딘가에 xss 필터링을 켜 놓으면 전역을 위생 할 필요가 없습니다.

1

먼저 세션 클래스는 'csrf_salemarked_token $ ...'이 아닌 'csrf_token_name'이라는 토큰을 예상합니다.

이 블로그 게시물은 AJAX with CSRF Protection in Codeigniter 2.0을 다룹니다.

Tank_auth가 쿠키가 아닌 숨겨진 입력 양식 필드에서 토큰을 가져옵니다. AJAX 요청은 가능한 경우 숨겨진 필드에서 토큰을 가져와야하며, 폼이 없으면 쿠키를 가져와야합니다.

+0

흠, 나는 이것에 대해 동의하지 않습니다. 몇 가지 - 먼저 csrf_token_name은 CI config - http://d.pr/lQHG의 일부이므로 'csrf_salemarked_token $ ...'은 토큰의 이름입니다. 둘째, 나는 아약스 양식 제출을하려고하지 않는다. 셋째, tank_auth가 양식을 만든 것과 같은 방식으로 양식을 만들었습니다. 두 번 확인했고 두 양식 모두 csrf 토큰 이름과 값으로 숨겨진 입력을 받았습니다. –

+0

woof ... 토큰 이름이 맞습니다. 어떻게 든 업그레이드 된 새 구성 파일을 마이그레이션하지 않았습니다. – coolgeek