복붙노트

[RUBY-ON-RAILS] 4 정품 토큰 레일

RUBY-ON-RAILS

4 정품 토큰 레일

나는 몇 가지 인증 토큰 문제로 실행 (루비 2.0.0-P0) 새로운 레일 4 응용 프로그램 작업을했다.

JSON으로 응답합니다 (respond_to 클래스의 방법을 사용하여)하는 컨트롤러를 작성하는 동안, 나는 내가 컬을 사용하여 기록을 만들려고 할 때 나는 ActionController :: InvalidAuthenticityToken 예외를 받기 시작 동작을 만들 수 있어요.

나는 확실히 I 세트 -H "콘텐츠 형식 : 응용 프로그램 / JSON"를 만들고 난 아직 운이 "<여기 내 데이터>"-d로 데이터를 설정 없지만.

나는 (루비 1.9.3에) 레일 3.2을 사용하여 동일한 컨트롤러를 작성 시도하고 나는 전혀 문제 토큰 더 진정성 없어. 내가 아는 바로는, 그들은 더 이상 자동으로 더 이상 형태로 삽입하지 않습니다에서 레일 (4)의 인증 토큰 몇 가지 변화가 있다고 주위 I 톱 검색? 나는이 어떻게 든 HTML이 아닌 콘텐츠 형식에 영향을 미치는 가정합니다.

다음, 진위 토큰을 날치기하는 HTML 양식을 요청하는 데 그 토큰을 다른 요청을하지 않고이 문제를 해결하기 위해 어떤 방법이 있나요? 아니면 내가 완전히 완전히 분명 뭔가를 놓친 거지?

편집 : 난 그냥 비계를 사용하여 4 응용 프로그램 아무 것도 변경하지 않고 새로운 레일에서 새로운 기록을 만드는 시도하고 나는 그것이 내가 한 일이 아니다 같아요 그래서 저도 같은 문제로 실행 해요.

해결법

  1. ==============================

    1.난 그냥 그것을 알아 냈다고 생각합니다. 나는 (신규) 기본값을 변경

    난 그냥 그것을 알아 냈다고 생각합니다. 나는 (신규) 기본값을 변경

    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
    
  2. ==============================

    2.대신 CSRF 보호를 끄고, 그것은 양식에 다음 코드 행을 추가하는 것이 좋습니다

    대신 CSRF 보호를 끄고, 그것은 양식에 다음 코드 행을 추가하는 것이 좋습니다

    <%= tag(:input, :type => "hidden", :name => request_forgery_protection_token.to_s, :value => form_authenticity_token) %> 
    

    양식을 생성하는 form_for 또는 때 form_tag 사용하는 경우, 그것은 자동 형태로 위의 코드 줄을 추가합니다

  3. ==============================

    3.나를 위해 일한 형태에 다음 라인을 추가 :

    나를 위해 일한 형태에 다음 라인을 추가 :

    <%= hidden_field_tag :authenticity_token, form_authenticity_token %>
    
  4. ==============================

    4.일반적으로 당신이 독점적 API를 구현하지 않는으로 CSRF 보호를 해제하려면 나는 그것의 좋은 생각하지 않습니다.

    일반적으로 당신이 독점적 API를 구현하지 않는으로 CSRF 보호를 해제하려면 나는 그것의 좋은 생각하지 않습니다.

    ActionController I의 레일 4 API 설명서를 보면 당신은 컨트롤러 당 또는 방법 기지 당에 위조 보호를 해제 할 수 있음을 발견했다.

    예를 들어이 방법에 대한 CSRF 보호 꺼질 때까지 당신은 사용할 수 있습니다

    class FooController < ApplicationController
      protect_from_forgery except: :index
    
  5. ==============================

    5.같은 문제를 건너 왔어요. 내 컨트롤러에 추가하여 고정 :

    같은 문제를 건너 왔어요. 내 컨트롤러에 추가하여 고정 :

          skip_before_filter :verify_authenticity_token, if: :json_request?
    
  6. ==============================

    6.시도해 보았 니?

    시도해 보았 니?

     protect_from_forgery with: :null_session, if: Proc.new {|c| c.request.format.json? }
    
  7. ==============================

    7.이 공식 문서는 - 제대로 API에 대한 위조 방지 해제하는 방법에 대한 이야기 http://api.rubyonrails.org/classes/ActionController/RequestForgeryProtection.html

    이 공식 문서는 - 제대로 API에 대한 위조 방지 해제하는 방법에 대한 이야기 http://api.rubyonrails.org/classes/ActionController/RequestForgeryProtection.html

  8. ==============================

    8.이 레일의 보안 기능입니다. 형태 코드 줄을 추가합니다 :

    이 레일의 보안 기능입니다. 형태 코드 줄을 추가합니다 :

    <%= hidden_field_tag :authenticity_token, form_authenticity_token %>
    

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

  9. ==============================

    9.이러한 기능은 보안 및 위조 방지 목적 추가되었습니다. 그러나, 귀하의 질문에 대답하기 위해, 여기에 몇 가지 입력이 있습니다. 당신은 당신의 컨트롤러 이름 다음에 다음 라인을 추가 할 수 있습니다.

    이러한 기능은 보안 및 위조 방지 목적 추가되었습니다. 그러나, 귀하의 질문에 대답하기 위해, 여기에 몇 가지 입력이 있습니다. 당신은 당신의 컨트롤러 이름 다음에 다음 라인을 추가 할 수 있습니다.

    같은,

    class NameController < ApplicationController
        skip_before_action :verify_authenticity_token
    

    여기에 레일의 다른 버전에 대한 몇 가지 라인이있다.

    3 레일

    4 레일 :

    당신의 application_controller.rb 파일에 null_session : 모든 컨트롤러 루틴이 보안 기능을 해제하려는 경우, 당신은에 protect_from_forgery의 값을 변경할 수 있습니다.

    같은,

    class ApplicationController < ActionController::Base
      protect_from_forgery with: :null_session
    end
    
  10. ==============================

    10.당신이 레일 jQuery를 사용하는 경우 인증 토큰을 확인하지 않고 방법에 대한 항목을 허용 조심.

    당신이 레일 jQuery를 사용하는 경우 인증 토큰을 확인하지 않고 방법에 대한 항목을 허용 조심.

    JQuery와 - UJS 당신을위한 토큰을 관리 할 수 ​​있습니다

    당신은 이미 JQuery와 레일 보석의 일부로해야한다, 그러나 당신은과 application.js에 포함해야 할 수도 있습니다

    //= require jquery_ujs
    

    즉 당신이 필요로하는 모든입니다 - 당신의 아약스 호출해야 지금 작업

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

  11. ==============================

    11.authenticity_token 추가 : 진정한 양식 태그

    authenticity_token 추가 : 진정한 양식 태그

  12. ==============================

    12.당신은 당신에게 자신의 HTML 양식을 정의 할 때 당신은 보안상의 이유로 컨트롤러로 전송한다 인증 토큰 문자열을 포함해야합니다. 당신이 사용하는 경우 레일 도우미는 다음과 같이 형성하기 위해 추가 토큰 인증을 생성하기 위해 형성한다.

    당신은 당신에게 자신의 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>
    

    문제의 해결책 authenticity_token 필드 또는 사용을 추가하는 중입니다 그래서 오히려 다음 등 보안을 손상 형태 헬퍼 레일

  13. ==============================

    13.내 모든 시험은 잘 작동했다. 그러나 어떤 이유로 나는 비 테스트에 내 환경 변수를 설정했다 :

    내 모든 시험은 잘 작동했다. 그러나 어떤 이유로 나는 비 테스트에 내 환경 변수를 설정했다 :

    export RAILS_ENV=something_non_test
    

    그 중 내가 ActionController :: InvalidAuthenticityToken 예외를 시작하기 때문에이 변수를 설정 해제하는 것을 잊었다.

    $ RAILS_ENV를 설정 해제 후, 내 테스트는 다시 일하기 시작했다.

  14. from https://stackoverflow.com/questions/16258911/rails-4-authenticity-token by cc-by-sa and MIT license