2009-09-08 13 views
9

तक पहुंच गया है मैंने हाल ही में PHP में भारी AJAX समर्थित स्क्रिप्ट को कोड करना शुरू कर दिया है, बात यह है कि AJAX कॉल द्वारा एक्सेस की जा रही फ़ाइलों को सीधे भी उपयोग किया जा सकता है, इसे कैसे अक्षम किया जाए?AJAX केवल

उत्तर

21

आप इसे विश्वसनीय रूप से होने से रोक नहीं सकते हैं। कुंजी वास्तव में इस फ़ाइल को किसी सुरक्षा समस्या के रूप में सीधे एक्सेस करने पर विचार नहीं करना है - इसके लिए योजना संभव है और आप एक और अधिक सुरक्षित स्थान पर होंगे।

if(!empty($_SERVER['HTTP_X_REQUESTED_WITH']) 
    && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') { 
    // more code here 
} 

हालांकि, इस मामले के तथ्य यह है कि HTTP हेडर काफी आसानी से जाली जा सकता है और कोड हासिल करने का एक साधन नहीं हैं:

कुछ लोगों को कोड है कि इस (या समान) की तरह दिखता है की सिफारिश कर सकते हैं। एक व्यस्त साइट पर मेरे परीक्षण में कुछ समय पहले मैंने देखा कि ये हेडर वास्तव में विश्वसनीय नहीं हैं।

+0

स्पॉट ऑन। वैकल्पिक रूप से, आप पैरामीटर (उदा। '? AJAX') पास कर सकते हैं, लेकिन यह धोखा देने के लिए भी आसान है। –

0

सीधे पहुंच को अस्वीकार करने का कोई तरीका नहीं है। चूंकि एक प्रश्न हमेशा आपके द्वारा आने वाले किसी भी मानदंड से मेल खाने के लिए तैयार किया जा सकता है।

XmlHttpRequest सर्वर यह एक हैडर जो की तरह कुछ का उपयोग कर पता लगाया जा सकता कहते हैं क्वेरी करने के लिए इस्तेमाल किया जा रहा है, तो: अपने आवेदन में

/* AJAX check */ 
if(!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') { 
    //Do something here 
} 
-1

उपयोग सत्र।

संपादन:

  1. एक सत्र में अपनी साइट रजिस्टर, मैं उस के लिए UUIDs का उपयोग करें।

  2. एक ही मूल्य के साथ एक कुकी सेट करें, जिसे आप सत्र में उपयोग करते हैं।

  3. अपने AJAX-अनुरोध को पैरामीटर के साथ भेजें जिसमें यह मान भी शामिल है।

  4. सत्र, कुकी और पैरामीटर से मूल्यों की तुलना करें।

+0

मेरे उत्तर में क्या गलत है? – Joerg

+0

मैंने आपको वोट नहीं दिया, लेकिन यह अभी भी जाने का कोई विश्वसनीय तरीका नहीं है। यह लागू करने के लिए काफी सुविधाजनक हो सकता है, लेकिन यह भी धोखा दिया जा सकता है। – Boldewyn

6

जैसा कि अन्य लोगों ने अपने उत्तरों में सुझाव दिया है, यह संभव नहीं है। यह कंप्यूटर सुरक्षा के खंभे सिद्धांतों में से एक है: आप कभी भी ग्राहक पर भरोसा नहीं कर सकते हैं। यही कारण है कि हम ग्राहक से सभी इनपुट मान्य करते हैं, आदि

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

ओह, और तथ्य यह है कि वेब सेवाएं खुली हैं एक अच्छी बात है! आप अपने उपयोगकर्ताओं के लिए एक खुली एपीआई प्रदान कर रहे हैं, जो बहुत साफ है! हो सकता है कि आप अपने समुदाय को लॉक करने की कोशिश करने के बजाय इसे गले लगाएं - उन्हें अपनी सेवाओं के साथ इंटरफेस करने के तरीके पर कुछ दस्तावेज दें और वे अधिक क्लाइंट बनाएंगे। आईफोन एसडीके खरीदने और ऑब्जेक्टिव सी सीखने में समय व्यतीत करने के बजाय, आपके उपयोगकर्ताओं में से एक हो सकता है।

+1

यह संभव है, लेकिन विश्वसनीय नहीं है। इसके अलावा, सभी मान्य अंक –

0

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

<script type="text/javascript"> 
    window.csrf_key = '<?php $user->getCsrf(); ?>'; 
</script> 

इस मामले आप लोगों फ़ाइलों के लिए अनुरोध गुजर बारे में चिंता करने की ज़रूरत नहीं होगी में सीधे, आप कुंजी को सुरक्षित रखने, कार्यों आह्वान और विवेक के चेक करने के लिए पदों का प्रयोग तभी करें।