ActionController :: InvalidAuthenticityToken


148

नीचे एक त्रुटि है, जो मेरे रेल एप्लिकेशन में एक फॉर्म के कारण है:

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):

यह हर गैर- getअनुरोध के लिए होता है और, जैसा कि आप देखते हैं, authenticity_tokenवहाँ है।

जवाबों:


207

मेरे पास एक ही मुद्दा था लेकिन उन पृष्ठों के साथ जो पृष्ठ कैश थे। पेज बासी प्रामाणिकता टोकन और सभी क्रियाओं के साथ बफर हो गए, जहां वे फर्जी प्रयासों के रूप में पहचाने गए पोस्ट / पुट / डिलीट के तरीकों का उपयोग करते हैं। उपयोगकर्ता को त्रुटि (422 Unprocessable Entity) वापस कर दी गई।

रेल 3 के लिए समाधान:
जोड़ें:

 skip_before_filter :verify_authenticity_token  

या "सागिवो" के रूप में रेल 4 में बताया गया है:

 skip_before_action :verify_authenticity_token

उन पृष्ठों पर जो कैशिंग करते हैं।

@Toobulkeh टिप्पणी की के रूप में इस पर एक जोखिम नहीं है :index, :showकार्यों, लेकिन यह का उपयोग कर सावधान रहना :put, :postकार्रवाई।

उदाहरण के लिए:

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

संदर्भ: http://api.rubyonrails.org/classes/ActionController/RequestForgeryProtection/ClassMethods.html

नोट barlop द्वारा जोड़ा गया- रेल्स 4.2 को deprecated Skip_before_filter के पक्ष में Skip_before_action https://guides.rubyonrails.org/4_2_release_notes.html "डाक्यूमेंट्स से हटा दिया गया है। उनका उपयोग * _action" के पक्ष में हतोत्साहित करता है। तरीकों का परिवार "

के लिए रेल 6 ( "के रूप में collimarco" ने कहा) आप उपयोग कर सकते हैं skip_forgery_protectionऔर यह एक REST API कि सत्र डेटा का उपयोग नहीं करता के लिए उपयोग करने के लिए सुरक्षित है।


3
ऐसी संभावना नहीं है, मुझे आपकी पोस्ट से पहले caches_page का पता नहीं था । लेकिन मैं caches_page की जाँच करूँगा , धन्यवाद।
निकिता रायबाक

7
रेल में 4skip_before_action :verify_authenticity_token
Sagiv

88
क्या यह भेद्यता नहीं है?
क्वांटम्पोटेटो

6
यह :index, :showकार्यों पर भेद्यता नहीं है । लेकिन इसे :put, :postकार्यों पर लगाने से सावधान रहें !
टोबुलकेह

14
हालाँकि मैं मानता हूँ कि आपके पास कभी-कभी ऐसा मामला होता है जहाँ इसकी आवश्यकता होती है (जैसे जीवनकाल में एक बार) लेकिन आपको यह महसूस करने की आवश्यकता है कि आप सुरक्षा को अक्षम करके सुरक्षा को ठीक कर रहे हैं। अनुशंसित नहीं
समतुल्य

77

मेरे लिए रेल 4 के तहत इस मुद्दे का कारण गायब था,

<%= csrf_meta_tags %>

मेरे मुख्य एप्लिकेशन लेआउट में रेखा। जब मैंने अपने लेआउट को फिर से लिखा तो मैंने गलती से इसे हटा दिया था।

यदि यह मुख्य लेआउट में नहीं है, तो आपको किसी भी पृष्ठ पर इसकी आवश्यकता होगी जिसे आप सीएसआरएफ टोकन चाहते हैं।


2
हमें यह त्रुटि भी मिल रही है। लेकिन यह दखल है। क्या यह कारण हो सकता है या यह त्रुटि के साथ हर अनुरोध को प्रभावित नहीं करेगा?
रयान-नील मेस

@ रयान-नीलम, यदि आपका टेम्पलेट उस पंक्ति को याद कर रहा है तो आपको त्रुटि मिलेगी। इसलिए यह संभव है कि आपके कुछ खाकों में यह हो और अन्य ऐसा न करें।
जेम्स मैकमोहन

1
@JamesMcMahon धन्यवाद, मुझे लगा कि मेरा मामला वास्तव में उपयोगकर्ताओं द्वारा अपने कुकीज़ साफ़ करने या कुकीज़ अवरुद्ध होने के कारण है। इस प्रश्न से भार सीखा!
रयान-नील मेस

61

इस त्रुटि के कई कारण हैं, (नियम 4 से संबंधित)।

1. <%= csrf_meta_tags %>पेज लेआउट में मौजूद चेक

। विकल्प के साथ form_forसहायक का उपयोग करने पर AJAX कॉल के साथ चेक ऑथेंटिसिटी टोकन भेजा जा रहा है। यदि remote: trueआप <%= hidden_field_tag :authenticity_token, form_authenticity_token %>प्रपत्र ब्लॉक के साथ लाइन को शामिल नहीं कर सकते हैं ।

3. यदि अनुरोध कैश्ड पृष्ठ से भेजा जा रहा है, तो पृष्ठ का वह भाग बाहर करने के लिए टुकड़ा कैशिंग का उपयोग करें जो अनुरोध भेजता है button_toआदि। अन्यथा टोकन बासी / अमान्य होगा।

मैं सीएसआरएफ सुरक्षा को कम करने के लिए अनिच्छुक होगा ...


csrf_meta_tags <head> में होना चाहिए? मैं यह कैसे सुनिश्चित कर सकता हूं कि यह टर्बोलिंक के साथ संघर्ष नहीं करता है?
स्पार्कल

37

बस authenticity_tokenफॉर्म में जोड़कर इसे मेरे लिए तय किया।

<%= hidden_field_tag :authenticity_token, form_authenticity_token %>

3
रेल डिफ़ॉल्ट रूप से टोकन भेजने के लिए माना जाता है। हम इसे स्पष्ट रूप से निर्दिष्ट नहीं करना चाहते हैं। मुझे लगता है कि इस स्थिति में टोकन को किसी तरह बदल दिया जाता है।
अभि

1
हालाँकि, यदि आपने सहायकों का उपयोग नहीं करते हुए अपना फॉर्म बनाया है, तो आपको इसे मैन्युअल रूप से रखना चाहिए।
आंद्रे गुइमारेस सकटा

30

प्रामाणिकता टोकन एक दृश्य में उत्पन्न एक यादृच्छिक मूल्य है जो यह साबित करने के लिए अनुरोध करता है कि आपकी साइट पर एक फ़ॉर्म से सबमिट किया गया है, कहीं और नहीं। यह CSRF हमलों से बचाता है:

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

यह देखने के लिए जांचें कि कौन ग्राहक / आईपी है, ऐसा लगता है कि वे आपके विचारों को लोड किए बिना आपकी साइट का उपयोग कर रहे हैं।

यदि आपको आगे डिबग करने की आवश्यकता है, तो यह सवाल शुरू करने के लिए एक अच्छी जगह है: रेल प्रामाणिकता टोकन को समझना

समझाने के लिए संपादित: इसका मतलब है कि वे आपकी फॉर्म सबमिट करने की कार्रवाई को आपकी वेबसाइट पर आपके फॉर्म को प्रस्तुत किए बिना बुला रहे हैं। यह दुर्भावनापूर्ण हो सकता है (जैसे स्पैम टिप्पणियाँ पोस्ट करना) या यह एक ग्राहक को आपकी वेब सेवा API का सीधे उपयोग करने का प्रयास करने का संकेत दे सकता है। आप केवल एक हैं जो आपके उत्पाद की प्रकृति और आपके अनुरोधों का विश्लेषण करके उत्तर दे सकते हैं।


1
धन्यवाद, लेकिन मुझे पहले से ही पता है कि प्रामाणिकता टोकन क्या है। यह देखने के लिए जांचें कि कौन ग्राहक / आईपी है, ऐसा लगता है कि वे आपके विचारों को लोड किए बिना आपकी साइट का उपयोग कर रहे हैं। क्षमा करें, "लोडिंग विचारों के बिना" का क्या अर्थ है?
निकिता रायबाक

1
मेरा मतलब है कि आपके एप्लिकेशन के उपयोगकर्ता इंटरफ़ेस से गुजरे बिना कोई व्यक्ति (संभवत: एक स्पैमर) आपके फ़ॉर्म में डेटा जमा कर सकता है। उदाहरण के लिए, कर्ल जैसे कमांड लाइन प्रोग्राम का उपयोग करके ऐसा करना संभव है।
जॉन टॉपले जूल

जॉन के पास यह बिल्कुल सही है। इसका अर्थ है कि वे आपकी फ़ॉर्म सबमिट करने की कार्रवाई को आपकी वेबसाइट पर आपके फ़ॉर्म को प्रस्तुत किए बिना कॉल कर रहे हैं। यह दुर्भावनापूर्ण हो सकता है (जैसे स्पैम टिप्पणियाँ पोस्ट करना) या यह एक ग्राहक को आपकी वेब सेवा API का सीधे उपयोग करने का प्रयास करने का संकेत दे सकता है। आप केवल एक हैं जो आपके उत्पाद की प्रकृति और आपके अनुरोधों का विश्लेषण करके उत्तर दे सकते हैं।
विनफील्ड

ठीक है, मैंने विनफील्ड की टिप्पणी को गलत समझा। मुझे लगा कि जब मैं ब्राउज़र का उपयोग करता हूं तो ऐप किसी तरह 'मेरे विचार लोड करने' के लिए कॉन्फ़िगर नहीं किया गया था।
निकिता रायबाक

1
मेरे पास एक और विचार भी था, इन अनुरोधों में एक टोकन शामिल है, लेकिन यह मान्य नहीं है। यह आपके प्रपत्र को प्रस्तुत करने वाले पृष्ठ को कैशिंग करने या कुछ और के कारण हो सकता है, जो संभावित रूप से बासी संस्करण का कारण बनता है।
विनफील्ड

26

ActionController::InvalidAuthenticityTokenगलत रूपांतरण वाले प्रॉक्सी के कारण भी हो सकता है। यह मामला है यदि स्टैक ट्रेस में, तो आपको एक रेखा दिखती है Request origin does not match request base_url

HTTPS अनुरोध के लिए रिसीवर के रूप में एक रिवर्स प्रॉक्सी (जैसे नेग्नेक्स) का उपयोग करते समय, बैकएंड के लिए अनएन्क्रिप्टेड अनुरोध (जैसे रेल एप्लिकेशन) को प्रसारित करना, बैकएंड (अधिक विशेष रूप से: रैक) कुछ हेडर से मूल ग्राहक अनुरोध के बारे में अधिक जानकारी की अपेक्षा करता है। विभिन्न प्रसंस्करण कार्यों और सुरक्षा उपायों को लागू करने में सक्षम होने के लिए।

अधिक जानकारी यहां उपलब्ध हैं: https://github.com/rails/rails/issues/22965

टीएल; डीआर: समाधान कुछ हेडर जोड़ने के लिए है:

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;
}

वाह, मैं इस के लिए एक समाधान के लिए 3 घंटे खोज रहा हूँ, और यह था, धन्यवाद!
evexoio

रेल की ओर से इसे हल करने के लिए 6 घंटे का बहुत-बहुत धन्यवाद
जो हाफ फेस

18

जवाब देने में बहुत देर हो गई लेकिन मुझे इसका हल मिल गया।

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

तो समस्या का हल या तो प्रामाणिकता_टोकन फ़ील्ड को जोड़ने के लिए है या रेल फ़ॉर्म हेल्पर्स का उपयोग करना है बल्कि फिर हटाने, डाउनग्रेड करना या रेल को अपग्रेड करना है।


9

यदि आपने rake rails:updateहाल ही में अपना परिवर्तन किया है config/initializers/session_store.rb, तो यह ब्राउज़र में पुराने कुकीज़ का एक लक्षण हो सकता है। उम्मीद है कि यह देव / परीक्षण (यह मेरे लिए था) में किया गया है, और आप प्रश्न में डोमेन से संबंधित सभी ब्राउज़र कुकीज़ को बस साफ़ कर सकते हैं।

यदि यह उत्पादन में है, और आप बदल गए key, तो पुराने कुकीज़ (<- सिर्फ अटकलें) का उपयोग करने के लिए इसे वापस बदलने पर विचार करें।


हाँ! मेरे लिए, खाली session_store.rb होने से त्रुटि हो रही थी।
दोपहर

6

मेरे पास जावास्क्रिप्ट कॉल के साथ यह समस्या थी। मैंने तय किया कि आवेदन.जेएस फ़ाइल में सिर्फ jquery_ujs की आवश्यकता के साथ।


हाँ सही है, मेरे पास भी यह मुद्दा था और मैंने आवेदन js में jquery_ujs जोड़ा। इसने काम कर दिया।
अभि

3

हमें एक ही समस्या थी, लेकिन ध्यान दिया कि यह केवल http: // का उपयोग करने के अनुरोधों के लिए था और https: // के साथ नहीं। इसका कारण secure: truesession_store के लिए था :

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

हर जगह HTTPS ~ का उपयोग करके तय किया :)


जब rails sमैंने विकास के लिए SSL समापन बिंदु की जगह (गैर-एसएसएल) का उपयोग किया तो मुझे इसका सामना करना पड़ा । यह तब तक नहीं था जब तक मैंने आपकी टिप्पणी को नहीं पढ़ा कि मुझे एहसास हुआ कि मैं क्या कर रहा था। एक बार जब मैंने एसएसएल का उपयोग करने के लिए वापस स्विच किया, तो चीजें फिर से काम करने लगीं। धन्यवाद!
कार्ल विल्बर

1
मैंने विकास में इस मुद्दे का सामना किया। इसके बजाय secure: trueमैंने लिखाsecure: !Rails.env.development?
फोड़ो

1

रेल 5 के लिए, इसे protect_from_forgery prepend: trueछोड़ना बेहतर हैverify_authentication_token


5
क्यों? क्या आप एक संदर्भ जोड़ सकते हैं?
kwerle


0

मुझे यह समस्या थी और इसका कारण यह था कि मैंने अपने ऐप में एक नियंत्रक को कॉपी और पेस्ट किया था। मुझे बदलने की जरूरत ApplicationControllerहैApplicationController::Base


0

लोकलहोस्ट पर मेरा यही मुद्दा था। मैंने एप्लिकेशन के लिए डोमेन बदल दिया है, लेकिन URL और होस्ट फ़ाइल में अभी भी पुराना डोमेन था। नए डोमेन का उपयोग करने के लिए मेरे ब्राउज़र बुकमार्क और होस्ट फ़ाइल को अपडेट किया और अब सब कुछ ठीक काम करता है।


0

हो सकता है कि आपके पास HTTPS के लिए अपना NGINX सेटअप हो लेकिन आपके प्रमाणपत्र अमान्य हैं? मुझे अतीत में इसी तरह की समस्या हुई है और http से https तक पुनर्निर्देशन से समस्या हल हो गई है


0

मैंने जाँच की है <% = csrf_meta_tags%> मौजूद हैं और ब्राउज़र में कुकीज़ साफ़ करना मेरे लिए काम कर रहा है।


0

तेजी से एप्लिकेशन लोड के लिए क्रोम लाइटहाउस की सिफारिशों का पालन करना, मैंने अपनी जावास्क्रिप्ट पर भरोसा किया है:

views/layout/application.html.erb

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

इससे सब कुछ टूट गया और मेरे दूरस्थ रूपों के लिए वह टोकन त्रुटि हो गई। हटाने async: trueसमस्या तय।


0

यह उत्तर रूबी ऑन रेल्स के लिए बहुत अधिक विशिष्ट है, लेकिन उम्मीद है कि यह किसी की मदद करेगा।

आपको हर गैर-जीईटी अनुरोध के साथ सीएसआरएफ टोकन शामिल करने की आवश्यकता है। यदि आप JQuery का उपयोग करने के लिए उपयोग किए जाते हैं, तो रेल में एक सहायक पुस्तकालय होता है, जिसे jquery-ujsइसके शीर्ष पर बनाया जाता है और कुछ छिपी हुई कार्यक्षमता को जोड़ता है। इसमें से एक चीज़ अपने आप होती है जिसमें CSRF टोकन हर ajaxअनुरोध में शामिल होता है । यहाँ देखें

यदि आप इससे दूर जाते हैं जैसे मैंने किया तो आप खुद को एक त्रुटि के साथ पा सकते हैं। आप डोम से केवल टोकन को मैन्युअल रूप से सबमिट कर सकते हैं या अन्य लाइब्रेरी का उपयोग कर सकते हैं। अधिक विस्तार के लिए इस पोस्ट को देखें ।


-1

रेल 5 में, हमें कोड की 2 लाइनें जोड़ने की आवश्यकता है

    skip_before_action :verify_authenticity_token
    protect_from_forgery prepend: true, with: :exception

-2

स्थापित कर रहा है

gem 'remotipart' 

मदद कर सकते है


3
हालांकि यह उत्तर हो सकता है, लेकिन इसका उत्तर के आवश्यक भाग को शामिल करने और यह समझाने में मददगार है कि यह क्यों / कैसे काम करता है।
रॉय ली

-15

2.3.8 से 2.3.5 पर अपग्रेड करके समस्या हल की गई। (साथ ही बदनाम 'आपको पुनर्निर्देशित किया जा रहा है।')


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