रेल 4 प्रामाणिकता टोकन


198

जब मैं कुछ प्रामाणिकता टोकन समस्याओं में भाग गया, तो मैं एक नई रेल्स 4 ऐप (रूबी 2.0.0-p0 पर) पर काम कर रहा था।

एक नियंत्रक लिखते समय जो कि json ( respond_toवर्ग विधि का उपयोग करके ) के लिए प्रतिक्रिया करता है , मुझे उस createकार्रवाई के लिए मिला, ActionController::InvalidAuthenticityTokenजब मैंने एक रिकॉर्ड का उपयोग करने का प्रयास करने के लिए अपवाद प्राप्त करना शुरू कर दिया curl

मैंने सुनिश्चित किया कि मैंने -H "Content-Type: application/json"डेटा सेट किया है और मैंने डेटा सेट किया है -d "<my data here>"लेकिन फिर भी कोई भाग्य नहीं है।

मैंने रेल्स 3.2 (रूबी 1.9.3 पर) का उपयोग करके एक ही नियंत्रक लिखने की कोशिश की और मुझे जो भी समस्याएँ मिलीं, उन्हें कोई प्रामाणिकता टोकन टोकन नहीं मिला। मैंने चारों ओर खोज की और मैंने देखा कि रेल में प्रामाणिक टोकन के साथ कुछ बदलाव थे। 4. जो मैं समझता हूं, वे अब स्वतः रूपों में सम्मिलित नहीं होते हैं? मुझे लगता है कि यह किसी भी तरह गैर-HTML सामग्री प्रकारों को प्रभावित कर रहा है।

क्या HTML फॉर्म का अनुरोध किए बिना इसके आसपास पहुंचने का कोई तरीका है, प्रामाणिकता टोकन को छीनना, फिर उस टोकन के साथ एक और अनुरोध करना? या मैं पूरी तरह से कुछ याद कर रहा हूँ जो पूरी तरह से स्पष्ट है?

संपादित करें: मैंने बस एक नई रेल 4 ऐप में एक नया रिकॉर्ड बनाने की कोशिश की, जिसमें बिना किसी बदलाव के एक मचान का उपयोग किया गया है और मैं उसी समस्या में चल रहा हूं, इसलिए मुझे लगता है कि मैंने ऐसा कुछ नहीं किया है।

जवाबों:


277

मुझे लगता है कि मैंने इसे समझ लिया है। मैंने (नया) डिफ़ॉल्ट बदल दिया है

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

20
आप इसे हटा सकते हैं: विकल्प के साथ एक साथ,: null_session डिफ़ॉल्ट है: api.rubyonrails.org/classes/ActionController/…
Casey

6
क्या JSON कॉल (उर्फ एपीआई कॉल) के लिए गैर-JSON कॉल और अशक्त सत्र के लिए अपवाद का उपयोग करने का कोई तरीका है?
जेम्स मैकमोहन

@JamesMcMahon आप अपना स्वयं का लिखने में सक्षम हो सकते हैं before_actionजो प्रारूप की जाँच करता है और अनुरोध सत्यापित है या नहीं। मुझे परिस्थितियों को निर्धारित करने के लिए किसी भी तरह से निर्मित नहीं है।
एलेक्सकोको

1
4.1.6 रेल में, मुझे skip_before_action :verify_authenticity_tokenअपने एपीआई के एप्लिकेशन कंट्रोलर पर यह काम करने के लिए निर्दिष्ट करना पड़ा ।
वसीम

1
आपको :verify_authenticy_tokenरेल 4.2 में किसी भी अधिक को अक्षम नहीं करना चाहिए । यह चूक करता है :null_session, जो, जैसा कि नाम से ही स्पष्ट है, बस आपको एक सत्र के बिना एक अनुरोध देता है। आप इसके बजाय एपीआई कुंजी के माध्यम से अनुरोध को सत्यापित कर सकते हैं।
लोबाती

72

सीएसआरएफ सुरक्षा बंद करने के बजाय, फ़ॉर्म में कोड की निम्न पंक्ति जोड़ना बेहतर है

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

और यदि आप फॉर्म जनरेट करने के लिए form_for या form_tag का उपयोग कर रहे हैं, तो यह स्वचालित रूप से कोड की उपरोक्त रेखा को फॉर्म में जोड़ देगा


9
यदि आप एक फॉर्म बना रहे हैं तो यह अच्छी सलाह है, लेकिन सवाल JSON का उपयोग करके एपीआई कॉल करने का जिक्र है।
जेम्स मैकमोहन

1
हालांकि धन्यवाद, इसने एक सवाल का जवाब दिया जिसमें मैंने हैंडलबार का उपयोग करते हुए एक कोड लिखने के बारे में था!
डेविड रौतेन

70

निम्नलिखित लाइन को मेरे लिए काम करने वाले फॉर्म में जोड़ना:

<%= hidden_field_tag :authenticity_token, form_authenticity_token %>

12
वास्तव में एपीआई कॉल पर लागू नहीं होता है
16

2
मेरे मामले में, मैं Rails4 का उपयोग कर रहा हूं। मैं सबमिट बटन पर क्लिक करके फॉर्म जमा कर सकता हूं। लेकिन अगर मैं JS कोड के माध्यम से फॉर्म जमा करता हूं, तो यह त्रुटि होती है। और इस जवाब ने मेरे लिए समस्या तय कर दी।
क्रिस। ज़ू

2
मेरी रेल 4.0.8 आधारित ऐप के लिए यह लिखने के लिए =token_tag nilया (.erb) के लिए पर्याप्त था<%= token_tag nil %>
jmarceli

1
आप शून्य पर टोकन सेट करके प्रमाणीकरण को अक्षम कर रहे हैं?
कार्लोस

क्या ऐसा करना सुरक्षित है?
एन्जिल गार्सिया

33

मुझे नहीं लगता कि आम तौर पर CSRF सुरक्षा को बंद करना अच्छा है जब तक कि आप विशेष रूप से एक एपीआई को लागू नहीं करते हैं।

जब ActionController के लिए रेल 4 एपीआई प्रलेखन को देखते हुए मैंने पाया कि आप प्रति नियंत्रक या प्रति विधि आधार पर जालसाजी संरक्षण को बंद कर सकते हैं।

उदाहरण के लिए CSRF सुरक्षा को उन विधियों के लिए बंद करें जिनका आप उपयोग कर सकते हैं

class FooController < ApplicationController
  protect_from_forgery except: :index

यह मेरे लिए रेल 4 में था - त्रुटि को हटाने के प्रयास के बाद फेंका जा रहा है। ^ ^
शून्य_कूल

9

एक ही समस्या के पार आया। इसे मेरे नियंत्रक में जोड़कर तय किया:

      skip_before_filter :verify_authenticity_token, if: :json_request?

अपरिभाषित विधि `json_request? ' # <SettingsController: 0x000000030a54a8> के लिए, कोई विचार?
डीनो

आपको वहां एक विधि को परिभाषित करना होगा जैसे: def json_request? request.format.json? अंत
जय कुमार राजपूत

7

क्या आप ने कोशिश की?

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

4

यह आधिकारिक डॉक - एपी के लिए जालसाजी संरक्षण को ठीक से बंद करने के बारे में बात करता है http://api.rubyonrails.org/classes/ActionController/RequestForgeryProtection.html


1
यह सच है, लेकिन जवाब 2013 से है - और चीजें बदल जाती हैं। और जब आपका आधिकारिक तौर पर स्वीकार किया गया उत्तर अच्छा है - मेरा लिंक सीधे विषय के गहन अवलोकन में बेहतर है
konung


2

इन सुविधाओं को सुरक्षा और जालसाजी संरक्षण उद्देश्यों के लिए जोड़ा गया था।
हालांकि, आपके प्रश्न का उत्तर देने के लिए, यहां कुछ इनपुट दिए गए हैं। आप नियंत्रक नाम के बाद इन पंक्तियों को जोड़ सकते हैं।

इस तरह,

class NameController < ApplicationController
    skip_before_action :verify_authenticity_token

यहाँ रेल के विभिन्न संस्करणों के लिए कुछ पंक्तियाँ दी गई हैं।

रेल 3

Skip_before_filter: verify_authenticity_token

रेल 4 :

Skip_before_action: Ver_authenticity_token


क्या आपको सभी नियंत्रक रूटीन के लिए इस सुरक्षा सुविधा को अक्षम करने का इरादा है, तो आप अपने application_controller.rb फ़ाइल पर protect_from_forgery से : null_session का मान बदल सकते हैं ।

इस तरह,

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

1

यदि आप रेल के साथ jQuery का उपयोग कर रहे हैं, तो प्रामाणिकता टोकन को सत्यापित किए बिना विधियों में प्रवेश की अनुमति देने से सावधान रहें।

jquery-ujs आपके लिए टोकन प्रबंधित कर सकते हैं

आपके पास पहले से ही jquery-rails रत्न के हिस्से के रूप में होना चाहिए, लेकिन आपको इसे application.js में शामिल करना होगा

//= require jquery_ujs

आपको बस इतना ही चाहिए - आपका अजाक्स कॉल अब काम करना चाहिए

अधिक जानकारी के लिए, देखें: https://github.com/rails/jquery-ujs



0

जब आप अपने स्वयं के 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>

तो समस्या का समाधान या तो प्रामाणिकता_टोकन फ़ील्ड को जोड़ना है या रेल के रूप में सहायक का उपयोग करना है बल्कि सुरक्षा से समझौता करना है आदि।


1
आपके उत्तर के लिए धन्यवाद, हालांकि यह मूल प्रश्न का उत्तर नहीं देता है। JSON के अनुरोधों का जवाब देने के बारे में पूछे गए प्रश्न पर आप एक स्क्रैच HTML फॉर्म के लिए एक समाधान प्रदान कर रहे हैं। JSON अनुरोध करते समय (लगता है कि एपीआई) आप एक HTML फॉर्म जमा नहीं कर रहे हैं और आपके पास प्रामाणिक टोकन तक आसान पहुंच नहीं हो सकती है।
एलेक्साको

जब तक अनुरोध की सामग्री वास्तव में JSON नहीं होती है, तब तक आप इसे किस स्थिति में सेट करना चाहते हैं application/json
एलेक्साको

मैं समझता हूं कि उत्तर वही नहीं है जो आप खोज रहे हैं। लेकिन संबंधित उत्तर डालने का उद्देश्य उपयोगकर्ताओं को समान "प्रामाणिकता मुद्दे" की तलाश में मदद करना है।
अमजद

क्षमा करें, मैंने गलती से हटा दिया - "आप सामग्री-प्रकार: एप्लिकेशन / x-www-form-urlencoded उपरोक्त समाधान के साथ सेट कर सकते हैं"।
अमजद

0

मेरे सभी परीक्षण ठीक काम कर रहे थे। लेकिन किसी कारण से मैंने अपने पर्यावरण चर को गैर-परीक्षण करने के लिए निर्धारित किया था:

export RAILS_ENV=something_non_test

मैं इस वेरिएबल को अनसेट करना भूल गया जिसकी वजह से मुझे ActionController::InvalidAuthenticityTokenअपवाद मिलना शुरू हो गया।

परेशान होने के बाद $RAILS_ENV, मेरे परीक्षणों ने फिर से काम करना शुरू कर दिया।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.