2017-04-22 18 views
12

मैं फ्लास्क का उपयोग कर रहा हूं और यह मेरे लिए हुआ है यह मेरे आवेदन के प्रत्येक एंडपॉइंट पर session['next'] = request.url रखकर लॉगिन/लॉगआउट के बाद उपयोगकर्ता के अंतिम पृष्ठ पर वापस रीडायरेक्ट करने के लिए एक और शानदार समाधान हो सकता है और बस मेरा लॉगिन/लॉगआउट फ़ंक्शंस session.get('next') पर रीडायरेक्ट करें। यह फ्लास्क-लॉगिन एक्सटेंशन में एक विकल्प के समान है यदि आप USE_SESSION_FOR_NEXT.क्या यह मेरे 'अगली' यूआरएल को एक हस्ताक्षरित कुकी में स्टोर करना सुरक्षित है और इसे निस्संदेह पर रीडायरेक्ट करना सुरक्षित है?

मैं यह पुष्टि करना चाहता हूं कि यह एक सुरक्षित वर्कफ़्लो है, लेकिन यह पुष्टि करने के लिए सुरक्षा-समझदार नहीं है कि request.url को धोखा देने के कोई तरीके हैं या नहीं या अगर मैं अभी भी अगले यूआरएल पुन: निर्देशित करने से पहले मान्य किया जाना चाहिए, जैसा कि यहाँ निर्दिष्ट किया जाता है:

http://flask.pocoo.org/snippets/62/

एक कारण इस विधि अधिक सामान्यतः नहीं तैनात किया जाता है है? यह एक अच्छा, साफ, आसान समाधान जैसा लगता है जो यूआरएल के साफ रखता है, खेतों/प्रसंस्करण के लिए कम करता है, और यदि आप अगले यूआरएल को सत्यापित करने के लिए अतिरिक्त कदम नहीं उठा रहे हैं तो रीडायरेक्ट हमलों को खोलने के लिए भेद्यता को हटा दें। क्या चालबाजी है?

उत्तर

8

टी एल; डॉ

  1. हाँ, यह सुरक्षित है।
  2. यूआरएल को छिपाने, या "स्पूफिंग" को रोकने के बारे में चिंता न करें। हकीकत में, आप न तो कर सकते हैं, इसलिए आप दोनों के लिए तैयार हैं।
  3. संभावित बग: एक बार जब आप सत्र पर रीडायरेक्ट सेट करते हैं, तो अगला लॉगिन इसका पालन करेगा, चाहे सत्र समाप्त होने तक कोई फर्क नहीं पड़ता। इसका समाधान करने का एक तरीका केवल रीडायरेक्ट पथ को जीईटी पैरामीटर के रूप में सहेजता है (उत्तर के नीचे देखें)।
  4. सुरक्षा चिंताओं को पुनर्निर्देशित करने और अग्रेषित करने के लिए यहां nice cheat sheet है।

यह एक सुरक्षित वर्कफ़्लो है, यह मानते हुए कि आपका सर्वर आने वाले अनुरोधों को सभी सुरक्षित संसाधनों को प्रमाणित करता है।

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

आपके प्रश्न में, ऐसा लगता है कि आप यूआरएल से लॉग इन होने तक यूआरएल को छिपाने की कोशिश कर रहे हैं। यह आवश्यक नहीं होना चाहिए।

url 1: "/login" # anyone can access this 
url 2: "/secure_page" # only a logged in user can access this 

मान लें कि कोई उपयोगकर्ता में लॉग इन नहीं कर रहा है, और yoursite.com/secure_page करने के लिए नेविगेट करने की कोशिश करता है:

उदाहरण के लिए, मान लीजिए कि आप दो यूआरएल डालते हैं। उन्हें हर बार आपके लॉगिन पेज पर रीडायरेक्ट किया जाना चाहिए। अगर वे secure_page यूआरएल जानते हैं, तो आपकी सुरक्षा को समझौता नहीं करना चाहिए। वास्तव में, वे पहले से ही है कि यूआरएल, क्योंकि वे पहली जगह में है कि पृष्ठ पर भेज पता होना चाहिए, तो या तो उन्होंने इसे में टाइप, एक लिंक पर क्लिक करें, या यह किसी बुकमार्क या एक ब्राउज़िंग इतिहास में बचा लिया गया था। महत्वपूर्ण बात यह है कि जब आप secure_page पर अनुरोध संभालते हैं, तो आपको उन्हें लॉग इन करने की आवश्यकता होती है।

आप पूछते हैं कि क्या वे उस यूआरएल को "स्पूफ" कर सकते हैं जिसे वे रीडायरेक्ट कर रहे हैं। वे इस तरह के सत्र में सहेजते समय नहीं कर सकते हैं। हालांकि, वे लॉग इन करने के बाद इच्छित किसी भी यूआरएल को मार सकते हैं, इसलिए इससे कोई फर्क नहीं पड़ता कि वे यूआरएल को "स्पूफ" करते हैं।

तो क्योंकि वे पहले से ही है कि यूआरएल को जानते हैं और वे किसी भी यूआरएल वे के बाद वे में लॉग चाहते हिट कर सकते हैं, तो आप उपयोगकर्ता द्वारा की गई यूआरएल गुप्त रखने के लिए जरूरत नहीं है। ऐसा करने का एकमात्र लाभ एक सौंदर्यपूर्ण क्लीनर यूआरएल है। यही कारण है कि आप कई प्रवेश पृष्ठों है कि इस तरह दिखना देखें:

http://yoursite.com/login?next=secure_page 

क्या हो रहा है वहाँ वे बचत कर रहे हैं कि एक HTTP GET पैरामीटर के रूप में अगले यूआरएल। हालांकि यह कम "साफ" है, यह अधिक स्पष्ट है, इसलिए इसमें इसके पेशेवर और विपक्ष हैं। और यदि वे बाद में लॉगिन पेज पर फिर से जाएं, तो वह रीडायरेक्ट नहीं होगा, जो आपका वांछित व्यवहार हो सकता है। आपके वर्तमान कोड के साथ, एक बार जब रीडायरेक्ट सत्र पर होता है, तो उसके बाद यह अगला लॉगिन सत्र समाप्त होने तक रीडायरेक्ट का पालन करेगा, जो उपयोगकर्ता के चलने के बाद हो सकता है और कोई और उस वेब ब्राउज़र का उपयोग करता है।

कई साइटों यह रास्ता मैं ऊपर से पता चला है। Django does it that way। इस मामले में, दुर्भावनापूर्ण लिंक "अगला" यूआरएल प्रदान कर सकता है और यह कुछ फ़िशिंग साइट पर पुन: निर्देशित किया है, लेकिन है कि आसानी से "अगला" यूआरएल सुनिश्चित आपके डोमेन से बाहर नेविगेट नहीं करता से रोका जा सकता है।

यहाँ रीडायरेक्ट/आगे सुरक्षा के लिए एक basic cheat sheet (आप रीडायरेक्ट कर रहे हैं, लेकिन यहाँ लैंडिंग दूसरों अग्रेषण अनुरोध पर विचार किया जा सकता है) है।

1

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

कहा जा रहा है कि, मुझे कोई कारण नहीं दिख रहा है कि URL को मान्य नहीं करना चाहिए, कम से कम यह सुनिश्चित करने के लिए कि आप एक ही डोमेन पर किसी पृष्ठ पर रीडायरेक्ट कर रहे हैं। प्रदर्शन लागत मामूली है, और मेरा मानना ​​है कि लॉगिन/लॉगआउट प्रवाह से संबंधित कुछ भी जांच के अतिरिक्त स्तर के योग्य है। मैं यह भी सुनिश्चित कर दूंगा कि आपके पास कुकी में इस फ़ील्ड के बिना अनुरोध प्राप्त होने पर स्वीकार्य डिफ़ॉल्ट केस होगा।

0

@brendan टिप्पणी की है, यह समाधान है, ठीक से काम करेंगे देखने की रक्षा के लिए एक @login_required डेकोरेटर का उपयोग करें।

दो मामलों:

(गैर संरक्षित दृश्य) >> एक @login_protected देखने के लिए सफलतापूर्वक लॉगिन, इस मामले में आप/सूचकांक पर हैं में Loggin, आप वापस जाने के लिए है, तो के रूप में/सूचकांक पहुँचा जा सकता है हर किसी के लिए, तुम सच में

परवाह नहीं है

(संरक्षित दृश्य) >> सफल

आप/प्रोफ़ाइल दृश्य पर हैं लॉग आउट हो रहा गैर-संरक्षित दृश्य पर लॉगआउट, यदि आप वापस जाते हैं, तो सजावट आपको

0

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

<X-Frame-Options','DENY'> 

हालांकि यह पुनर्निर्देशन की चिंता नहीं करता है लेकिन इसका उपयोग यहां किया जा सकता है। सावधान रहे।

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

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