PHP में Referer का निर्धारण


102

वर्तमान पृष्ठ किस पृष्ठ को या तो भेजा गया है, या इसे (AJAX के माध्यम से) निर्धारित करने का सबसे विश्वसनीय और सुरक्षित तरीका है। मैं $_SERVER['HTTP_REFERER']विश्वसनीयता की कमी () की वजह से, का उपयोग नहीं करना चाहता , और मुझे पृष्ठ की आवश्यकता है जो केवल मेरी साइट पर आने वाले अनुरोधों से आता है।

संपादित करें: मैं यह सत्यापित करना चाह रहा हूं कि एक स्क्रिप्ट जो क्रियाओं की एक श्रृंखला को सुधारती है, उसे मेरी वेबसाइट पर एक पृष्ठ से बुलाया जा रहा है।


5
आप $ _SERVER ['HTTP_REFERER'] विश्वसनीय क्यों नहीं कहते हैं?
मिलान बाबूसकोव

9
PHP कार्यान्वयन विश्वसनीय है। समस्या यह है कि कभी भी ब्राउज़र इसे नहीं भेज रहा है, और यदि आप चाहें तो आप इसे संशोधित भी कर सकते हैं। इसलिए यह विश्वसनीय नहीं है कि क्लाइंट की तरफ से सही है।
बिरी

2
एक संभावित तरीका यह है कि अपने पृष्ठ के एक क्षेत्र में एक अद्वितीय कुंजी (जैसे। एक GUID) डालें, और अगले अनुरोध में इसे वापस भेजें।
फीलोहो

सर्वर का आईपी पता और उपयोग करें $_SERVER[REMOTE_ADDR]

जवाबों:


93

REFERER क्लाइंट के ब्राउज़र द्वारा HTTP प्रोटोकॉल के हिस्से के रूप में भेजा जाता है, और इसलिए वास्तव में अविश्वसनीय है। यह वहाँ नहीं हो सकता है, यह जाली हो सकता है, अगर आप सुरक्षा कारणों से यह भरोसा नहीं कर सकते हैं।

यदि आप यह सत्यापित करना चाहते हैं कि आपकी साइट से कोई अनुरोध आ रहा है या नहीं, तो आप नहीं कर सकते, लेकिन आप सत्यापित कर सकते हैं कि उपयोगकर्ता आपकी साइट पर गया है और / या प्रमाणित है। AJAX अनुरोधों में कुकीज़ भेजी जाती हैं ताकि आप उस पर भरोसा कर सकें।


5
यदि आप इस विधि का उपयोग करना चाहते हैं, तो आपको CSRF en.wikipedia.org/wiki/Cross-site_request_forgery
JD Isaacks

17
आदर्श रूप से आपको CSRF हमलों को रोकने के लिए प्रति उपयोगकर्ता एक अद्वितीय टोकन प्रति सत्र (प्रति अनुरोध यदि आप पागल हैं) का उपयोग करना चाहिए। रेफ़रर की जाँच करना ओफ़्फ़केशन द्वारा सिर्फ़ सुरक्षा है और वास्तविक समाधान नहीं है।
सेलडेक

3
@Seldaek नहीं, रेफ़र की जाँच करना 'सुरक्षा द्वारा आक्षेप नहीं है'। CSRF हमले को करने का प्रयास करने वाला एक हमलावर पीड़ित के ब्राउज़र द्वारा भेजे गए रेफ़र को नियंत्रित नहीं कर सकता है, इसलिए यह जाँचने से CSRF के विरुद्ध सुरक्षा होती है । हालाँकि, मैं आपके निष्कर्ष पर खड़ा रहूंगा कि आपको इसके बजाय CSRF टोकन का उपयोग करना चाहिए, क्योंकि संदर्भ-जाँच दृष्टिकोण में आपको असुरक्षित छोड़ने सहित नुकसान है , यदि आप अपनी साइट पर एक खुला पुनर्निर्देशन करते हैं और उपयोगकर्ता एजेंटों के लिए तोड़ रहे हैं जो संदर्भकर्ता को पट्टी करते हैं।
मार्क अमेरी

@MarkAmery यह सब इस बात पर निर्भर करता है कि आप किस चीज़ का बचाव करना चाह रहे हैं, लेकिन क्लाइंट-विशिष्ट http हेडर का उपयोग करना कुल मिलाकर एक बहुत मजबूत सुरक्षा मॉडल नहीं है।
सेलडेक

23

मैंने जो सबसे अच्छा पाया है वह एक सीएसआरएफ टोकन है और इसे उन सत्रों के लिए सत्र में सहेजें जहां आपको रेफरल को सत्यापित करने की आवश्यकता है।

इसलिए यदि आप FB कॉलबैक उत्पन्न कर रहे हैं तो यह कुछ इस तरह दिखाई देगा:

$token = uniqid(mt_rand(), TRUE);
$_SESSION['token'] = $token;
$url = "http://example.com/index.php?token={$token}";

फिर index.php इस तरह दिखेगा:

if(empty($_GET['token']) || $_GET['token'] !== $_SESSION['token'])
{
    show_404();
} 

//Continue with the rest of code

मुझे उन सुरक्षित साइटों के बारे में पता है जो उनके सभी सुरक्षित पृष्ठों के लिए इसके बराबर काम करती हैं।


1
यहाँ CSRF टोकन पर अधिक के लिए एक लिंक दिया गया है: en.wikipedia.org/wiki/Cross-site_request_forgery
We0

7
क्या आप सुनिश्चित हैं कि यह है $_GET['token'] == $_SESSION['token']और नहीं $_GET['token'] !== $_SESSION['token']?
टिमो हुओवेनन

17

$ _SERVER ['HTTP_REFERER'] का उपयोग करना

पृष्ठ का पता (यदि कोई है) जो उपयोगकर्ता एजेंट को वर्तमान पृष्ठ पर भेजा गया है। यह उपयोगकर्ता एजेंट द्वारा निर्धारित किया गया है। सभी उपयोगकर्ता एजेंट इसे सेट नहीं करेंगे, और कुछ HTTP_REFERER को एक सुविधा के रूप में संशोधित करने की क्षमता प्रदान करते हैं। संक्षेप में, यह वास्तव में भरोसा नहीं किया जा सकता है।

if (!empty($_SERVER['HTTP_REFERER'])) {
    header("Location: " . $_SERVER['HTTP_REFERER']);
} else {
    header("Location: index.php");
}
exit;

0

इसकी जांच का कोई विश्वसनीय तरीका नहीं है। यह वास्तव में ग्राहक के हाथ में है कि आप यह बताएं कि यह कहां से आया है। आप अपनी वेबसाइट के कुछ पन्नों पर ही कुकी या सेशन का उपयोग करने की कल्पना कर सकते हैं, लेकिन ऐसा करने से आपके उपयोगकर्ता अनुभव बुकमार्क के साथ टूट जाएंगे।


0

हमारे पास सभी नकली रेफ़र समस्याओं को पढ़ने के बाद केवल एक ही विकल्प बचा है: यानी जिस पेज को हम रेफ़र के रूप में ट्रैक करना चाहते हैं, उसे सत्र में रखा जाना चाहिए, और अजाक्स के रूप में बुलाया जाता है, तब सत्र में जाँच की जाती है कि क्या यह रेफरल पृष्ठ मान है और कार्रवाई अन्य कोई नहीं कर रहा है कार्रवाई।

जबकि दूसरी ओर जब वह किसी भिन्न पृष्ठ का अनुरोध करता है, तो संदर्भ सत्र को शून्य करने के लिए मूल्य बनाएं।

याद रखें कि सत्र चर केवल इच्छा पृष्ठ अनुरोध पर सेट किया गया है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.