programing

레일 4 인증 토큰

lovejava 2023. 6. 3. 07:50

레일 4 인증 토큰

새로운 Rails 4 앱(Ruby 2.0.0-p0)을 작업하던 중 인증 토큰 문제가 발생했습니다.

하면서 (하여)respond_to 방법는▁the다▁to▁method▁i▁got▁class니에 도착했습니다.create요 ㅠㅠㅠㅠㅠㅠㅠActionController::InvalidAuthenticityToken다을사용레여만때들예의외를코드음을 사용하여 때의 curl.

내가 확실히 정했어요.-H "Content-Type: application/json"그리고 나는 데이터를 설정했습니다.-d "<my data here>"하지만 여전히 운이 없습니다.

저는 Rails 3.2(Ruby 1.9.3)를 사용하여 동일한 컨트롤러를 작성하려고 시도했지만 인증 토큰 문제가 전혀 발생하지 않았습니다.검색해보니 레일즈 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) %> 

그리고 만약 당신이 폼을 생성하기 위해 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

이것은 레일즈의 보안 기능입니다.이 코드 줄을 다음 형식으로 추가합니다.

<%= hidden_field_tag :authenticity_token, form_authenticity_token %>

설명서는 http://api.rubyonrails.org/classes/ActionController/RequestForgeryProtection.html 에서 찾을 수 있습니다.

이러한 기능은 보안 및 위조 방지를 위해 추가되었습니다.
그러나 질문에 답하기 위해 몇 가지 입력 사항이 있습니다.이러한 행은 컨트롤러 이름 뒤에 추가할 수 있습니다.

이렇게.

class NameController < ApplicationController
    skip_before_action :verify_authenticity_token

다음은 다양한 버전의 레일에 대한 몇 가지 선입니다.

레일 3

skip_before_filter :skip_interity_filter

레일 4:

skip_before_action : skip_intervality_message


모든 컨트롤러 루틴에 대해 이 보안 기능을 사용하지 않도록 설정하려는 경우 application_controller.rb 파일에서 protect_forgy의 값을 :null_session으로 변경할 수 있습니다.

이렇게.

class ApplicationController < ActionController::Base
  protect_from_forgery with: :null_session
end

레일과 함께 jQuery를 사용하는 경우 인증 토큰을 확인하지 않고 메서드에 대한 입력을 허용하지 않도록 주의하십시오.

jquery-ujs는 토큰을 관리할 수 있습니다.

이미 jquery-rails 보석의 일부로 가지고 있어야 하지만, 애플리케이션에 포함시켜야 할 수도 있습니다.js.

//= require jquery_ujs

그게 당신이 필요한 전부입니다. 이제 아약스 통화가 작동합니다.

자세한 내용은 https://github.com/rails/jquery-ujs 을 참조하십시오.

더하다authenticity_token: true서식 태그까지

사용자 자신의 html 양식을 정의할 때 보안상의 이유로 컨트롤러로 전송되는 인증 토큰 문자열을 포함해야 합니다.레일 양식 도우미를 사용하여 인증 토큰을 생성하면 다음과 같이 양식에 추가됩니다.

<form accept-charset="UTF-8" action="/login/signin" method="post">
  <div style="display:none">
    <input name="utf8" type="hidden" value="&#x2713;" />
    <input name="authenticity_token" type="hidden" value="x37DrAAwyIIb7s+w2+AdoCR8cAJIpQhIetKRrPgG5VA=">
  </div>
    ...
</form>

따라서 이 문제에 대한 해결책은 authentity_token 필드를 추가하거나 보안을 훼손하는 대신 도우미 형식의 레일을 사용하는 것입니다.

제 모든 테스트는 잘 작동했습니다.하지만 어떤 이유에서인지 내 환경 변수를 테스트하지 않음으로 설정했습니다.

export RAILS_ENV=something_non_test

이 변수를 설정 해제하는 것을 잊었습니다. 이 변수 때문에ActionController::InvalidAuthenticityToken예외.

설정 해제 후$RAILS_ENV제 시험이 다시 작동하기 시작했습니다.

언급URL : https://stackoverflow.com/questions/16258911/rails-4-authenticity-token