2011-02-22 5 views
6

사용자가 로그인하고 사용자 이름이 인증되어 [: user_name] 세션에 저장되면 method = "post"(표준 html 사용)의 양식을 제출할 때 모든 세션 데이터가 지워지고 사용자가 로그인 페이지로 다시 라우팅됩니다 . 메소드가 get으로 설정된 경우에는 발생하지 않습니다. 무슨 일왜 post 메소드가 내 레일 세션 데이터를 지우고있는 것 같습니까?

<div style="margin: 0pt; padding: 0pt; display: inline;"> 
<input type="hidden" value="✓" name="utf8"> 
<input type="hidden" value="a_bunch_of_gibberish" name="authenticity_token"> 
</div> 

: 나는 레일이 추가 라인을 생성 "때 form_tag"를 사용할 때

후 작동?

+1

입니다. 컨트롤러 코드를 표시해야합니다 – fl00r

답변

9

레일 3.0.4를 사용하고 있습니까? CSRF fix과 관련된 것 같습니다.

필요에 맞는 수정 프로그램이 필요한 경우 컨트롤러에서 #handle_unverified_request를 덮어 쓸 수 있습니다. https://github.com/rails/rails/blob/master/actionpack/lib/action_controller/metal/request_forgery_protection.rb을 참조하십시오.

Here's an example 여기서 문제는 OmniAuth 및 OpenId와 관련이 있습니다. ('CSRF Protection In Rails 3.0.4'절 참조)

+0

3.0.4를 사용 중이고 "CSRF Protection Bypass in Ruby on Rails"기사에서 나는 당신이 옳다고 생각합니다. '이 수정에서 두 가지 주요 변경 사항이 있습니다. CSRF 보호가 실패 할 때의 동작입니다 가 변경되어 토큰이 모든 비 GET 요청에 필요합니다. 이 패치를 적용한 후에는 CSRF 요청이 더 이상 HTTP 500 오류를 생성하지 않고 세션이 재설정됩니다. ' –

+0

위조 처리를 덮어 쓰는 방법에 대한 간단한 설명 : http://stackoverflow.com/a/1730421/216717 –

6

이 문제는 사용자 자신의 html 양식을 만드는 경우에도 발생할 수 있습니다. 당신이 알지 못하는 리디렉션지고있는 경우

이유, 그것은 때문에 당신의와 ApplicationController에서 "protect_from_forgery"

양식에 게시 여기에 다음 코드를 추가 할 수 있도록하기 위해서 (또는 form_tag를 사용하여 아래 설명)의의 : form_tag 당신을 위해 숨겨진 필드를 생성하기 때문에 다른 작업이 실행되기 때문에 "때 form_tag는"작동

<form ... > 
... 
<%= hidden_field_tag "authenticity_token", form_authenticity_token %> 
... 
</form> 

이유는) =

+1

감사합니다. 내 문제가 해결되었습니다. – Dave

+0

@Dave glad it did! :-) – Abdo

관련 문제