2010-07-29 11 views
25

मैं वर्तमान में एक वेब ऐप बना रहा हूं जिसमें PHP फ़ाइलों को jQuery की $ .ajax फ़ंक्शन का उपयोग करके मुख्य फ़ाइल में लोड किया गया है। हालांकि, पता बार में फ़ाइलों का नाम टाइप करके, PHP फ़ाइलें स्पष्ट रूप से अभी भी ऐप के बाहर पहुंच योग्य हैं।PHP और AJAX सुरक्षा प्रश्न

तो मेरा सवाल यह है कि इसे बनाने का सबसे अच्छा तरीका क्या होगा ताकि PHP फ़ाइल को 'अजाक्स' किया जा सके, यह जानता है कि यह सही पृष्ठ में निहित है और सही तरीके से कार्य करेगा, लेकिन अगर इसे किसी अन्य तरीके से एक्सेस किया जाता है (यहां तक ​​कि अगर कोई अपनी वेबसाइट फ़ाइल और AJAX को मेरी PHP फ़ाइल में बनाना था) तो फ़ाइल को "पहुंच से वंचित" या कुछ कहना चाहिए।

अग्रिम

उत्तर

10

धन्यवाद एक समान discussion

से Eran Galperin का हवाला देते हुए के रूप में अन्य लोगों ने कहा, Ajax अनुरोध उचित हेडर बनाने वाले नकल करते जा सकता है।

if($_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') { 
//Request identified as ajax request 
} 

हालांकि आप इस चेक पर अपने सुरक्षा का आधार कभी नहीं करना चाहिए: आप अगर अनुरोध एक अजाक्स अनुरोध आप उपयोग कर सकते है को देखने के लिए एक बुनियादी जाँच करना चाहते हैं। यह पृष्ठ पर सीधे पहुंच को समाप्त करेगा यदि आपको यही चाहिए।

कृपया ध्यान में Jeremy Ruten भी द्वारा इस उत्तर ले:

की गारंटी है कि वे इसे AJAX के माध्यम से एक्सेस कर रहे हैं का कोई तरीका नहीं है। दोनों प्रत्यक्ष पहुंच और AJAX पहुंच क्लाइंट से आती है, इसलिए यह आसानी से फ़ेक हो सकती है।

आप इसे वैसे भी क्यों करना चाहते हैं?

यदि ऐसा इसलिए है क्योंकि PHP कोड बहुत सुरक्षित नहीं है, तो PHP कोड को और अधिक सुरक्षित बनाएं। चर्चा ऊपर लिंक में (उदाहरण के लिए, यदि आपका AJAX PHP फ़ाइल के लिए प्रयोक्ता आईडी गुजरता है, तो PHP फ़ाइल में लिखने कोड सुनिश्चित करें कि सही प्रयोक्ता आईडी है कि बनाने के लिए।)

अधिक चतुर विचार ।

+0

तो किसी को इस पृष्ठ को XMLHttpRequest के साथ कैसे एक्सेस करना चाहिए? क्या आप एक ही मूल नीति के बारे में जानते हैं? – rook

+0

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

1

यह आसान नहीं है और संभवतः ऐसा करने का कोई तरीका नहीं है। आपको अपनी PHP फ़ाइल में कुछ पोस्ट चर की आवश्यकता हो सकती है और उन्हें अपने AJAX अनुरोध में भेज सकते हैं। यह आपको किसी ऐसे व्यक्ति से सुरक्षित करेगा जो आसानी से अपने ब्राउज़र में यूआरएल पेस्ट करेगा।

कोई भी आपकी साइट को अन्य डोमेन (सुरक्षा समस्या) से AJAX नहीं कर सकता है, लेकिन हमेशा कनेक्ट और drieclty http अनुरोध भेज सकता है, उदाहरण के लिए curl द्वारा।

आप कुकीज़ में कुछ टोकन बना सकते हैं, जो jquery अनुरोध से भी देखा जाएगा, लेकिन उस समाधान को भी हैक किया जा सकता है।

2

आप भी hotlinking ब्लॉक सकता है यदि आप चिंतित हैं कि दूसरों को अपनी मंजूरी के बिना अपनी सामग्री का उपयोग हो सकता है

देखें: http://www.htmlbasix.com/disablehotlinking.shtml

2

जावास्क्रिप्ट अन्य डोमेन पर चल रहे अपने डोमेन के ऐसे पृष्ठ का उपयोग नहीं कर सकते क्योंकि यह एक है Same-Origin Policy का उल्लंघन। हमलावर को इसे खींचने के लिए एक एक्सएसएस भेद्यता का फायदा उठाने की आवश्यकता होगी। संक्षेप में आपको इस विशिष्ट हमले के बारे में चिंता करने की आवश्यकता नहीं है, केवल वही पुराने हमले जो हर वेब एप्लिकेशन को प्रभावित करते हैं।

5

सुरक्षित कनेक्शन AJAX और PHP के लिए कुछ तरीके आवश्यक हैं। आप उपयोग कर सकते

if(@isset($_SERVER['HTTP_REFERER']) && $_SERVER['HTTP_REFERER']=="http://yourdomain/ajaxurl") 
{ 
//Request identified as ajax request 
} 

न php फ़ाइल को सुरक्षित करने के क्योंकि साथ cURL हेडर धोखा दे सकते हैं भूल जाते हैं।

53

बहुत कुछ googling के बाद निष्कर्ष निकाला!

चरण -1: सभी वेब सेवा के लिए टोकन सिस्टम जनरेट करें:

उत्पन्न टोकन:

<?php 
    session_start(); 
    $token = md5(rand(1000,9999)); //you can use any encryption 
    $_SESSION['token'] = $token; //store it as session variable 
?> 

चरण -2:

: यह ajax कॉल भेजने जबकि प्रयोग करें
var form_data = { 
    data: $("#data").val(), //your data being sent with ajax 
    token:'<?php echo $token; ?>', //used token here. 
    is_ajax: 1 
}; 

$.ajax({ 
    type: "POST", 
    url: 'yourajax_url_here', 
    data: form_data, 
    success: function(response) 
    { 
    //do further 
    } 
}); 

चरण -3 : अब,, के साथ ajax हैंडलर PHP फ़ाइल को सुरक्षित करते हैं

session_start(); //most of people forget this while copy pasting code ;) 
if($_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') { 
    //Request identified as ajax request 

    if(@isset($_SERVER['HTTP_REFERER']) && $_SERVER['HTTP_REFERER']=="http://yourdomain/ajaxurl") 
    { 
    //HTTP_REFERER verification 
    if($_POST['token'] == $_SESSION['token']) { 
     //do your ajax task 
     //don't forget to use sql injection prevention here. 
    } 
    else { 
     header('Location: http://yourdomain.com'); 
    } 
    } 
    else { 
    header('Location: http://yourdomain.com'); 
    } 
} 
else { 
    header('Location: http://yourdomain.com'); 
} 

नोट: नेस्ट IF..ELSE लिए हमें खेद है बढ़ जाती understandability। आप ईएलएसई में सभी तीनों को सरल बना सकते हैं। 85% सुरक्षा बढ़ा दी!

+0

+1 :) –

+0

@ वर्धा-वेब: बहुत बहुत धन्यवाद :) –

+0

$ टोकन = एमडी 5 (रैंड (1000,99 99)); लाइन पृष्ठ को फिर से लोड करने के लिए मेरे स्थानीय PHP 20 सेकंड बनाता है। – arlg

0

बस ऐप्लिकेशन में एक सत्र की स्थापना की और अगर सत्र isset

session_start(); 
if(!isset($_SESSION['gebruikersnaam'])) { 
    header('Location: path/to/app/home'); 
} 
//Do stuff 

आप भी इस का उपयोग कर सकते जाँच:

if(!$_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') { 
header('Location: path/to/app/home'); 
} 

लेकिन सभी ब्राउज़रों का समर्थन HTTP_X_REQUESTED_WITH

कुछ अतिरिक्त सुरक्षा के लिए आप जांच सकते हैं कि AJAX कॉल आपके ऐप

के रूप में आ रहा है या नहीं
if(@isset($_SERVER['HTTP_REFERER']) && $_SERVER['HTTP_REFERER']=="http://yourdomain/path/to/ajax/file") { 
    header('Location: path/to/app/home'); 
} 
संबंधित मुद्दे