2011-12-28 10 views
25

क्या हमें वेबसाइट में हर रूप के लिए एक टोकन उत्पन्न करना है? मेरा मतलब है, प्रत्येक अनुरोधित फॉर्म के लिए अलग-अलग टोकन उत्पन्न करने के लिए हर बार? यदि नहीं, क्यों?सीएसआरएफ सुरक्षा: क्या हमें हर रूप के लिए टोकन उत्पन्न करना है?

+0

यह https://security.stackexchange.com/ –

उत्तर

33

सामान्य में, यह सिर्फ one token per session, है करने के लिए पर्याप्त होता है एक तथाकथित प्रति-सत्र टोकन:

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

आप आगे सुरक्षा बढ़ाने के लिए चाहते हैं, आप प्रत्येक प्रपत्र/यूआरएल प्रति एक टोकन का उपयोग कर सकते हैं (प्रति-प्रपत्र टोकन) प्रभाव को कम करने के लिए जब एक टोकन लीक (ई। जी। XSS) एक के रूप में हमलावर केवल उस विशिष्ट रूप/यूआरएल पर सफलतापूर्वक हमला करने में सक्षम होगा।

लेकिन प्रति-अनुरोध टोकन का उपयोग करके, i। ई। टोकन कि प्रत्येक अनुरोध के साथ बदलने के लिए, बल्कि वेबसाइट के प्रयोज्य में कटौती के रूप में यह समानांतर ब्राउज़िंग अनुमति नहीं देता:

आगे, इस प्रस्तावित डिजाइन की सुरक्षा बढ़ाने के लिए CSRF टोकन randomizing पर विचार [...] प्रत्येक अनुरोध के लिए। प्रति-सत्र टोकन के विपरीत प्रति-अनुरोध टोकन की पीढ़ी में इस दृष्टिकोण को लागू करना परिणाम। नोट, हालांकि, यह उपयोगिता चिंताओं के परिणामस्वरूप हो सकता है। उदाहरण के लिए, "बैक" बटन ब्राउज़र क्षमता अक्सर बाधित होती है क्योंकि पिछले पृष्ठ में एक टोकन हो सकता है जो अब वैध नहीं है। इस पिछले पृष्ठ के साथ बातचीत के परिणामस्वरूप सर्वर पर एक सीएसआरएफ झूठी सकारात्मक सुरक्षा घटना होगी।

तो मैं आपको प्रति सत्र टोकन या प्रति-फॉर्म टोकन का उपयोग करने की सलाह देता हूं।

+0

मुझे लगता है कि प्रति फॉर्म टोकन काम करेंगे यदि: ** ए) ** जब उपयोगकर्ता पहले फॉर्म को लोड करता है तो आप केवल टोकन बनाते हैं, किसी भी बाद के फॉर्म लोड को उस फॉर्म के लिए पहले टोकन का दोबारा उपयोग करना चाहिए। ** बी) ** सत्र में टोकन संग्रहीत करते समय इसे विशिष्ट पृष्ठ/फ़ॉर्म के लिए पहचानकर्ता शामिल करना चाहिए। जैसे सत्र ['एडिट-यूजर-सीएसआरएफ'] और सत्र ['एडिट-ऑर्डर-सीएसआरएफ'] और इस तरह आप एक अलग टैब में एक अलग पेज खोल सकते हैं और दोनों फॉर्म अभी भी सफलतापूर्वक सबमिट किए जा सकते हैं क्योंकि सत्र दोनों संग्रहित हो रहा है टोकन (प्रत्येक रूप के लिए एक)। पृष्ठ जानता है कि कौन सी सीएसआरएफ टोकन जांच और उपयोग करने के लिए है क्योंकि यह उस पृष्ठ पर है। – zuallauz

+0

सुनिश्चित करें कि आपके पास निष्क्रियता और पूर्ण सत्र समय है जिसके लिए पुन: प्रमाणीकरण और नई टोकन पीढ़ी की आवश्यकता होती है। (उदाहरण: निष्क्रियता के 20 मिनट या 4 घंटे पूर्ण) – LaJmOn

+0

@zuallauz फ़ॉर्म का यूआरएल फॉर्म की पहचान करने के लिए इस्तेमाल किया जा सकता है। यदि यह पर्याप्त नहीं है, तो आप किसी भी अन्य पहचान जानकारी (जैसे छिपे हुए इनपुट मान) को जोड़ सकते हैं या इससे भी बेहतर, [छिपे हुए इनपुट मानों को स्टोर करने के लिए [फॉर्म कंटेनर] का उपयोग कर सकते हैं (http://stackoverflow.com/a/9108483/53114) जो [छुपा इनपुट मानों को धोखा देने से रोक देगा] (http://stackoverflow.com/a/9209121/53114)। – Gumbo

11

नहीं, आपको बस generate a token on a per-session basis की आवश्यकता है।

टोकन उपयोगकर्ताओं द्वारा गलती से लीक होने की संभावना नहीं है और प्रति टोकन उत्पन्न करने से बहुत जटिल हो जाता है यदि कोई उपयोगकर्ता साइट को दो अलग-अलग टैब/विंडो में एक बार ब्राउज़ कर रहा है।

+0

धन्यवाद के लिए एक प्रश्न की तरह दिखता है। तो, टोकन अभी भी हर रूप में रखा जाएगा (लेकिन केवल प्रति सत्र टोकन अलग नहीं है)? – Centurion

+0

हाँ, यह सही है। – Quentin

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