PHP $ _SERVER ['HTTP_HOST'] बनाम $ _SERVER ['SERVER_NAME'], क्या मैं मैन पेज को सही ढंग से समझ रहा हूं?


Answers

बस एक अतिरिक्त नोट - यदि सर्वर 80 से अधिक बंदरगाह पर चलता है (जैसा कि विकास / इंट्रानेट मशीन पर सामान्य हो सकता है) तो HTTP_HOST में पोर्ट होता है, जबकि SERVER_NAME नहीं करता है।

$_SERVER['HTTP_HOST'] == 'localhost:8080'
$_SERVER['SERVER_NAME'] == 'localhost'

(कम से कम यही है जो मैंने अपाचे पोर्ट-आधारित वर्चुअलहोस्ट में देखा है)

चूंकि माइक ने नीचे उल्लेख किया है, HTTP_HOST शामिल नहीं है :443 HTTPS पर चलते समय (जब तक कि आप एक गैर मानक पोर्ट पर चल रहे हों, जिसे मैंने परीक्षण नहीं किया है)।

Question

मैंने बहुत सी खोज की और PHP $_SERVER दस्तावेज़ भी पढ़े। क्या मेरे पास इस साइट पर उपयोग की जाने वाली सरल लिंक परिभाषाओं के लिए मेरे PHP स्क्रिप्ट के लिए उपयोग करने का अधिकार है?

$_SERVER['SERVER_NAME'] आपके वेब सर्वर कॉन्फ़िगरेशन फ़ाइल (मेरे मामले में $_SERVER['SERVER_NAME'] पर आधारित है, और कुछ निर्देशों के आधार पर भिन्न होता है: (1) वर्चुअलहोस्ट, (2) सर्वरनाम, (3) UseCanonicalName, आदि।

$_SERVER['HTTP_HOST'] क्लाइंट से अनुरोध पर आधारित है।

इसलिए, मुझे लगता है कि मेरी स्क्रिप्ट को यथासंभव संगत बनाने के लिए उपयोग करने के लिए उचित एक $_SERVER['HTTP_HOST'] । क्या यह धारणा सही है?

अनुवर्ती टिप्पणियां:

मुझे लगता है कि इस लेख को पढ़ने के बाद मुझे थोड़ा पागलपन मिला और यह नोट करते हुए कि कुछ लोगों ने कहा "वे किसी भी $_SERVER युद्धों पर भरोसा नहीं करेंगे":

स्पष्ट रूप से चर्चा मुख्य रूप से लगभग $_SERVER['PHP_SELF'] और आपको XSS हमलों को रोकने के लिए उचित भागने के बिना फॉर्म एक्शन विशेषता में इसका उपयोग क्यों नहीं करना चाहिए।

उपरोक्त मेरे मूल प्रश्न के बारे में मेरा निष्कर्ष यह है कि एक्सएसएस हमलों के बारे में चिंता किए बिना साइट पर सभी लिंक के लिए $_SERVER['HTTP_HOST'] का उपयोग करने के लिए "सुरक्षित" है, यहां तक ​​कि फ़ॉर्म में उपयोग किए जाने पर भी।

कृपया मुझे सुधारें अगर मैं गलत हूं।




यदि आप $_SERVER['HTTP_HOST'] , $_SERVER['SERVER_NAME'] या $_SERVER['PHP_SELF'] उपयोग करते हैं तो भी XSS हमेशा रहेगा




या तो प्रयोग करें। वे दोनों समान रूप से सुरक्षित हैं, क्योंकि कई मामलों में SERVER_NAME को HTTP_HOST से अभी भी पॉप्युलेट किया गया है। मैं आमतौर पर HTTP_HOST के लिए जाता हूं, ताकि उपयोगकर्ता उस सटीक होस्ट नाम पर रहता है जिस पर उन्होंने शुरुआत की थी। उदाहरण के लिए यदि मेरे पास .com और .org डोमेन पर एक ही साइट है, तो मैं किसी को .org से .com से नहीं भेजना चाहता, विशेष रूप से यदि उनके पास .org पर लॉगिन टोकन हो सकते हैं जो उन्हें भेजे जाने पर खो देंगे दूसरा डोमेन

किसी भी तरह से, आपको बस यह सुनिश्चित करने की आवश्यकता है कि आपका वेबपैप कभी भी ज्ञात-अच्छे डोमेन के लिए जवाब देगा। यह या तो किया जा सकता है (ए) गम्बो की तरह एक एप्लिकेशन-साइड चेक के साथ, या (बी) डोमेन नाम (ओं) पर वर्चुअल होस्ट का उपयोग करके जो अज्ञात होस्ट हेडर देने वाले अनुरोधों का जवाब नहीं देता है।

इसका कारण यह है कि यदि आप किसी भी पुराने नाम के तहत अपनी साइट को एक्सेस करने की अनुमति देते हैं, तो आप स्वयं को DNS रिबाइंडिंग हमलों के लिए खोलते हैं (जहां एक अन्य साइट का होस्टनाम आपके आईपी को इंगित करता है, उपयोगकर्ता उपयोगकर्ता को आक्रमणकर्ता के होस्टनाम के साथ एक्सेस करता है, फिर होस्टनाम हमलावर के आईपी में ले जाया जाता है, जिसमें आपकी कुकीज़ / ऑथ ले जाया जाता है) और खोज इंजन अपहरण (जहां एक हमलावर आपकी साइट पर अपना स्वयं का होस्टनाम इंगित करता है और खोज इंजन को 'सर्वश्रेष्ठ' प्राथमिक होस्टनाम के रूप में देखने की कोशिश करता है)।

स्पष्ट रूप से चर्चा मुख्य रूप से लगभग $ _SERVER ['PHP_SELF'] है और आपको XSS हमलों को रोकने के लिए उचित भागने के बिना फॉर्म एक्शन विशेषता में इसका उपयोग क्यों नहीं करना चाहिए।

Pfft। खैर आपको htmlspecialchars($string, ENT_QUOTES) बचने के बिना किसी भी विशेषता में कुछ भी उपयोग नहीं करना चाहिए, इसलिए वहां सर्वर चर के बारे में कुछ खास नहीं है।




एक्सएसएसएस हमलों के बारे में चिंता किए बिना साइट पर सभी लिंक के लिए $_SERVER['HTTP_HOST'] का उपयोग करने के लिए यह "सुरक्षित" है, भले ही फ़ॉर्म में उपयोग किया जाए?

हां, जब तक आप उन्हें स्वीकार करने से पहले उन्हें सत्यापित करते हैं, तब तक $_SERVER['HTTP_HOST'] , (और यहां तक ​​कि $_GET और $_POST ) का उपयोग करना safe है। सुरक्षित उत्पादन सर्वर के लिए मैं यही करता हूं:

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
$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 विश्वसनीय भरोसेमंद व्यवहार का उपयोग करके इसे कार्यान्वित करेंगे। ( दूसरे के विपरीत।) हालांकि, यह अभी भी पूरी तरह से ➫➫ निर्भर है ➫➫ :

इस बात की कोई गारंटी नहीं है कि प्रत्येक वेब सर्वर इनमें से कोई भी [ $_SERVER प्रविष्टियां] प्रदान करेगा; सर्वर कुछ छोड़ सकते हैं, या दूसरों को यहां सूचीबद्ध नहीं कर सकते हैं।

होस्ट नाम को सही तरीके से पुनर्प्राप्त करने के तरीके को समझने के लिए, सबसे पहले और सबसे महत्वपूर्ण आपको यह समझने की आवश्यकता है कि केवल एक कोड वाले सर्वर को नेटवर्क पर अपना नाम जानने (पूर्व सत्यापन के लिए पूर्व-आवश्यकता) का कोई माध्यम नहीं है। इसे एक घटक के साथ इंटरफ़ेस करने की आवश्यकता है जो इसे अपना नाम प्रदान करे। यह के माध्यम से किया जा सकता है:

  • स्थानीय विन्यास फाइल

  • स्थानीय डेटाबेस

  • हार्डकोडेड स्रोत कोड

  • बाहरी अनुरोध ( curl )

  • ग्राहक / हमलावर का Host: अनुरोध

  • आदि

आमतौर पर यह स्थानीय (एसएपीआई) कॉन्फ़िगरेशन फ़ाइल के माध्यम से किया जाता है। ध्यान दें कि आपने इसे सही तरीके से कॉन्फ़िगर किया है, उदाहरण के लिए अपाचे ➫➫ :

डायनामिक आभासी होस्ट सामान्य की तरह दिखने के लिए कुछ चीजों को 'फिक्र' करने की आवश्यकता है।

सर्वर का नाम सबसे महत्वपूर्ण है जिसका उपयोग अपाचे द्वारा स्व-रेफरेंशियल यूआरएल उत्पन्न करने के लिए किया जाता है, आदि। यह SERVER_NAME निर्देश के साथ कॉन्फ़िगर किया गया है, और यह SERVER_NAME पर्यावरण चर के माध्यम से CGI के लिए उपलब्ध है।

रन टाइम पर उपयोग किया जाने वाला वास्तविक मान UseCanonicalName सेटिंग द्वारा नियंत्रित होता है।

UseCanonicalName Off साथ सर्वर का नाम Host: की सामग्री से आता है Host: अनुरोध में शीर्षलेख। UseCanonicalName DNS साथ यह वर्चुअल होस्ट के आईपी पते के रिवर्स DNS लुकअप से आता है। पूर्व सेटिंग का नाम नाम-आधारित गतिशील आभासी होस्टिंग के लिए किया जाता है, और बाद वाला ** आईपी-आधारित होस्टिंग के लिए उपयोग किया जाता है।

यदि अपाचे सर्वर नाम का काम नहीं कर सकता है क्योंकि कोई Host: नहीं है Host: हेडर या DNS लुकअप विफल रहता है तो सर्वर नाम के साथ कॉन्फ़िगर किया गया मान इसके बजाए उपयोग किया जाता है।