[RUBY-ON-RAILS] 레일 : POST 요청을 할 때 CSRF 토큰 진위를 확인할 수 없습니다
RUBY-ON-RAILS레일 : POST 요청을 할 때 CSRF 토큰 진위를 확인할 수 없습니다
나는이 같은 내 로컬 디바이스로 POST 요청을하려면 :
HTTParty.post('http://localhost:3000/fetch_heroku',
:body => {:type => 'product'},)
그러나 서버 콘솔에서 보고서
Started POST "/fetch_heroku" for 127.0.0.1 at 2016-02-03 23:33:39 +0800
ActiveRecord::SchemaMigration Load (0.0ms) SELECT "schema_migrations".* FROM "schema_migrations"
Processing by AdminController#fetch_heroku as */*
Parameters: {"type"=>"product"}
Can't verify CSRF token authenticity
Completed 422 Unprocessable Entity in 1ms
여기 내 컨트롤러 및 경로 설정은 매우 간단하다.
def fetch_heroku
if params[:type] == 'product'
flash[:alert] = 'Fetch Product From Heroku'
Heroku.get_product
end
end
post 'fetch_heroku' => 'admin#fetch_heroku'
나는 확실히 내가해야 할 일 아니에요? 것 확실히 작업을 CSRF를 끄고, 그러나 나는 이러한 API를 만들 때 내 실수해야한다고 생각합니다.
할 수있는 다른 설정 I 필요가 있는가?
해결법
-
==============================
1.크로스 사이트 요청 위조 (CSRF / XSRF)의 경우 북마크, iframe을 사용하거나 사용자를 바보 유사한 정도로 시각적 인 페이지를 생성하여, 예를 들어 것은 아니다 요청을 수행하기에 악의적 인 웹 페이지 트릭 사용자.
크로스 사이트 요청 위조 (CSRF / XSRF)의 경우 북마크, iframe을 사용하거나 사용자를 바보 유사한 정도로 시각적 인 페이지를 생성하여, 예를 들어 것은 아니다 요청을 수행하기에 악의적 인 웹 페이지 트릭 사용자.
레일즈 CSRF 보호 "고전"웹 응용 프로그램을 위해 만들어 - 단순히 요청이 자신의 웹 응용 프로그램에서 유래 보증의 정도를 제공합니다. CSRF에만 서버가 알고있는 비밀 같은 토큰 작품 - 레일이 세션에서 임의의 토큰 저장을 생성합니다. 양식은 숨겨진 입력을 통해 토큰을 보내고 아닌 GET 요청이 일치하는 것을 세션에 저장되어있는 토큰이 포함되어 있는지 확인 레일.
그러나하는 API가 정의 크로스 사이트에서 일반적으로 더 많은 웹 응용 프로그램보다 CSRF의 전체 개념이 확실히 적용되지 않는다고하는 수단에 사용되는 의미했다.
하지 자신의 응용 프로그램에서 - 대신 당신은 당신이 요청이 승인 된 API 클라이언트에서 제공되는지 확인하기 때문에 API 키와 암호를 사용하여 API 요청을 인증하는 토큰 기반 전략을 사용해야합니다.
당신은 @dcestari에 의해 지적 아웃으로 CSRF를 비활성화 할 수 있습니다 :
class ApiController < ActionController::Base protect_from_forgery with: :null_session end
업데이트. 레일 5에서 당신은 --api 옵션을 사용하여 API 전용 응용 프로그램을 생성 할 수 있습니다 :
rails new appname --api
그들은 CSRF 미들웨어 및 superflouus 많은 다른 구성 요소가 포함되어 있지 않습니다.
-
==============================
2.널 세션을 렌더링하지 않습니다 CSRF 끄려면 또 다른 방법은 추가하는 것입니다 :
널 세션을 렌더링하지 않습니다 CSRF 끄려면 또 다른 방법은 추가하는 것입니다 :
skip_before_action :verify_authenticity_token
당신의 레일 컨트롤러이다. 이것은 당신이 여전히 세션 정보에 액세스 할 수 있도록합니다.
다시 말하지만, 당신은 단지 API 컨트롤러 또는 CSRF 보호가 확실히 적용되지 않는 다른 장소에서이 작업을 수행해야합니다.
-
==============================
3.api.rubyonrails.org에 API 컨트롤러에 대한 CSRF의 구성에 대한 관련 정보가있다 :
api.rubyonrails.org에 API 컨트롤러에 대한 CSRF의 구성에 대한 관련 정보가있다 :
-
==============================
4.레일 5에서 당신은 또한에 :: 대신 :: 자료 API 새로운 클래스를 생성 할 수 있습니다 :
레일 5에서 당신은 또한에 :: 대신 :: 자료 API 새로운 클래스를 생성 할 수 있습니다 :
class ApiController < ActionController::API end
-
==============================
5.당신은 샘플 컨트롤러의 샘플 작업을 제외하려면
당신은 샘플 컨트롤러의 샘플 작업을 제외하려면
class TestController < ApplicationController protect_from_forgery :except => [:sample] def sample render json: @hogehoge end end
당신은 아무 문제없이 외부에서 요청을 처리 할 수 있습니다.
from https://stackoverflow.com/questions/35181340/rails-cant-verify-csrf-token-authenticity-when-making-a-post-request by cc-by-sa and MIT license
'RUBY-ON-RAILS' 카테고리의 다른 글
[RUBY-ON-RAILS] (우리가 이상적으로 도우미에서 전화로) 우리는보기에서 컨트롤러의 메소드를 호출 할 수 있습니까? (0) | 2020.02.24 |
---|---|
[RUBY-ON-RAILS] catch되지 않은 오류 ReferenceError : 정의되지 않은 반응 (0) | 2020.02.24 |
[RUBY-ON-RAILS] 레일 3 개발을위한 기본 URL 변경 (0) | 2020.02.24 |
[RUBY-ON-RAILS] 긴 delayed_job 작업은 Heroku가에 다시 시작하면 잠금이 유지 실행 (0) | 2020.02.24 |
[RUBY-ON-RAILS] 어떻게 레일에 대량 삽입을 구현하는 3 (0) | 2020.02.24 |