2010-04-05 15 views
5

मेरे पास एक PHP स्क्रिप्ट है जो HTTP रेफरर की जांच करती है।

if ($_SERVER['HTTP_REFERER'] == 'http://www.example.com/') {...} 

हालांकि, इस inherintly असुरक्षित लगता है ... क्योंकि क्या होता है उपयोगकर्ता 'http://example.com/' या 'http://www.ExaMple.com' (जो दोनों के समानता परीक्षण से मेल नहीं खाते) में जाता है।

प्रश्न: यह सुनिश्चित करने के लिए एक बेहतर समानता परीक्षण क्या है कि HTTP रेफरर 'example.com' से आ रहा है?

+0

बन आप रक्षा के लिए यह प्रयोग कर रहे हैं चाहते हैं? यह कैसे मदद कर सकता है? –

+0

यह रक्षा की पहली पंक्ति है (विशेष रूप से मुझे पता है कि रेफरर को धोखा दिया जा सकता है)। यह किसी भी चीज को सुरक्षित नहीं रख रहा है, लेकिन साथ ही, मैं नहीं चाहता कि लोग सीधे इसे कॉल करके मेरी webservice का दुरुपयोग कर रहे हों। लोगों को अर्द्ध ईमानदार रखने के लिए यह अधिक मतलब है। – Hank

+0

कोई उपयोगकर्ता tamper डेटा का उपयोग करके http_referer को नियंत्रित कर सकता है। हालांकि, सीएसआरएफ हमले में रेफरर का इस्तेमाल "जाली" नहीं किया जा सकता है। – rook

उत्तर

1

अनिवार्य प्रतिक्रिया: HTTP_REFERER को धोखा दिया जा सकता है इसलिए 100% सुनिश्चित करने का कोई तरीका नहीं है कि कोई भी किसी विशिष्ट वेबसाइट से आया हो।

हालांकि यदि आप इस पर भरोसा करना चाहते हैं तो आप HTTP_REFERER में "example.com" देखने के लिए रेगेक्स का उपयोग कर सकते हैं। stristr() भी काम करेगा, और शायद इसकी सिफारिश की जाएगी क्योंकि यह तेजी से एक regex होगा। यह भी असंवेदनशील मामला है तो यह "ExaMple.com" के साथ-साथ 'example.com "।

+0

मुझे पता है, धन्यवाद। लेकिन यह सवाल नहीं है। – Hank

+0

(यह अभी भी रक्षा की एक सभ्य पहली पंक्ति है, लेकिन इसे ध्यान में रखते हुए धन्यवाद) – Hank

+1

लेकिन * स्ट्रिस्टर * "notmyExample.com" पर भी मेल नहीं करेगा जो अवांछित होगा? – Hank

1

आशा है कि आप कुछ भी महत्वपूर्ण के लिए यह जांच नहीं करते।

parse_url

आप उपयोग कर सकते हैं() फ़ंक्शन से मेल प्राप्त करने के लिए होगा होस्टनाम हिस्सा है और अगर HTTP_REFERER वास्तव में uRL नहीं होना चाहिए की जाँच करने के।
आप भी सिर्फ substr कर सकते हैं www। होस्ट नाम से।
चरित्र मामला महत्वपूर्ण नहीं है यह हमेशा लोअरकेस के रूप में

या एक regexp का उपयोग करें।

0
if (strtolower($_SERVER['HTTP_REFERER']) == 'http://www.example.com/') {...} 

कैसा रहेगा ...

$parts = explode('/',$_SERVER['HTTP_REFERER']); 
if (in_array('example.com',$parts) || in_array('www.example.com',$parts)) {...} 
+1

सुनिश्चित नहीं है कि यह हर समय काम करेगा क्योंकि यह मानता है 1) एक पिछला स्लैश, 2) कि "www।" सीधे उपयोगकर्ता के लिए http://example.com – Hank

+0

URL पर जाने के बजाए मौजूद है, यूआरएल हमेशा कैनोनिकलकृत किया जाना चाहिए, यानी माध्यमिक डोमेन को प्राथमिक एक पर रीडायरेक्ट करें (जब एकाधिक डोमेन का उपयोग किया जाता है)। http://en.wikipedia.org/wiki/Cononicalization – jholster

+0

@Hank - मेरा उत्तर दोबारा जांचें ... –

3

parse_url() स्ट्रिंग करतब दिखाने का एक सा के साथ संयुक्त आप क्या चाहते हैं क्या करना चाहिए। इस प्रयास करें:

$url = parse_url($_SERVER['HTTP_REFERER']); 
//take the last two 'dot segments' of the host 
$hostOnly = implode('.',array_slice(explode('.',$url['host']),-2)); 
if (strtolower($hostOnly) == 'example.com') { 
    //stuff 
} 

ध्यान दें कि parse_url(), बुरी तरह से गठन यूआरएल पर असफल हो सकता है तो आप सुरक्षित रहने के लिए जाँच कुछ त्रुटि को जोड़ने के लिए चाहते हो सकता है। HTTP_REFERER आसानी से जंक से भरा जा सकता है।

0

एक regex का उपयोग करना, इस

if(preg_match("%(http://)?(www\.)?example\.com(/)?%i",$_SERVER['HTTP_REFERER'])) { ... } 
संबंधित मुद्दे