2012-04-13 9 views
5

मैं वेब सुरक्षा के लिए बिल्कुल नया हूं। मैं सोच रहा था कि फिर से सीएसआरएफ की रक्षा के लिए AJAX अनुरोधों और फ़ॉर्म सबमिट किए बिना फॉर्म (यानी स्टेटस अपडेट) के फॉर्म पर टोकन का उपयोग करने का सही तरीका क्या होगा। क्या कोई मुझे कोड नमूना दिखा सकता है? मुझे पता है कि सबमिट बटन के साथ फ़ॉर्म के लिए इसे ठीक से कैसे किया जाए।एजेक्स अनुरोधों पर सीएसआरएफ के खिलाफ सुरक्षा और सबमिट बटन के बिना फॉर्म

SetEnvIfNoCase X-Requested-With XMLHttpRequest ajax 
Order Deny,Allow 
Deny from all 
Allow from env=ajax 

ajax अनुरोध के लिए वह पर्याप्त सुरक्षा है, या मैं भी ajax अनुरोध के लिए टोकन सुरक्षा को लागू करना चाहिए: इसके अलावा मेरे ajax फ़ोल्डर में मैं निम्नलिखित के साथ एक htaccess है?

उत्तर

8

पृष्ठ लोड होने पर आपको केवल एक गुप्त (टोकन) उत्पन्न करने की आवश्यकता है। इसे पृष्ठ पर और सत्र में रखें। आम तौर पर मैंने इसे एक छिपे हुए क्षेत्र के रूप में रूप में रखा है यदि मैं कर सकता हूं, या यदि यह एक बहुत ही अजीब पृष्ठ का हिस्सा है, तो मैं इसे संबंधित तत्व पर एक मूल्य विशेषता में रखूंगा जैसे पूरे पृष्ठ को div wrapping। अन्य एक चर सेट को गुप्त में एक स्क्रिप्ट टैग जोड़ देंगे।

फिर, जब भी आप AJAX कॉल करते हैं या फॉर्म भेजते हैं, तो आप रहस्य के लिए एक फ़ील्ड शामिल करते हैं। (चेकेसॉफ्ट का जवाब कच्चे जेएस के साथ ऐसा करने के तरीके के बारे में अधिक जानकारी देता है, इसे लगभग jQuery या किसी भी अन्य ढांचे के साथ किया जा सकता है जिसका उपयोग आप कर सकते हैं।) इसे सुनिश्चित करने के लिए बैक एंड पर सत्र मूल्य से मिलान करें कि वे अभी भी हैं वही (एक ही स्रोत से आया), और आप अच्छे हैं।

यदि आप सुरक्षा जोड़ना चाहते हैं, तो प्रत्येक अनुरोध पर रहस्य को पुन: उत्पन्न करें और अनुरोधित डेटा के साथ उस नए रहस्य को वापस कर दें। अपने सभी AJAX अनुरोधों को उस नए क्षेत्र के साथ उस छिपे हुए फ़ील्ड या मान विशेषता को प्रतिस्थापित करें। यदि आप बहुत से अनुरोध, या समवर्ती अनुरोध कर रहे हैं तो यह वास्तव में अच्छी तरह से काम नहीं करता है। असल में, प्रत्येक पृष्ठ को लोड होने पर प्रत्येक बार उत्पन्न करना पर्याप्त होना चाहिए यदि आप इसे HTTPS पर कर रहे हैं, जो आपको होना चाहिए।

यदि आप एचटीटीपीएस पर ऐसा नहीं कर रहे हैं, तो यह वास्तव में कोई फर्क नहीं पड़ता, इंटरनेट कैफे/स्टारबक्स में बैठे किसी व्यक्ति ने सत्र चुरा सकता है और पृष्ठ को फिर से लोड कर सकता है।

यदि आप इसे बहुत कुछ करने जा रहे हैं, तो यह jQuery और various plugins की जांच करने योग्य है जो आपके लिए सीएसआरएफ सुरक्षा करने में मदद करेगा। Also, my way isn't the only way.

+1

प्रतिक्रिया के लिए धन्यवाद। अगर मैं इसे आपके लिंक में से एक के अनुसार अनुरोध शीर्षलेख के रूप में भेजता हूं: 'var csrf_token = ''; $ ("शरीर")। बाँध ("ajaxSend", समारोह (एल्म, XHR, रों) { \t अगर (s.type == "पोस्ट") { xhr.setRequestHeader ('एक्स-CSRF-टोकन' , csrf_token); } }); ' मैं AJAX पक्ष पर कैसे जांच करूं? क्या मुझे एक पोस्ट अनुरोध का उपयोग करके टोकन को पुनः प्राप्त करना होगा? – Anonymous

+0

@ अनाम यह आपकी पसंद की भाषा पर निर्भर करेगा। यह PHP की तरह दिखता है, इसलिए मैं कुछ [getallheaders] (http://php.net/manual/en/function.getallheaders जैसे कुछ जांचता हूं।php) – DampeS8N

+0

मुझे पता चला कि इसे कैसे जांचें: 'अगर ($ _ सर्वर [' HTTP_X_CSRF_TOKEN '] == $ _SESSION [' AJAXtoken_value ']) {' धन्यवाद। एकमात्र समस्या यह है कि अनुरोध http से अधिक है। मैं अपनी सेटिंग्स कैसे बदलूं ताकि अनुरोध https पर किया जा सके? – Anonymous

2

यदि आपका एक्सएचआर एक जीईटी अनुरोध है, तो टोकन को यूआरएल पैरामीटर के रूप में शामिल करें और PHP स्क्रिप्ट को इसे $_GET[] से पढ़ें। यदि आपका एक्सएचआर एक पोस्ट है, तो पोस्ट डेटा में टोकन पॉप करें और PHP स्क्रिप्ट को इसे $_POST[] से पढ़ें।

GET अनुरोध

var token = getElementById('myHiddenField').value; 
var xhr = new XMLHttpRequest(); 
xhr.open('GET', 'server.php?token=' + token); 
xhr.send(null); 

पोस्ट अनुरोध

var token = getElementById('myHiddenField').value; 
var xhr = new XMLHttpRequest(); 
xhr.open('POST', 'server.php', true); 
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); 
xhr.onreadystatechange = function() { 
    if (xhreq.readystate != 4) { return; } 
    // do client side stuff here 
}; 
xhr.send('token=' + token); 
+0

आपको शायद टोकन जेनरेट करने के लिए कहां और कहां पर कुछ नोट्स शामिल करना चाहिए। और यह सुनिश्चित करने के लिए कि आप दोनों सिरों पर एक ही के खिलाफ जांच कर रहे हैं। – DampeS8N

+0

@ DampeS8N पूर्णता के लिए इसे संपादित करने के लिए स्वतंत्र महसूस करें, लेकिन ओपी ने कहा है कि वह फॉर्म पोस्ट में सीएसआरएफ टोकन के साथ सहज है। – Cheekysoft

+0

प्रतिक्रिया के लिए धन्यवाद। अगर मैं इसे अनुरोध शीर्षलेख के रूप में भेजता हूं: var csrf_token = ''; $ ("बॉडी")। बाइंड ("AJAXSend", फ़ंक्शन (elm, xhr, s) {if (s.type == "POST") {xhr.setRequestHeader ('X-CSRF-Token', csrf_token);} }); मैं AJAX पक्ष पर कैसे जांचूँगा? क्या मुझे एक पोस्ट अनुरोध का उपयोग करके टोकन को पुनः प्राप्त करना होगा? – Anonymous

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