ऐसा लगता है कि जब तक ब्राउज़र खुला है तब तक सत्र को खुला रहने देने पर आपकी आपत्ति स्वचालित हमलों का मुद्दा है। दुर्भाग्य से, प्रत्येक पृष्ठ लोड पर टोकन को रीफ्रेश करने से केवल सबसे शौकिया हमलावरों को ही रोका जा सकता है।
सबसे पहले, मुझे लगता है कि हम आपकी साइट पर विशेष रूप से लक्षित हमलों के बारे में बात कर रहे हैं। (यदि हम उन बॉट्स के बारे में बात कर रहे हैं जो बस घूमते हैं और विभिन्न फ़ॉर्म जमा करते हैं, तो यह न केवल उन्हें रोकेगा, बल्कि ऐसा करने के बेहतर और आसान तरीके भी हैं।) यदि ऐसा है, और मैं अपने लक्ष्य को लक्षित कर रहा हूं साइट, यहाँ मेरा बॉट क्या करेगा:
- फ़ॉर्म पेज लोड करें।
- प्रपत्र पृष्ठ पर टोकन पढ़ें।
- उस टोकन के साथ स्वचालित अनुरोध सबमिट करें।
- चरण 1 पर जाएं।
(या, अगर मैंने आपके सिस्टम की पर्याप्त जांच की, तो मुझे एहसास होगा कि अगर मैंने प्रत्येक अनुरोध पर "यह AJAX है" हेडर शामिल किया है, तो मैं हमेशा के लिए एक टोकन रख सकता हूं। या मुझे पता चलेगा कि टोकन मेरी सत्र आईडी है, और मेरा अपना PHPSESSID
send भेजें कुकी।)
प्रत्येक पृष्ठ लोड पर टोकन बदलने की यह विधि किसी ऐसे व्यक्ति को रोकने के लिए कुछ भी नहीं करेगी जो वास्तव में चाहता था आप सभी पर इतना बुरा हमला करने के लिए। इसलिए, चूंकि टोकन का स्वचालन पर कोई प्रभाव नहीं पड़ता है, इसलिए CSRF पर इसके प्रभावों पर ध्यान दें।
सीएसआरएफ को ब्लॉक करने के दृष्टिकोण से, एक टोकन बनाना और इसे तब तक बनाए रखना जब तक कि उपयोगकर्ता ब्राउज़र को बंद नहीं कर देता, सभी लक्ष्यों को पूरा करता प्रतीत होता है। सरल सीएसआरएफ हमले पराजित होते हैं, और उपयोगकर्ता कई टैब खोलने में सक्षम होता है।
TL;DR:प्रत्येक अनुरोध पर टोकन को एक बार रीफ़्रेश करने से सुरक्षा को बढ़ावा नहीं मिलता है। उपयोगिता के लिए जाएं और प्रति सत्र एक टोकन करें।
हालांकि! यदि आप डुप्लीकेट फ़ॉर्म सबमिशन, आकस्मिक या अन्यथा के बारे में अत्यधिक चिंतित हैं, तो इस समस्या को अभी भी आसानी से हल किया जा सकता है। उत्तर सरल है:दो अलग-अलग कार्यों के लिए दो टोकन का उपयोग करें।
ब्राउज़र सत्र समाप्त होने तक पहला टोकन वही रहेगा। यह टोकन सीएसआरएफ हमलों को रोकने के लिए मौजूद है। इस टोकन के साथ इस उपयोगकर्ता का कोई भी सबमिशन स्वीकार किया जाएगा।
दूसरा टोकन लोड किए गए प्रत्येक फॉर्म के लिए विशिष्ट रूप से जेनरेट किया जाएगा, और उपयोगकर्ता के ओपन फॉर्म टोकन के सत्र डेटा में एक सूची में संग्रहीत किया जाएगा। यह टोकन अद्वितीय है और इसका उपयोग करने के बाद अमान्य हो जाता है। इस टोकन के साथ इस उपयोगकर्ता के सबमिशन एक बार और केवल एक बार स्वीकार किए जाएंगे।
इस तरह, अगर मैं फॉर्म ए के लिए एक टैब और फॉर्म बी के लिए एक टैब खोलता हूं, तो प्रत्येक के पास मेरा व्यक्तिगत एंटी-सीएसआरएफ टोकन (सीएसआरएफ का ख्याल रखा जाता है), और मेरा एक बार का फॉर्म टोकन (फॉर्म पुन:जमा करने का ख्याल रखा जाता है)। दोनों मुद्दों को उपयोगकर्ता अनुभव पर बिना किसी दुष्प्रभाव के हल किया जाता है।
बेशक, आप यह तय कर सकते हैं कि इतनी सरल सुविधा के लिए इसे लागू करना बहुत अधिक है। मुझे लगता है कि यह वैसे भी है। भले ही, यदि आप चाहें तो एक ठोस समाधान मौजूद है।