PHP
क्लाइंट आईपी एड्रेस का पता कैसे लगाएं
खोज…
HTTP_X_FORWARDED_FOR का उचित उपयोग
नवीनतम httpoxy कमजोरियों के प्रकाश में, एक और चर है, जिसका व्यापक रूप से दुरुपयोग किया जाता है।
HTTP_X_FORWARDED_FOR
का उपयोग अक्सर क्लाइंट IP पते का पता लगाने के लिए किया जाता है, लेकिन बिना किसी अतिरिक्त जांच के, इससे सुरक्षा समस्याएं हो सकती हैं, खासकर जब यह आईपी बाद में प्रमाणीकरण के लिए या SQL प्रश्नों में बिना स्वच्छता के लिए उपयोग किया जाता है।
उपलब्ध अधिकांश कोड नमूने इस तथ्य की अनदेखी करते हैं कि HTTP_X_FORWARDED_FOR
को वास्तव में ग्राहक द्वारा प्रदान की गई जानकारी के रूप में माना जा सकता है और इसलिए क्लाइंट आईपी पते का पता लगाने के लिए एक विश्वसनीय स्रोत नहीं है। कुछ नमूने संभावित दुरुपयोग के बारे में एक चेतावनी जोड़ते हैं, लेकिन अभी भी कोड में किसी भी अतिरिक्त जांच का अभाव है।
तो यहाँ PHP में लिखे फ़ंक्शन का एक उदाहरण है कि कैसे एक ग्राहक आईपी पते का पता लगाया जाए, यदि आप जानते हैं कि क्लाइंट एक प्रॉक्सी के पीछे हो सकता है और आप जानते हैं कि इस प्रॉक्सी पर भरोसा किया जा सकता है। यदि आप किसी भरोसेमंद प्रॉक्सी को नहीं जानते हैं, तो आप बस REMOTE_ADDR
उपयोग कर सकते हैं
function get_client_ip()
{
// Nothing to do without any reliable information
if (!isset($_SERVER['REMOTE_ADDR'])) {
return NULL;
}
// Header that is used by the trusted proxy to refer to
// the original IP
$proxy_header = "HTTP_X_FORWARDED_FOR";
// List of all the proxies that are known to handle 'proxy_header'
// in known, safe manner
$trusted_proxies = array("2001:db8::1", "192.168.50.1");
if (in_array($_SERVER['REMOTE_ADDR'], $trusted_proxies)) {
// Get IP of the client behind trusted proxy
if (array_key_exists($proxy_header, $_SERVER)) {
// Header can contain multiple IP-s of proxies that are passed through.
// Only the IP added by the last proxy (last IP in the list) can be trusted.
$client_ip = trim(end(explode(",", $_SERVER[$proxy_header])));
// Validate just in case
if (filter_var($client_ip, FILTER_VALIDATE_IP)) {
return $client_ip;
} else {
// Validation failed - beat the guy who configured the proxy or
// the guy who created the trusted proxy list?
// TODO: some error handling to notify about the need of punishment
}
}
}
// In all other cases, REMOTE_ADDR is the ONLY IP we can trust.
return $_SERVER['REMOTE_ADDR'];
}
print get_client_ip();