2012-02-04 18 views
11

हमारे रेल 3 एप्लिकेशन आरईएसटी कार्यों के रूप में उजागर किए गए अन्य रेल अनुप्रयोगों से बात करते हैं। हमें आरईएसटी सेवाओं में किए गए सभी पोस्ट कॉल पर रेल 3 पर निम्नलिखित चेतावनी पोस्ट माइग्रेशन मिलता है।रेल अनुप्रयोगों के बीच सीएसआरएफ टोकन को कैसे पास करें

WARNING: Can't verify CSRF token authenticity 

हम तार पर CSRF टोकन कैसे पास करना चाहिए जब हम बाकी सेवाओं के लिए एक पोस्ट कॉल करते हैं, ApplicationController विधि protect_from_forgery है और कॉल भी handle_unverified_request फोन पर भूमि। हम प्रमाणित करने के लिए HTTP मूल लेख का उपयोग करते हैं और ऐसा लगता है कि यह ठीक काम करता है। इस मुद्दे को हल करने के लिए हमें क्या करना चाहिए।

+0

दो अनुप्रयोगों के बैकएंड के बीच संचार है या क्या यह "फ्रंट एंड" उपयोगकर्ता के लिए आरईएसटी कार्यों को सीधे कॉल करने के लिए संभव है? – sled

+0

यूआई एक बटन एक्शन को आमंत्रित करता है, जो बदले में नियंत्रक को इस कॉल को आरईएसटी सेवा में जारी करने का कारण बनता है। नियंत्रक द्वारा – Sam

+0

का मतलब है कि एप्लिकेशन ए से रेल नियंत्रक आवेदन बी से नियंत्रक से अनुरोध करता है? – sled

उत्तर

9

ठीक है अब मैं इसे आपके प्रश्न का उत्तर देने के लिए एक शॉट दूंगा।

सीएसआरएफ टोकन "सत्र निर्भर" हैं इसका मतलब है कि उपयोगकर्ता को उस एप्लिकेशन के साथ एक सत्र साझा करना होगा जिसके साथ वह संचार कर रहा है। इसका मतलब यह है कि वह वास्तविक फॉर्म सबमिट करने से पहले एक अनुरोध किया जाना चाहिए जो मानक HTML फॉर्मों के मामले में है, जहां फॉर्म सबमिट होने से पहले प्रदर्शित होता है, इसलिए इस उपयोगकर्ता के लिए सीएसआरएफ टोकन उत्पन्न करने के लिए कमरा है।

चलिए यूआई बटन ऐप 1 और आरईएसटी सेवा ऐप 2 की मेजबानी करने वाले एप्लिकेशन को कॉल करते हैं।

उपयोगकर्ता एप 1 के साथ एक सत्र साझा करता है और एप 1 द्वारा प्रदान किया गया यूआई बटन प्राप्त करता है। एक बार जब उपयोगकर्ता बटन पर क्लिक करता है तो ऐप 1 का अनुरोध किया जाता है, और ऐप 1 ऐप 2 की आरईएसटी सेवा का अनुरोध करता है।

निष्कर्ष: उपयोगकर्ता ऐप 2 के साथ सत्र साझा नहीं करता है लेकिन आपके ऐप 1 में एप 2 के साथ एक सत्र है। यह दो बातों में निष्कर्ष निकाला है: क्योंकि वह उस सर्वर पर एक सत्र नहीं है

  1. उपयोगकर्ता App2 पर क्रॉस-साइट-जालसाजी की चपेट में नहीं है। तो अगर मैं <img src="http://app2.com/rest-service/destroy> जैसे कुछ पोस्ट करता हूं, तो ऐप 2 मुझे पहचान नहीं पाएगा क्योंकि मैं ऐप 2 के साथ सत्र साझा नहीं करता हूं और कुछ भी नहीं होता है।

  2. आप जनता से यह सुरक्षित करने के लिए बाकी सेवा पर अपनी खुद की सुरक्षा उपायों को लागू कर सकते हैं: एक API कुंजी

  3. द्वारा

    • HTTP मूल प्रमाणीकरण
    • प्रमाणीकरण द्वारा प्रमाणीकरण ....

इसका मतलब है आप बाकी सेवा पर CSRF संरक्षण ड्रॉप और एस पर रह सकते हैं afe ओर जब तक उपयोगकर्ता के रूप में AJAX आदि के माध्यम से प्रत्यक्ष कॉल नहीं कर सकता

अलावा

CSRF प्रस्तुत रूपों है कि अपने मूल से नहीं आते हैं (वास्तव में यह केवल के बाद से पोस्टेड रूपों के लिए लागू होता है से अपनी साइट की रक्षा करता है वे आमतौर पर डेटा में हेरफेर करते हैं।

बड़ा परिदृश्य है: मैं हमलावर हूं और मैं अपने उपयोगकर्ताओं के खाते का नाम "श्री पोटाटो" को अपडेट करना चाहता हूं, जिस तरह से मैं अपनी वेबसाइट पर एक छिपी हुई फॉर्म डालना चाहता हूं जो पोस्ट हो जाता है account[name]="Mr. Potatoe" जैसे छिपे हुए क्षेत्र के साथ Yourdomain.com/account पर। अब सीएसआरएफ सुरक्षा के बिना क्या होता है? मेरा ब्राउज़र फॉर्म सबमिट करता है, और इसके साथ प्रमाणीकरण कुकी भेजता है और मेरा नाम अब "श्री पोटाटो" है। सीएसआरएफ सुरक्षा के साथ क्या होता है? मेरे ब्राउज़र फॉर्म सबमिट करते हैं और कुकी भेजते हैं लेकिन फॉर्म में कोई सीएसआरएफ टोकन नहीं है इसलिए अनुरोध अस्वीकार कर दिया जाता है।अब इन परिस्थितियों में सीएसआरएफ टोकन पाने के लिए हमलावर के रूप में एक तरीका है? जवाब न है। शायद तुम अपने आप से पूछना ....

  • अगर मैं जो Yourdomain.com/account/edit की ओर इशारा करता है और बस छिपा टोकन युक्त क्षेत्र कॉपी अपनी साइट पर एक छिपा iframe जगह क्या? उत्तर: यह मूल उत्पत्ति नीति के कारण काम नहीं करेगा, अगर आप अपनी डोमेन से नहीं आते हैं तो आप iframe के अंदर क्या पढ़ सकते हैं।

  • यदि मैं टोकन प्राप्त करने के लिए पृष्ठभूमि में AJAX कॉल करता हूं तो क्या होगा? उत्तर: यह काम नहीं करेगा क्योंकि शुद्ध AJAX का उपयोग करके आप एक ही मूल नीति के लिए बाध्य हैं।

अब बात करने के लिए मिलता है: तुम्हारा अपने उपयोगकर्ता के लिए जो अपनी साइट पर है नुकसान पहुंचाने के लिए करने के लिए मैं अपने पृष्ठ से एक छिपा हुआ AJAX कॉल नहीं भेज सकते।

इसका क्या अर्थ है? आप पहले फ़िल्टर को कार्यान्वित कर सकते हैं जो जांचता है कि request.xhr? सत्य है या क्या उपयोगकर्ता एजेंट "मेरा रीस्ट क्लाइंट XY" जैसा कुछ है क्योंकि इसे किसी ब्राउज़र साइट < < में क्रॉस साइट अनुरोध द्वारा जाली नहीं जा सकती है। तो अगर ऐसा है तो आप सीएसआरएफ सुरक्षा को अनदेखा/अक्षम कर सकते हैं।

तरह से यदि आप अपनी साइट के भीतर एक AJAX अनुरोध आप CSRF प्राप्त कर सकते हैं बनाना चाहते द्वारा इस तरह टोकन: यह केवल सुरक्षा करता है: https://github.com/rails/jquery-ujs/blob/master/src/rails.js#L81

नोट:

var token = $('meta[name="csrf-token"]').attr('content'); 

रेल UJS स्क्रिप्ट देखें आप क्रॉस साइट जालसाजी से और कुछ भी नहीं ....

+0

उपयोगी। लेकिन क्या होगा यदि आरईएसटी सेवा को आरईएसटी सेवा और एचटीएमएल पृष्ठों के माध्यम से दोनों कहा जा सकता है? मान लें कि आप रूबी में रेल ऐप के खिलाफ परीक्षण लिख रहे हैं और पोस्टिंग फॉर्म का परीक्षण करने में सक्षम होना चाहते हैं लेकिन ऊपर वर्णित सीआरएसएफ विफलता हो रही है। ऐसा लगता है कि हमें एक सत्र प्राप्त करना है और पोस्ट के लिए वापस जाने के लिए सीएसआरएफ टोकन प्राप्त करना है। पर कैसे? परीक्षण मामले के लिए – Dad

+0

, ऐसा लगता है कि ऐसा कुछ उपयोगी हो सकता है: https://github.com/archiloque/rest-client क्योंकि यह किसी को कुकीज़ प्राप्त करने देता है जिसमें सीएसआरएफ टोकन होना चाहिए। (???) – Dad

+0

अफैक सीएसआरएफ टोकन को अनुभाग में टैग के रूप में फॉर्म टैग और definitley में छिपे हुए फ़ील्ड के रूप में एम्बेड किया गया है। – sled

संबंधित मुद्दे