복붙노트

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

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

    2.널 세션을 렌더링하지 않습니다 CSRF 끄려면 또 다른 방법은 추가하는 것입니다 :

    널 세션을 렌더링하지 않습니다 CSRF 끄려면 또 다른 방법은 추가하는 것입니다 :

    skip_before_action :verify_authenticity_token
    

    당신의 레일 컨트롤러이다. 이것은 당신이 여전히 세션 정보에 액세스 할 수 있도록합니다.

    다시 말하지만, 당신은 단지 API 컨트롤러 또는 CSRF 보호가 확실히 적용되지 않는 다른 장소에서이 작업을 수행해야합니다.

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

    3.api.rubyonrails.org에 API 컨트롤러에 대한 CSRF의 구성에 대한 관련 정보가있다 :

    api.rubyonrails.org에 API 컨트롤러에 대한 CSRF의 구성에 대한 관련 정보가있다 :

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

    4.레일 5에서 당신은 또한에 :: 대신 :: 자료 API 새로운 클래스를 생성 할 수 있습니다 :

    레일 5에서 당신은 또한에 :: 대신 :: 자료 API 새로운 클래스를 생성 할 수 있습니다 :

    class ApiController < ActionController::API
    end
    
  5. ==============================

    5.당신은 샘플 컨트롤러의 샘플 작업을 제외하려면

    당신은 샘플 컨트롤러의 샘플 작업을 제외하려면

    class TestController < ApplicationController
      protect_from_forgery :except => [:sample]
    
      def sample
         render json: @hogehoge
      end
    end
    

    당신은 아무 문제없이 외부에서 요청을 처리 할 수 ​​있습니다.

  6. from https://stackoverflow.com/questions/35181340/rails-cant-verify-csrf-token-authenticity-when-making-a-post-request by cc-by-sa and MIT license