진품 토큰 문제가 발생했을 때 새로운 Rails 4 앱 (Ruby 2.0.0-p0)을 작업하고있었습니다.
respond_to
클래스 메소드를 사용하여 json에 응답하는 컨트롤러를 작성하는 동안 을 사용하여 레코드를 만들려고 할 때 예외 create
가 ActionController::InvalidAuthenticityToken
발생 하기 시작한 작업에 도달했습니다 curl
.
나는 내가 설정했는지 확인 -H "Content-Type: application/json"
하고 데이터를 설정 -d "<my data here>"
했지만 여전히 운이 없다.
Rails 3.2 (Ruby 1.9.3)를 사용하여 동일한 컨트롤러를 작성하려고 시도했지만 진위 토큰 문제가 없었습니다. 나는 주변을 검색했고 Rails 4에서 진품 토큰에 약간의 변화가 있음을 알았습니다. 내가 이해 한 것으로부터, 더 이상 자동으로 양식에 삽입되지 않습니까? 이것이 HTML이 아닌 내용 유형에 영향을 미친다고 생각합니다.
HTML 양식을 요청하지 않고 진위성 토큰을 채운 다음 해당 토큰으로 다른 요청을하지 않고도이 문제를 해결할 수 있습니까? 아니면 완전히 명백한 것을 완전히 놓치고 있습니까?
편집 : 방금 아무것도 변경하지 않고 비계를 사용하여 새 Rails 4 앱에서 새 레코드를 만들려고했는데 동일한 문제가 발생하여 내가 한 것이 아니라고 생각합니다.
답변
방금 알아 낸 것 같아요 (새) 기본값을 변경했습니다
protect_from_forgery with: :exception
에
protect_from_forgery with: :null_session
의 의견에 따라 ApplicationController
.
# Prevent CSRF attacks by raising an exception.
# For APIs, you may want to use :null_session instead.
의 소스를 살펴 request_forgery_protecton.rb
보거나 다음 줄 을 보면 차이를 확인할 수 있습니다 .
에서 레일 3.2 :
# This is the method that defines the application behavior when a request is found to be unverified.
# By default, \Rails resets the session when it finds an unverified request.
def handle_unverified_request
reset_session
end
에서 레일 4 :
def handle_unverified_request
forgery_protection_strategy.new(self).handle_unverified_request
end
다음을 호출 합니다 .
def handle_unverified_request
raise ActionController::InvalidAuthenticityToken
end
답변
csrf 보호 기능을 끄는 대신 다음 코드 줄을 양식에 추가하는 것이 좋습니다.
<%= tag(:input, :type => "hidden", :name => request_forgery_protection_token.to_s, :value => form_authenticity_token) %>
form_for 또는 form_tag를 사용하여 양식을 생성하는 경우 양식에 위의 코드 행을 자동으로 추가합니다.
답변
양식에 다음 줄을 추가하면 나에게 도움이되었습니다.
<%= hidden_field_tag :authenticity_token, form_authenticity_token %>
답변
API를 독점적으로 구현하지 않는 한 일반적으로 CSRF 보호를 해제하는 것이 좋지 않다고 생각합니다.
ActionController 에 대한 Rails 4 API 문서를 볼 때 컨트롤러 또는 메소드 기반에서 위조 방지 기능을 끌 수 있음을 발견했습니다.
예를 들어 사용할 수있는 방법에 대해 CSRF 보호를 끄려면
class FooController < ApplicationController
protect_from_forgery except: :index
답변
같은 문제를 겪었습니다. 컨트롤러에 추가하여 수정했습니다.
skip_before_filter :verify_authenticity_token, if: :json_request?
답변
시도해 보았 니?
protect_from_forgery with: :null_session, if: Proc.new {|c| c.request.format.json? }
답변
이 공식 문서-API에 대한 위조 방지 기능을 올바르게 해제하는 방법에 대해 설명합니다.
http://api.rubyonrails.org/classes/ActionController/RequestForgeryProtection.html