क्या $_SERVER['HTTP_HOST']XSS हमलों के बारे में चिंता किए बिना किसी साइट पर सभी लिंक के लिए उपयोग करना "सुरक्षित" है , यहां तक कि रूपों में भी इस्तेमाल किया जाता है?
हाँ, यह है सुरक्षित उपयोग करने के लिए $_SERVER['HTTP_HOST'], (और यहां तक कि $_GETऔर $_POST) तक आप उन्हें सत्यापित करने के रूप में के रूप में उन्हें स्वीकार करने से पहले। यह मैं सुरक्षित उत्पादन सर्वरों के लिए करता हूं:
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
$reject_request = true;
if(array_key_exists('HTTP_HOST', $_SERVER)){
$host_name = $_SERVER['HTTP_HOST'];
// [ need to cater for `host:port` since some "buggy" SAPI(s) have been known to return the port too, see http://goo.gl/bFrbCO
$strpos = strpos($host_name, ':');
if($strpos !== false){
$host_name = substr($host_name, $strpos);
}
// ]
// [ for dynamic verification, replace this chunk with db/file/curl queries
$reject_request = !array_key_exists($host_name, array(
'a.com' => null,
'a.a.com' => null,
'b.com' => null,
'b.b.com' => null
));
// ]
}
if($reject_request){
// log errors
// display errors (optional)
exit;
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
echo 'Hello World!';
// ...
इसका लाभ $_SERVER['HTTP_HOST']यह है कि इसके व्यवहार की तुलना में अधिक अच्छी तरह से परिभाषित किया गया है $_SERVER['SERVER_NAME']। कंट्रास्ट ➫➫ :
होस्ट की सामग्री: वर्तमान अनुरोध से हेडर, यदि कोई है।
साथ में:
सर्वर होस्ट का नाम जिसके तहत वर्तमान स्क्रिप्ट निष्पादित हो रही है।
एक बेहतर परिभाषित इंटरफ़ेस का उपयोग करने का $_SERVER['HTTP_HOST']अर्थ है कि अधिक SAPI विश्वसनीय विश्वसनीय व्यवहार का उपयोग करके इसे लागू करेंगे । (विपरीत अन्य ।) हालांकि, यह अभी पूरी तरह से SAPI निर्भर है ➫➫ :
इस बात की कोई गारंटी नहीं है कि प्रत्येक वेब सर्वर इनमें से कोई भी [ $_SERVERप्रविष्टियां] प्रदान करेगा ; सर्वर कुछ को छोड़ सकते हैं, या दूसरों को यहां सूचीबद्ध नहीं कर सकते हैं।
यह समझने के लिए कि मेजबान नाम को ठीक से कैसे प्राप्त किया जाए, सबसे पहले और आपको यह समझने की जरूरत है कि एक सर्वर जिसमें केवल कोड होता है, उसके पास नेटवर्क पर अपना नाम जानने का कोई साधन नहीं होता है । इसे एक घटक के साथ इंटरफ़ेस करने की आवश्यकता है जो इसे अपने नाम से आपूर्ति करता है। इसके जरिए किया जा सकता है:
आमतौर पर इसका स्थानीय (SAPI) कॉन्फ़िगरेशन फ़ाइल के माध्यम से किया जाता है। ध्यान दें कि आपने इसे सही तरीके से कॉन्फ़िगर किया है, उदाहरण के लिए Apache configured :
गतिशील वर्चुअल होस्ट को सामान्य की तरह बनाने के लिए कुछ चीजों को 'फेक' होना चाहिए।
सबसे महत्वपूर्ण सर्वर नाम है जो अपाचे द्वारा स्व-संदर्भ URL बनाने के लिए उपयोग किया जाता है, आदि यह ServerNameनिर्देश के साथ कॉन्फ़िगर किया गया है , और यह SERVER_NAMEपर्यावरण चर के माध्यम से सीजीआई के लिए उपलब्ध है ।
रन टाइम पर उपयोग किया जाने वाला वास्तविक मान UseCanonicalName सेटिंग द्वारा नियंत्रित किया जाता है।
साथ UseCanonicalName Off सर्वर नाम की सामग्री से आता Host:अनुरोध में शीर्ष लेख। इसके साथ UseCanonicalName DNS वर्चुअल होस्ट के IP पते के रिवर्स DNS लुकअप से आता है। पूर्व सेटिंग का उपयोग नाम-आधारित गतिशील वर्चुअल होस्टिंग के लिए किया जाता है, और बाद का उपयोग ** आईपी-आधारित होस्टिंग के लिए किया जाता है।
यदि Apache सर्वर नाम का काम नहीं कर सकता है क्योंकि कोई Host:हेडर नहीं है या DNS लुकअप विफल हो जाता है तोServerName इसके साथ कॉन्फ़िगर किए गए मान का उपयोग किया जाता है।