2009-12-23 8 views
43

से अनुरोध है, मैं $_SERVER['HTTP_X_REQUESTED_WITH'] में किसी मान की जांच करके AJAX अनुरोधों का पता लगाने के लिए अपने PHP बैक-एंड का उपयोग करता हूं।PHP में अजाक्स का पता लगाना और यह सुनिश्चित करना कि मेरी वेबसाइट

यह मुझे एक विश्वसनीय पहचान देता है, यह सुनिश्चित करने के लिए कि अनुरोध AJAX तकनीकों का उपयोग कर रहा है।

मैं कैसे सुनिश्चित कर सकता हूं कि अनुरोध मेरे डोमेन से आया, न कि बाहरी डोमेन/रोबोट?

www.example.com/ajax?true किसी को भी AJAX कॉल करने और जानकारी को काटने की अनुमति दे सकता है।

मैं उन सभी के लिए सत्र बना सकता हूं जो सामान्य रूप से मेरी वेबसाइट में प्रवेश करते हैं, और फिर AJAX कॉल की अनुमति देते हैं .. लेकिन इसे भी फिक्र किया जा सकता है।

क्या इससे इन दिनों भी कोई फर्क पड़ता है?

उत्तर

31

आप नियंत्रक करते है

  • बाद में तुलना

के लिए सत्र में पहुँच टोकन

  • दुकान उत्पन्न अपने दृश्य में

    +०१२३५१६४१०
    • जे एस चर के रूप में पहुँच टोकन घोषित
    • प्रत्येक अनुरोध के साथ टोकन भेजने

    अपने नियंत्रक

    • सत्यापित करें HTTP_X_REQUESTED_WITH
    • सत्यापित करें टोकन

    चेक में ये सुरक्षा guidelines from OpenAjax
    इसके अलावा, codinghorror.com एनी लिंक पर आलेख पढ़ें।

  • +3

    +1 चूंकि ब्राउज़र-आधारित AJAX अनुरोध प्रत्येक अनुरोध के साथ कुकीज़ भेजते हैं - आपको बस प्रत्येक पृष्ठ पर एक टोकन चेक जोड़ने की आवश्यकता है। – Xeoncross

    +7

    वह एपीआई को सीधे मारने वाले रोबोट को नहीं रोकेगा। यह आपके जावास्क्रिप्ट ऐप की तरह ही पहुंच टोकन प्राप्त कर सकता है। – Quentin

    0

    $_SERVER['HTTP_REFERER'] देखें। यह कई मामलों में काम करेगा, लेकिन पूरी तरह से सुरक्षित समाधान के लिए भ्रमित नहीं होना चाहिए।

    +1

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

    +0

    @ जोनाथन सैम्पसन - मैं BurpSuite जैसे कुछ अनुरोध को पकड़ सकता हूं और HTTP_REFERER को बदल सकता हूं ... इसलिए मुझे नहीं लगता कि यह समाधान है। मैं इसे एक स्क्रिप्ट डब्ल्यू/कर्ल में भी कर सकता हूं। –

    23

    आप HTTP_REFERRER की जांच कर सकते हैं, लेकिन सभी ब्राउज़रों ने इसे सेट नहीं किया है। सबसे अच्छा तरीका जावास्क्रिप्ट पक्ष पर आपके AJAX कॉल के लिए एक रैपर लिखना है जो दस्तावेज़.cookie का हिस्सा सर्वर पर वापस भेजता है - केवल आपके डोमेन के पास कुकी तक पहुंच है। आप php में AJAX कॉल में कुकी के साथ अनुरोध हेडर में कुकी की तुलना कर सकते हैं।

    जवाब में, "क्या इससे कोई फर्क पड़ता है, इन दिनों" - हाँ, यह करता है! Read this

    +2

    मुझे यकीन नहीं है कि यह विधि अस्पष्टता के माध्यम से सुरक्षा को छोड़कर कुछ भी हासिल करेगी। एक वेब अनुरोध तैयार करना मुश्किल है, जो कि सभी अजाक्स अनुरोध है। यह जावास्क्रिप्ट रैपर की जांच करने के लिए थोड़ा सा छोटा है और जो कुछ भी जोड़ रहा है उसे जोड़ें। यह सब एक सत्र टोकन अनुकरण करता है। – zombat

    +1

    मुझे लगता है कि यह रोबोट को बे में रख सकता है, अगर उन्होंने जावास्क्रिप्ट का उपयोग नहीं किया है। लेकिन यह अनुरोध * सुरक्षित *, प्रति से नहीं है। – zombat

    +0

    इस विधि को सत्र कुकी तक पहुंच की आवश्यकता है। यदि रोबोट को सत्र कुकी तक पहुंच है, तो हाँ, साइट सुरक्षित नहीं है। लेकिन आपके पास एक्सएसआरएफ की तुलना में बड़ी समस्याएं भी हैं! – Annie

    3

    दाऊद वॉल्श एक अच्छा solution

    /* decide what the content should be up here .... */ 
    $content = get_content(); //generic function; 
    
    /* AJAX check */ 
    if(!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') { 
        /* special ajax here */ 
        die($content); 
    } 
    
    /* not ajax, do more.... */ 
    
    +1

    इसका अनुरोध सुरक्षित करने के साथ कुछ भी नहीं है। – Xeoncross

    +0

    कोई भी अनुरोध में HTTP शीर्षलेख जोड़ सकता है। –

    2

    वास्तव में, ऐसा करने का सबसे सुरक्षित तरीका है, जैसा कि आपने सुझाव दिया है, सर्वर-साइड सत्र का उपयोग करें, क्योंकि इन्हें कुकीज़ के रूप में तैयार नहीं किया जा सकता है।

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

    कोई अन्य विधि उल्लिखित - कुकीज़, जावास्क्रिप्ट, http रेफरर - क्लाइंट-साइड डेटा पर निर्भर करता है, जो असुरक्षित है और हमेशा नकली, जाली, अपहरण और दुर्भावनापूर्ण रूप से निर्मित होने का संदेह होना चाहिए।

    +0

    सहमत हैं, और कोई सत्र उत्पन्न होने के तरीके को बदल सकता है ताकि वे अधिक सुरक्षित हो जाएंगे। – Quamis

    6

    अपने अंतिम प्रश्न के बारे में: "क्या इन दिनों में भी इससे कोई फर्क पड़ता है?" यह मामला प्रश्न के मामले में एक मामला है। अगर AJAX अनुरोध ऐसा कुछ कर रहा है जिसके लिए सुरक्षा की आवश्यकता नहीं है (उदाहरण के लिए नवीनतम स्टॉक उद्धरण लोड करना) तो यह वास्तव में IMHO से कोई फर्क नहीं पड़ता। अगर अनुरोध सुरक्षित जानकारी प्राप्त कर रहा है जिसे सुरक्षित किया जाना चाहिए (उदा। जानकारी की जानकारी लौटाना या सर्वर पर कुछ करना) तो आपको इसका इलाज करना चाहिए।

    मैं व्यक्तिगत रूप से सर्वर चर का उपयोग नहीं करता यह जानने के लिए कि कोई AJAX अनुरोध कब होता है। इसके बजाय मैं AJAX कॉल में एक क्वेरी पैरामीटर जोड़ता हूं (उदा। http://domain.com/?ajax=true)। अगर मुझे AJAX कॉल को सुरक्षित करने की आवश्यकता है तो मैं नियमित पृष्ठ अनुरोध (क्लाइंट और सर्वर दोनों का उपयोग करके) को सुरक्षित करने के समान तरीकों का उपयोग करूंगा। चूंकि लुकास ओमान ने बताया, क्लाइंट साइड पर कुछ भी फिक्र किया जा सकता है। नीचे की रेखा किसी भी अनुरोध पर भरोसा नहीं करती है भले ही आपको लगता है कि यह आपकी साइट या डेटाबेस से आ रहा है। हमेशा मंत्र का पालन करें "फिल्टर इनपुट - भागने का आउटपुट"।

    +1

    हां, हां, हां। जिम समझ रहा है। उसे सुनों। – Quentin

    +0

    यह सबसे अच्छा जवाब है। आप कभी भी अपनी साइट पर अनुरोध का स्रोत सुनिश्चित नहीं कर सकते हैं। भले ही अनुरोध प्रमाणीकृत हो, भले ही कोई उपयोगकर्ता एक बॉट और वैध क्रेडेंशियल का उपयोग कर रहा हो या यहां तक ​​कि बस अपनी कुकी को ब्राउज़र से बाहर खींच सके। – frostymarvelous

    1

    उपयोग पोस्ट सत्र सुरक्षित अनुरोध:

    वेबपेज के अंदर का (जैसे index.php) हम sessionid

    <?php 
    // Create Session 
    $session = session_id(); 
    if(empty($session)) session_start(); 
    ?> 
    <head> 
    ... 
    <script type="text/javascript"> 
        sid = '<?php echo session_id(); ?>'; 
    </script> 
    <script type="text/javascript" src="ajaxrequest.js"></script> 
    ... 
    </head> 
    

    ajax अनुरोध (ajaxrequest.js) स्टोर करने के लिए

    की जरूरत
    /* simple getAjax function 
    * @param $url  request url 
    * @param $param  parameter (dont use ?) 
    * @param callback function on success 
    */ 
    var spinnerid = '#spinner'; // Spinner as long ajax requests running 
    $(document).ajaxStart(function() { $(spinnerid).show(); }); 
    $(document).ajaxStop(function() { $(spinnerid).hide(); }); 
    function getAjax(url, param, callback) { 
        var data = null; 
        url += "?sid=" + sid + "&" + param; 
        $.ajax({ 
         url: url, 
         method: "POST", // uncomment to use GET, POST is secured by session 
         cache: false, 
         async: true, 
         success : function(data){ 
         callback(data); 
        }, 
    } 
    
    getAjax('http://domain.com/', 'data=foo', function(data) { 
    // do stuf with data 
    var jsonobj = eval("(" + data + ")"); 
    var data = jsonobj[0][ 'data' ]; 
    }); 
    

    जिम्मेदार PHP पक्ष:

    if(isset($_GET['sid'])) $client_sid = $_GET['sid']; 
    
    if(session_id() == null) session_start(); 
    
    if(session_id() != $client_sid) { 
        // noID or wrongID, redirect to mainindex 
        ignore_user_abort(true); 
        header("HTTP/1.1 403 Forbidden"); 
        header("Connection: close", true); 
        exit; 
    } else { 
    
        // get data 
        if(isset($_GET['data'])) { 
         $data = $_GET['data']; 
        } else if(isset($_POST['data'])) { 
         $data = $_POST['data']; 
        } else { 
         $data = null; 
        } 
    
        // do stuff with data 
    
        // return data as json 
        $resp[0]['data'] = $data; 
        print_r(json_encode($resp)); 
    } 
    
    +0

    मैं सुरक्षा कारणों से सत्र आईडी का उपयोग नहीं करता। प्रत्येक सत्र के लिए यादृच्छिक टोकन उत्पन्न करने की अनुशंसा की जाती है, जो आपके सत्र में सहेजी जाती है। इसे पढ़ें: https://docs.phalconphp.com/en/latest/reference/security.html#cross-site-request-forgery-csrf-protection – Yossi

    +0

    हालांकि यह काम करेगा क्योंकि AJAX डेटा पोस्ट कर रहा है (प्राप्त करने का उपयोग नहीं कर रहा है) , जावास्क्रिप्ट को देखकर कोई भी मूल्यों को देख सकता है। फिर वे डेटा कॉपी कर सकते हैं, अपना फॉर्म बना सकते हैं और इसे उसी स्थान पर पोस्ट कर सकते हैं। $ _SERVER ['HTTP_REFERER'] पर एक चेक उस को रोकने में मदद करेगा, जैसा कि एक जांच होगी कि डेटा AJAX के माध्यम से पोस्ट किया गया था लेकिन यह अभी भी पूरी तरह से सुरक्षित नहीं है। क्या कोई बेहतर तरीका है? – james

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