सीएसआरएफ का जोखिम यह है कि एक बाहरी साइट आपके लिए डेटा भेज सकती है और उपयोगकर्ता ब्राउज़र स्वचालित रूप से प्रमाणीकरण कुकी भेज देगा।
आपको प्राप्त करने की कार्रवाई के लिए कुछ तरीका है (कि आपकी $.ajax()
विधि POST डेटा भेज रही है) यह जांचने में सक्षम है कि अनुरोध बाहरी साइट की बजाय आपकी साइट पर किसी अन्य पृष्ठ से आया है।
ऐसा करने के कुछ तरीके हैं, लेकिन अनुशंसित तरीका उस अनुरोध को टोकन जोड़ना है जिसे आप जांच सकते हैं और हैकर्स नहीं मिल सकते हैं।
इसके सरलतम पर:
- एक लंबे यादृच्छिक स्ट्रिंग टोकन बना सकते हैं और उपयोगकर्ता के खिलाफ इसे सहेजें पर लॉग ऑन।
$.ajax()
अनुरोध में एक पैरामीटर जोड़ें जिसमें टोकन शामिल है।
- अनुरोध पर जांचें कि टोकन उस उपयोगकर्ता से मेल खाता है जिसे आपने उपयोगकर्ता के लिए सहेजा है।
- यदि टोकन मेल नहीं खाता है तो आपके पास सीएसआरएफ हैक है।
हैकर आपके डीबी को प्राप्त कर सकते हैं नहीं और नहीं वास्तव में पृष्ठ आप उपयोगकर्ता के लिए भेज दिया है पढ़ सकते हैं (जब तक कि वे में एक XSS हमले मिलता है, लेकिन है कि एक और समस्या है) तो धोखा नहीं कर सकता टोकन।
सभी कि टोकन के माध्यम से मायने रखती है कि आप भविष्यवाणी कर सकते हैं (और मान्य) है यह और है कि हैकर नहीं कर सकता।
इस कारण से कुछ लंबा और यादृच्छिक उत्पन्न करना और डीबी में इसे स्टोर करना सबसे आसान है, लेकिन आप इसके बजाय कुछ एन्क्रिप्टेड बना सकते हैं। मैं केवल उपयोगकर्ता नाम MD5 नहीं होगा - अगर सीएसआरएफ हमलावर यह पता लगाते हैं कि आपके टोकन कैसे उत्पन्न करें, तो आपको हैक किया जाएगा।
टोकन को स्टोर करने का एक और तरीका कुकी में है (आपके डेटाबेस के बजाए), क्योंकि हमलावर आपकी कुकीज़ को पढ़ या बदल नहीं सकते हैं, बस उन्हें फिर से भेजा जा सकता है। फिर आप कुकी में HTTP पोस्ट डेटा मिलान टोकन में टोकन हैं।
आप इन्हें बहुत अधिक परिष्कृत बना सकते हैं, उदाहरण के लिए एक टोकन जो हर बार सफलतापूर्वक उपयोग किया जाता है (पुनर्वितरण को रोकता है) या उपयोगकर्ता और कार्रवाई के लिए विशिष्ट टोकन, लेकिन यह मूल पैटर्न है।
उपयोगकर्ता किसी अन्य वेबसाइट से AJAX अनुरोध कैसे पोस्ट कर सकता है हालांकि [समान मूल नीति] (https://en.wikipedia.org/wiki/Same-origin_policy) ऐसे व्यवहार को रोकता है? – Songo
@ सोंगो सभी ब्राउज़रों का समर्थन नहीं करता है, दुर्भाग्य से। बहुत सारे प्रॉक्सी स्ट्रिप हेडर और उसे भी तोड़ते हैं। अंत में आप मूल से बाहर पोस्ट कर सकते हैं, भले ही आप AJAX का इरादा रखते हैं जिसका अर्थ यह नहीं है कि हमलावर होगा। असल में आपके पास एक समान मूल नीति होनी चाहिए, लेकिन क्योंकि यह अच्छी तरह से व्यवहार किए गए ब्राउज़र पर निर्भर करता है, आपको उस पर भरोसा नहीं करना चाहिए। एक सीएसआरएफ टोकन का उपयोग आपको ऐसा कुछ देता है जिसे आप सत्यापित कर सकते हैं भले ही समान-उत्पत्ति को बाधित किया गया हो। – Keith
@ सैंगो क्रोम के नवीनतम संस्करण के साथ भी, आप अभी भी अनुरोध प्राप्त कर सकते हैं (यानी '''' एक वेबपृष्ठ पर टैग) और यह काम करेगा। @ किथ मैं एक कुकी पर भरोसा नहीं करता क्योंकि ब्राउजर स्वचालित रूप से प्रत्येक अनुरोध के लिए कुकी को वेबपृष्ठ पर भेजता है। यदि हमलावर एक आईफ्रेम या एक फॉर्म का उपयोग करता है तो कुकी स्वचालित रूप से भेजी जाएगी मुझे विश्वास है। – arleslie