2015-12-10 12 views
5

में protect_from_forgery का सही उपयोग मैं एक रेल 4 ऐप विकसित कर रहा हूं जो एक एपीआई के माध्यम से मोबाइल ऐप परोसता है, और एप्लिकेशन के प्रबंधन के लिए व्यवस्थापक के लिए एक वेब यूआई है। ऐसे कुछ वेब पेज भी हैं जो उपयोगकर्ता देखेंगे (सफल ई-मेल पुष्टिकरण और पासवर्ड रीसेट करें)।रेल ऐप सेवारत वेब और एपीआई

मैंने नियंत्रकों के दो सेट बनाए: एक सेट एपीआईसींट्रोलर से विरासत में मिलता है, और दूसरा AdminController से मिलता है। इन दोनों को एप्लिकेशन नियंत्रक से प्राप्त होता है। वेब पेजों का सामना करने वाले उपयोगकर्ता के लिए ज़िम्मेदार शेष नियंत्रक भी एप्लिकेशन नियंत्रक से विरासत में मिलता है।

इस योजना को देखते हुए, मैं सुरक्षित हूं कि सुरक्षा_from_forgery के साथ सीएसआरएफ सुरक्षा को सही ढंग से कैसे कार्यान्वित किया जाए। मेरे पास वर्तमान में निम्नलिखित है:

class ApplicationController < ActionController::Base 
    # ... 
end 

module API 
    class APIController < ApplicationController 
    protect_from_forgery with: :null_session, if: Proc.new { |c| c.request.format == 'application/json' } 
    # ... 
    end 
end 

module Admin 
    class AdminController < ApplicationController 
    protect_from_forgery with: :exception 
    # ... 
    end 
end 

class UsersController < ApplicationController 
    protect_from_forgery with: :exception 
    # ... 
end 

तो मेरा प्रश्न है: क्या यह सही है? क्या इसे सुधारने का कोई तरीका है? क्या सभी एपीआई अनुरोधों के बाद से एपीकंट्रोलर पॉइंटलेस में चेक केवल जेएसओएन होगा?

ब्रैकमैन ने शिकायत की कि एप्लिकेशन नियंत्रक में कोई सुरक्षा_फ्रॉम_फोररी कॉल नहीं है, लेकिन हो सकता है कि यह सबक्लास में कॉल न दिखाई दे।

अग्रिम धन्यवाद!

उत्तर

2

आप here, on their (brakeman) Github page कि यह ApplicationController पर उपस्थिति के लिए जाँच करता है देख सकते हैं केवल

आपका व्यवस्थापक और उपयोगकर्ता नियंत्रकों protect_from_forgery with: :exception

protect_from_forgery के लिए ऑन रेल्स 4 डिफ़ॉल्ट व्यवहार :null_session है के साथ ठीक कर रहे हैं, आप को दूर कर सकता है यदि आप चाहें तो with: विकल्प।

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

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

यदि आप मोबाइल के लिए एपीआई का उपयोग करना चाहते हैं, तो मोबाइल (मेमोरी या स्थानीय डीबी) पर टोकन (पहले मैंने जो रणनीति कहा था) में सहेजें और यह अधिक सुरक्षित होगा।

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