복붙노트

[RUBY-ON-RAILS] ActionController :: InvalidAuthenticityToken

RUBY-ON-RAILS

ActionController :: InvalidAuthenticityToken

다음은 내 레일 응용 프로그램의 형태에 의한 오류가 있습니다 :

Processing UsersController#update (for **ip** at 2010-07-29 10:52:27) [PUT]
  Parameters: {"commit"=>"Update", "action"=>"update", "_method"=>"put", "authenticity_token"=>"ysiDvO5s7qhJQrnlSR2+f8jF1gxdB7T9I2ydxpRlSSk=", **more parameters**}

ActionController::InvalidAuthenticityToken (ActionController::InvalidAuthenticityToken):

이것은 당신이 보는대로, authenticity_token이 모든 비 GET 요청을 발생합니다.

해결법

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

    1.나는 그러나 페이지 캐시 있었다 페이지와 같은 문제가 있었다. 페이지는 토큰 부실 인증 버퍼링있어 및 방법을 사용하여 모든 작업은 위조 시도로 인식 곳에 넣어은 / 삭제 / 게시 할 수 있습니다. 오류 (422 처리 할 수 ​​없음 법인) 사용자에게 반환되었다.

    나는 그러나 페이지 캐시 있었다 페이지와 같은 문제가 있었다. 페이지는 토큰 부실 인증 버퍼링있어 및 방법을 사용하여 모든 작업은 위조 시도로 인식 곳에 넣어은 / 삭제 / 게시 할 수 있습니다. 오류 (422 처리 할 수 ​​없음 법인) 사용자에게 반환되었다.

    레일 3을위한 솔루션 : 더하다:

     skip_before_filter :verify_authenticity_token  
    

    또는 레일 4 추가로 지적했다 "sagivo"와 같은 :

     skip_before_action :verify_authenticity_token
    

    페이지에 캐싱 않는.

    인덱스 :이 댓글을 달았습니다 @toobulkeh가 취약점 아니므로, 풋 : 쇼 작업,하지만에이를 사용하여 조심 후 작업을.

    예를 들면 :

     caches_page :index, :show  
     skip_before_filter :verify_authenticity_token, :only => [:index, :show]
    

    참조 : http://api.rubyonrails.org/classes/ActionController/RequestForgeryProtection/ClassMethods.html

    참고 skip_before_action https://guides.rubyonrails.org/4_2_release_notes.html "방법의 * _filter 제품군은 문서에서 제거 된 찬성 barlop- 레일 4.2 사용되지 않는 skip_before_filter을 추가했다. 이들의 사용은 * _action 찬성 권장하지 않습니다 방법의 가족 "

    ( "collimarco는"지적) 레일 6 당신은 skip_forgery_protection를 사용할 수 있으며 세션 데이터를 사용하지 않는 REST API를 위해 그것을 사용하는 것이 안전하다는 것을.

  2. ==============================

    2.나를 위해 레일 4에서이 문제의 원인은 누락했다

    나를 위해 레일 4에서이 문제의 원인은 누락했다

    <%= csrf_meta_tags %>
    

    내 주요 응용 프로그램의 레이아웃에 라인. 내가 실수했다 내가 내 레이아웃을 재 작성 할 때 삭제.

    이 메인 레이아웃에없는 경우에 당신은 당신이 CSRF가 토큰을 원하는 모든 페이지에 필요합니다.

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

    3.(레일 4에 관한)이 오류에 대한 몇 가지 원인이있다. 1. 페이지 레이아웃 본 <%는 csrf_meta_tags % =>을 리모컨으로 도우미 form_for 사용하는 경우 AJAX로 전송되는 토큰 2. 체크 진위 호출 : 사실 option.If 당신이 라인을 포함 할 수 없습니다 <% = hidden_field_tag ​​: authenticity_token, form_authenticity_token %> 형태의 블록을 withing에. 요청은 저장된 페이지로부터 전송되는 경우 3. 사용 단편 캐싱 요청 예컨대 전송 페이지의 일부를 제외 할 button_to 등 다른 오래된 / 잘못된 것 토큰.

    (레일 4에 관한)이 오류에 대한 몇 가지 원인이있다. 1. 페이지 레이아웃 본 <%는 csrf_meta_tags % =>을 리모컨으로 도우미 form_for 사용하는 경우 AJAX로 전송되는 토큰 2. 체크 진위 호출 : 사실 option.If 당신이 라인을 포함 할 수 없습니다 <% = hidden_field_tag ​​: authenticity_token, form_authenticity_token %> 형태의 블록을 withing에. 요청은 저장된 페이지로부터 전송되는 경우 3. 사용 단편 캐싱 요청 예컨대 전송 페이지의 일부를 제외 할 button_to 등 다른 오래된 / 잘못된 것 토큰.

    나는 무효화 CSRF 보호를 피하게되는 것입니다 ...

  4. ==============================

    4.단지 형태로 authenticity_token을 추가하는 것은 나를 위해 그것을 해결했습니다.

    단지 형태로 authenticity_token을 추가하는 것은 나를 위해 그것을 해결했습니다.

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

    5.요청을 증명하기 위해보기에 생성 된 임의의 값입니다 토큰 진위는하지 다른 곳 귀하의 사이트에 양식에서 제출됩니다. 이 CSRF 공격으로부터 보호합니다

    요청을 증명하기 위해보기에 생성 된 임의의 값입니다 토큰 진위는하지 다른 곳 귀하의 사이트에 양식에서 제출됩니다. 이 CSRF 공격으로부터 보호합니다

    http://en.wikipedia.org/wiki/Cross-site_request_forgery

    그들이 당신의 의견을로드하지 않고 사이트를 사용하는 것처럼 그 클라이언트 / IP는, 보이는 사람 있는지 확인합니다.

    레일 정품 토큰 이해 : 당신이 더 디버깅해야하는 경우,이 질문은 시작하기에 좋은 장소입니다

    설명 편집 :  그것은 그들이 양식이 이제까지 당신의 웹 사이트에서 양식을 렌더링없이 제출 처리하기 위해 조치를 호출하는 것을 의미한다. 이것은 (스팸 덧글을 게시 말한다) 악성이 될 수 또는 직접 웹 서비스 API를 사용하려는 고객을 나타낼 수 있습니다. 당신은 당신의 제품 및 귀하의 요청을 분석하는 자연이 대답 할 수있는 유일한 사람입니다.

  6. ==============================

    6.너무 늦게 대답 그러나 나는 해결책을 발견합니다.

    너무 늦게 대답 그러나 나는 해결책을 발견합니다.

    당신은 당신에게 자신의 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 필드를 추가하거나 사용보다는, 제거 다운 그레이드하거나 업그레이드 레일 양식 헬퍼 레일합니다.

  7. ==============================

    7.ActionController :: InvalidAuthenticityToken 또한 잘못 리버스 프록시 발생할 수 있습니다. 스택 추적, 당신이 요청 BASE_URL 일치하지 않는 요청 기원처럼 보이는 라인을 얻을 경우에 해당합니다.

    ActionController :: InvalidAuthenticityToken 또한 잘못 리버스 프록시 발생할 수 있습니다. 스택 추적, 당신이 요청 BASE_URL 일치하지 않는 요청 기원처럼 보이는 라인을 얻을 경우에 해당합니다.

    HTTPS 요청에 대한 수신기와 같은 리버스 프록시 (예 : nginx를)를 사용하여 전송하는 경우 요청 (예 : 레일 응용 프로그램 등) 백엔드 (더 구체적으로 : 랙) 백엔드에 암호화되지 않은 원래 클라이언트 요청에 대한 자세한 정보를 몇 가지 헤더를 기대 순서대로 처리 작업과 보안 조치 다양한을 적용 할 수 있습니다.

    더 자세한 내용은 여기를 사용할 수 있습니다 https://github.com/rails/rails/issues/22965합니다.

    TL; DR은 : 용액 일부 헤더를 추가 할 수있다 :

    upstream myapp {
      server              unix:///path/to/puma.sock;
    }
    ...
    location / {
      proxy_pass        http://myapp;
      proxy_set_header  Host $host;
      proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header  X-Forwarded-Proto $scheme;
      proxy_set_header  X-Forwarded-Ssl on; # Optional
      proxy_set_header  X-Forwarded-Port $server_port;
      proxy_set_header  X-Forwarded-Host $host;
    }
    
  8. ==============================

    8.당신은 레이크 레일 수행 한 경우 : 업데이 트를하거나 최근 브라우저에서 기존 쿠키의 사용자 설정 / 초기화 / session_store.rb이 될 수있는 증상을 변경했습니다. 희망이는 개발 / 테스트 (나를 위해이었다)에서 수행되고, 당신은 문제의 도메인에 관련된 모든 브라우저 쿠키를 지울 수 있습니다.

    당신은 레이크 레일 수행 한 경우 : 업데이 트를하거나 최근 브라우저에서 기존 쿠키의 사용자 설정 / 초기화 / session_store.rb이 될 수있는 증상을 변경했습니다. 희망이는 개발 / 테스트 (나를 위해이었다)에서 수행되고, 당신은 문제의 도메인에 관련된 모든 브라우저 쿠키를 지울 수 있습니다.

    이 생산에, 당신은 키 변경 한 경우, 기존의 쿠키 (- 단지 추측을 <)를 사용하도록 다시 변경하는 것이 좋습니다.

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

    9.나는 자바 스크립트 호출이 문제를 가지고 있었다. 내가 application.js 파일에 단지 필요 jquery_ujs와 그 고정.

    나는 자바 스크립트 호출이 문제를 가지고 있었다. 내가 application.js 파일에 단지 필요 jquery_ujs와 그 고정.

  10. ==============================

    10.우리는 같은 문제를했지만, 그것은 단지 HTTP를 사용하여 요청을했다 것으로 나타났습니다 : //가 아닌 https로 : //. 원인은 안전했다 : 사실 session_store을 위해 :

    우리는 같은 문제를했지만, 그것은 단지 HTTP를 사용하여 요청을했다 것으로 나타났습니다 : //가 아닌 https로 : //. 원인은 안전했다 : 사실 session_store을 위해 :

    Rails.application.config.session_store(
      :cookie_store,
      key: '_foo_session',
      domain: '.example.com',
      secure: true
    )
    

    사방 ~ HTTPS를 사용하여 고정 :)

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

    11.레일 (5)의 경우, 더 추가 protect_from_forgery의 앞에 추가하십시오 verify_authentication_token를 생략하는 것보다 진실

    레일 (5)의 경우, 더 추가 protect_from_forgery의 앞에 추가하십시오 verify_authentication_token를 생략하는 것보다 진실

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

    12.나는이 문제를 가지고 내가 복사하고 내 응용 프로그램에 컨트롤러를 붙여 때문에 이유였다. 나는와 ApplicationController에와 ApplicationController을 변경해야 :: 자료

    나는이 문제를 가지고 내가 복사하고 내 응용 프로그램에 컨트롤러를 붙여 때문에 이유였다. 나는와 ApplicationController에와 ApplicationController을 변경해야 :: 자료

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

    13.나는 로컬 호스트에 동일한 문제가 있었다. 나는 응용 프로그램에 대한 도메인을 변경하지만, URL 및 호스트 파일에 여전히 이전 도메인이 있었다있다. 업데이트 된 브라우저 북마크 및 호스트는 새 도메인을 사용하여 파일을 지금 다 잘 작동합니다.

    나는 로컬 호스트에 동일한 문제가 있었다. 나는 응용 프로그램에 대한 도메인을 변경하지만, URL 및 호스트 파일에 여전히 이전 도메인이 있었다있다. 업데이트 된 브라우저 북마크 및 호스트는 새 도메인을 사용하여 파일을 지금 다 잘 작동합니다.

  14. ==============================

    14.아마 당신은 HTTPS에 대한 귀하의 nginx 설정을 가지고 있지만 당신의 인증서가 잘못? 나는 과거에 비슷한 문제가 있었다 및 문제 해결 http에서 https로 리디렉션했습니다

    아마 당신은 HTTPS에 대한 귀하의 nginx 설정을 가지고 있지만 당신의 인증서가 잘못? 나는 과거에 비슷한 문제가 있었다 및 문제 해결 http에서 https로 리디렉션했습니다

  15. ==============================

    15.나는 나를 위해 <% = csrf_meta_tags %> 브라우저에서 현재와 청산 쿠키 근무하는 체크했다.

    나는 나를 위해 <% = csrf_meta_tags %> 브라우저에서 현재와 청산 쿠키 근무하는 체크했다.

  16. ==============================

    16.빠른 애플리케이션로드를위한 크롬 등의 권고에 따라, 내 자바 스크립트를 asynced있다 :

    빠른 애플리케이션로드를위한 크롬 등의 권고에 따라, 내 자바 스크립트를 asynced있다 :

    전경 / 레이아웃 / application.html.erb

    <%= javascript_include_tag 'application', 'data-turbolinks-track' => 'reload', async: true %>
    

    내 원격 양식이 파산 모든 것을 얻은 그 토큰 오류입니다. 제거 비동기은 : 사실 문제를 해결.

  17. ==============================

    17.더하다

    더하다

    //= require rails-ujs 
    

    \app\assets\javascripts\application.js
    
  18. ==============================

    18.이 답변은 Ruby on Rails에 훨씬 더 구체적이다, 그러나 희망은 사람을 도움이 될 것입니다.

    이 답변은 Ruby on Rails에 훨씬 더 구체적이다, 그러나 희망은 사람을 도움이 될 것입니다.

    당신은 모든 비 GET 요청과 토큰 CSRF를 포함해야합니다. 당신이 jQuery를 사용하는 데 사용하는 경우, 레일은 그 위에 구축하고 몇 가지 숨겨진 기능을 추가 JQuery와 - UJS라는 헬퍼 라이브러리를 가지고있다. 이, 실행하는 것 중 하나는 자동적으로 모든 Ajax 요청에 토큰 CSRF이 포함되어 있습니다. 여길 봐.

    내가 그랬던 것처럼 당신이 그것에서 멀리 전환 할 경우이 오류와 함께 자신을 찾을 수 있습니다. 당신은 토큰을 수동으로 제출하거나 DOM에서 토큰 도움 스크랩 또 다른 라이브러리를 사용할 수 있습니다. 자세한 내용은이 게시물을 참조하십시오.

  19. ==============================

    19.레일 5에서, 우리는 코드의 2 개 라인을 추가 할 필요가

    레일 5에서, 우리는 코드의 2 개 라인을 추가 할 필요가

        skip_before_action :verify_authenticity_token
        protect_from_forgery prepend: true, with: :exception
    
  20. ==============================

    20.설치

    설치

    gem 'remotipart' 
    

    도울 수있다

  21. ==============================

    21.문제점 2.3.8 2.3.5에서 다운 그레이드함으로써 해결했다. (물론 악명 높은만큼 '당신은 리디렉션되고있다.'문제)

    문제점 2.3.8 2.3.5에서 다운 그레이드함으로써 해결했다. (물론 악명 높은만큼 '당신은 리디렉션되고있다.'문제)

  22. from https://stackoverflow.com/questions/3364492/actioncontrollerinvalidauthenticitytoken by cc-by-sa and MIT license