Django के अंतर्निहित CSRF-हैंडलिंग के साथ अपनी वेबसाइट को एक बहुत ही सामान्य सुरक्षा छेद से सुरक्षित रखें।
Django एक पायथन वेब फ्रेमवर्क है जिसका उपयोग आप सुरक्षित वेब एप्लिकेशन बनाने के लिए कर सकते हैं। यह डेवलपर्स को सुरक्षा में मदद करने के लिए कई सुविधाएँ प्रदान करता है। इन सुविधाओं में से एक CSRF टोकन है, जो क्रॉस-साइट अनुरोध जालसाजी के हमलों से प्रपत्रों की सुरक्षा के लिए आवश्यक है।
CSRF टोकन क्या है?
एक सीएसआरएफ टोकन एक सुरक्षा सुविधा है जो वेब अनुप्रयोगों की सुरक्षा करता है क्रॉस-साइट अनुरोध जालसाजी (CSRF) हमले. यह एप्लिकेशन सर्वर को यह जांचने की अनुमति देता है कि एक फॉर्म सबमिशन एक प्रामाणिक ब्राउज़र से आया है या किसी हैकर ने इसे बनाया है।
सीएसआरएफ टोकन फॉर्म इनपुट हैं जो उपयोगकर्ता सत्र का ट्रैक रखते हैं। एक वेबसाइट की सर्वर-साइड वेब एप्लिकेशन फ्रेमवर्क आम तौर पर प्रत्येक अद्वितीय उपयोगकर्ता सत्र के लिए सीएसआरएफ टोकन उत्पन्न करता है। जब भी कोई उपयोगकर्ता फॉर्म सबमिट करता है तो सर्वर चेक करता है कि टोकन सही है या नहीं। CSRF टोकन में आम तौर पर यादृच्छिक तार और संख्याएँ होती हैं, जिससे उनका मान अप्रत्याशित हो जाता है।
Django में CSRF टोकन जनरेशन
Django के get_token () समारोह बेतरतीब ढंग से CSRF टोकन उत्पन्न करता है। इस फ़ंक्शन को खोजने के लिए, पर नेविगेट करें csrf.py अपने अंदर फाइल करें पायथन आभासी वातावरण. फ़ोल्डर संरचना इस तरह दिखनी चाहिए:
ईएनवी/
└── लिब/
└── साइट-पैकेज/
└── django/
└── मिडलवेयर/
└── सीएसआरएफ.पी
इस फ़ाइल के अंदर, आप पाएंगे get_token () फ़ंक्शन, जो टोकन लौटाता है। डीजेंगो उपयोग करता है डेटा मास्किंग टोकन के मूल्य को हैकर्स से बचाने के लिए।
डिफ़ॉल्ट रूप से, Django जोड़कर आपकी साइट के लिए CSRF सुरक्षा सक्षम करता है django.middleware.csrf. सीएसआरएफ व्यू मिडलवेयर में मध्यस्थ आप की सूची settings.py फ़ाइल। आपको बस इतना करना है कि जोड़ना है {% csrf_token %} अपने लिए डाक रूपों। बिना जोड़े {% csrf_token %}, आपको ए मिलेगा 403 निषिद्ध) त्रुटि जब आप एक फार्म जमा करते हैं।
जब आप जोड़ते हैं {% csrf_token %} आपके फॉर्म में, यह स्वचालित रूप से नाम के साथ एक छिपी हुई इनपुट फ़ील्ड बनाता है csrfmiddlewaretoken, जिसमें नकाबपोश CSRF टोकन का मान होता है। सर्वर इस मान का उपयोग यह निर्धारित करने के लिए करता है कि फॉर्म सबमिशन प्रामाणिक है या नहीं। आप पृष्ठ स्रोत को देखकर या अपने ब्राउज़र की डेवलपर टूल सुविधा का उपयोग करके इस छिपे हुए फ़ील्ड के मान की जांच कर सकते हैं।
कैसे CSRF टोकन Django में काम करते हैं
जब आप अपनी साइट को फॉर्म के साथ लॉन्च करते हैं, तो Django स्वचालित रूप से एक बनाता है ब्राउज़र कुकी बुलाया csrftoken. यह कुकी साइट पर उपयोगकर्ता गतिविधि का ट्रैक रखती है और प्रत्येक उपयोगकर्ता को विशिष्ट रूप से पहचानती है।
जब उपयोगकर्ता प्रपत्र सबमिट करता है, तो सर्वर कुकी के मान की तुलना कुकी के मान से करता है csrfmiddlewaretoken छिपे हुए इनपुट क्षेत्र में। यदि ये मान मेल खाते हैं, तो सर्वर फॉर्म को सफलतापूर्वक प्रोसेस करेगा, अन्यथा यह एक त्रुटि उत्पन्न करेगा।
पहली नज़र में, कुकी के मान और csrfmiddlewaretoken भिन्न प्रतीत होते हैं। यह जानबूझकर है और CSRF टोकन में सुरक्षा की एक अतिरिक्त परत जोड़ता है। CSRF टोकन की तुलना कुकी से इस तरह की जाती है:
- get_token () फ़ंक्शन CSRF टोकन को इनपुट फ़ील्ड में पास करने से पहले मास्क करता है।
- जब फॉर्म जमा हो जाता है, तो सेटिंग्स फ़ाइल में गुप्त कुंजी की मदद से CSRF टोकन अनमास्क हो जाता है।
- बेनकाब टोकन की तुलना सत्र कुकी से की जाती है।
- यदि मान समान हैं, तो प्रपत्र संसाधित हो जाता है। यदि नहीं, तो सर्वर एक त्रुटि देता है।
हैकर्स को आपके CSRF टोकन को चोरी करने से रोकने के लिए, Django हर बार उपयोगकर्ता सत्र शुरू होने पर इसे नवीनीकृत करता है।
कस्टम CSRF टोकन बनाना
हालांकि Django केवल जोड़कर आपके फॉर्म को सुरक्षित करना आसान बनाता है {% csrf_token %}, CSRF टोकन जनरेट करना और उन्हें अपने फॉर्म में मैन्युअल रूप से जोड़ना भी संभव है। ऐसा करने के लिए, आयात करें get_token () समारोह:
से django.middleware.csrf आयात get_token
आपके विचार में, आप इस तरह CSRF टोकन उत्पन्न कर सकते हैं:
डीईएफ़view_name(अनुरोध):
csrf_token = get_token (अनुरोध)# व्यू लॉजिक परफॉर्म करें
संदर्भ = {
"सीएसआरएफ_टोकन": csrf_token
}
वापस करना प्रस्तुत करना (अनुरोध, 'app_name/template.html', संदर्भ = संदर्भ)
अपने एचटीएमएल टेम्पलेट में, आप मैन्युअल रूप से अपना इनपुट टैग शामिल कर सकते हैं और जोड़ सकते हैं csrf_token इसे इस तरह:
<प्रपत्रतरीका="डाक" >
<इनपुटप्रकार="छिपा हुआ"नाम="सीएसआरएफमिडलवेयरटोकन"कीमत="{{csrf_token}}">
{{form.as_p}}
<बटनप्रकार="जमा करना"कक्षा="बीटीएन बीटीएन-रूपरेखा-माध्यमिक">पुस्तक जोड़ेंबटन>
प्रपत्र>
वैकल्पिक रूप से, आप इस तरह से अपने विचारों से छिपे हुए इनपुट फ़ील्ड को उत्पन्न कर सकते हैं:
डीईएफ़आपका विचार(अनुरोध):
csrf_token = get_token (अनुरोध)
csrf_token_html = ''प्रारूप (सीएसआरएफ_टोकन)# व्यू लॉजिक परफॉर्म करें
संदर्भ = {
"सीएसआरएफ_टोकन": csrf_token_html
}
वापस करना प्रस्तुत करना (अनुरोध, 'app_name/template.html', संदर्भ = संदर्भ)
इसके बाद आप इसे अपने एचटीएमएल टेम्पलेट में इस तरह जोड़ सकते हैं:
<प्रपत्रतरीका="डाक" >
{{csrf_token_html|सुरक्षित}}
{{form.as_p}}
<बटनप्रकार="जमा करना"कक्षा="बीटीएन बीटीएन-रूपरेखा-माध्यमिक">पुस्तक जोड़ेंबटन>
प्रपत्र>
यदि आप अपने फॉर्म की CSRF सुरक्षा को पूरी तरह से नियंत्रित करना चाहते हैं, तो आप अपने CSRF टोकन की तुलना ब्राउज़र में संग्रहीत कुकी से कर सकते हैं। तुलना के परिणामों के आधार पर, आप जैसे चाहें फॉर्म सबमिशन को हैंडल कर सकते हैं। यहाँ एक उदाहरण है:
से django.शॉर्टकट आयात प्रदान करना
से django.middleware.csrf आयात get_token, _unmask_cipher_token
से django.utils.crypto आयात निरंतर_समय_तुलना करेंडीईएफ़आपका विचार(अनुरोध):
# एक कस्टम CSRF टोकन जनरेट करें
csrf_token = get_token (अनुरोध)
csrf_cookie = अनुरोध। कुकीज़.get('सीएसआरएफटोकन')# सीएसआरएफ टोकन को अनमास्क करें
अनमास्क_csrf_token = _unmask_cipher_token (csrf_token)
# टोकन की तुलना करें
अगरनहीं निरंतर_समय_तुलना (अनमास्कड_csrf_token, csrf_cookie):
# उस मामले को संभालें जहां टोकन मेल नहीं खाते
उत्तीर्ण
अन्य:
# उस मामले को संभालें जहां टोकन मेल खाते हैं
उत्तीर्ण
# टेम्प्लेट रेंडर करें
संदर्भ = {
'सीएसआरएफ_टोकन': सीएसआरएफ_टोकन,
}
वापस करना प्रस्तुत करना (अनुरोध, 'app_name/template.html', संदर्भ = संदर्भ)
यह कोड स्निपेट पुनः प्राप्त करता है csrf_cookie HTTP अनुरोध वस्तु से। यह तब उपयोग करता है _unmask_cipher_token () बेनकाब करने के लिए कार्य करें csrf_token.
एक सशर्त बयान पुनर्प्राप्त के मूल्यों की तुलना करता है csrf_cookie और बेपर्दा csrf_token. यह तुलना उपयोग करती है निरंतर_समय_तुलना करें समय के कारनामों से बचाने के लिए कार्य करें। तुलना के परिणाम के आधार पर आप अपना तर्क लिख सकते हैं।
Django में CSRF सुरक्षा को अक्षम करना
भले ही Django CSRF सुरक्षा के लिए एक डिफ़ॉल्ट प्रावधान करता है, आप चाहें तो इसे अपने प्रोजेक्ट में अक्षम कर सकते हैं। इसे करने के दो तरीके हैं:
- आपकी पूरी वेबसाइट पर CSRF सुरक्षा अक्षम करना।
- विशिष्ट दृश्य पर CSRF सुरक्षा को अक्षम करना।
आपकी संपूर्ण वेबसाइट पर CSRF सुरक्षा अक्षम करना
अपनी वेबसाइट पर Django की CSRF सुरक्षा को अक्षम करने के लिए, आपको बस अपनी सेटिंग फ़ाइल से CSRF मिडलवेयर को हटाना होगा। अपनी सेटिंग फ़ाइल में, नाम की एक सूची का पता लगाएं मध्यस्थ. सूची के अंदर, इसे खोजें:
django.middleware.csrf। सीएसआरएफ व्यू मिडलवेयर',
एक बार जब आप इसे पा लेते हैं, तो आपको इसे अक्षम करने के लिए Django के डिफ़ॉल्ट CSRF सुरक्षा के लिए अपने कोड से हटा देना चाहिए।
एक विशिष्ट दृश्य पर सीएसआरएफ सुरक्षा को अक्षम करना
यदि आप केवल विशिष्ट Django दृश्य पर CSRF सुरक्षा को अक्षम करना चाहते हैं, तो इसका उपयोग करें @csrf_exempt डेकोरेटर। प्रदर्शित करने के लिए यहां एक कोड स्निपेट है:
से django.views.decorators.csrf आयात csrf_छूट
@csrf_exempt
डीईएफ़view_name(अनुरोध):
# व्यू लॉजिक परफॉर्म करें
उत्तीर्ण
@csrf_exempt डेकोरेटर Django में CSRF सुरक्षा से संबंधित कई में से एक है। बाकी के बारे में आप पढ़ सकते हैं Django का CSRF संदर्भ.
अपनी वेबसाइट पर सीएसआरएफ सुरक्षा को अक्षम न करें
हालांकि Django इसे संभव बनाता है, Django के अंतर्निहित CSRF सुरक्षा तंत्र को अक्षम करने की अनुशंसा नहीं की जाती है। ऐसा करने से आपकी साइट CSRF के हमलों के प्रति संवेदनशील हो जाएगी और अंततः आपके ऐप के उपयोगकर्ताओं को नकारात्मक रूप से प्रभावित करेगी।
जब तक आप एक अनुभवी डेवलपर नहीं हैं जो एक कस्टम सीएसआरएफ सुरक्षा तंत्र को कार्यान्वित करना जानता है, तो आपको Django द्वारा प्रदान किए गए विकल्प के साथ काम करना चाहिए।