[Php] यह पता लगाने के लिए कि क्या आप $ _SERVER ['HTTPS' के बिना HTTPS का उपयोग कर रहे हैं)


Answers

यह हमेशा काम करना चाहिए जब $_SERVER['HTTPS'] अपरिभाषित है:

function isSecure() {
  return
    (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off')
    || $_SERVER['SERVER_PORT'] == 443;
}

कोड आईआईएस के साथ संगत है।

PHP.net दस्तावेज़ और उपयोगकर्ता टिप्पणियों से :

1) यदि एचटीटीपीएस प्रोटोकॉल के माध्यम से लिपि पूछताछ की गई तो एक खाली मूल्य पर सेट करें।

2) ध्यान दें कि आईआईएसआई के साथ आईएसएपीआई का उपयोग करते समय, एचटीटीपीएस प्रोटोकॉल के माध्यम से अनुरोध नहीं किया गया था, तो मान "बंद" होगा। (आईआईएस 7 के लिए फास्ट-सीजीआई एप्लिकेशन के रूप में चल रहे PHP के लिए वही व्यवहार की सूचना दी गई है)।

इसके अलावा, अपाचे 1.x सर्वर (और टूटी हुई इंस्टॉलेशन) में सुरक्षित रूप से कनेक्ट होने पर भी $_SERVER['HTTPS'] परिभाषित नहीं हो सकता है। हालांकि गारंटी नहीं है, पोर्ट 443 पर कनेक्शन, convention द्वारा, संभावित सॉकेट का उपयोग करने की संभावना है, इसलिए अतिरिक्त पोर्ट चेक।

Question

मैंने ऑनलाइन कई ट्यूटोरियल देखे हैं जो कहते हैं कि यदि सर्वर कनेक्शन एचटीटीपीएस से सुरक्षित है तो आपको $_SERVER['HTTPS'] जांच करने की आवश्यकता है। मेरी समस्या यह है कि मेरे द्वारा उपयोग किए जाने वाले कुछ सर्वरों पर, $_SERVER['HTTPS'] एक अपरिभाषित चर है जिसके परिणामस्वरूप त्रुटि होती है। क्या कोई और चर है जो मैं जांच सकता हूं कि हमेशा परिभाषित किया जाना चाहिए?

बस स्पष्ट होने के लिए, मैं वर्तमान में यह कोड उपयोग कर रहा हूं कि यह एक HTTPS कनेक्शन है या नहीं:

if(isset($_SERVER['HTTPS'])) {
    if ($_SERVER['HTTPS'] == "on") {
        $secure_connection = true;
    }
}



यदि आप अपाचे का उपयोग कर रहे हैं तो आप हमेशा पर भरोसा कर सकते हैं

$_SERVER["REQUEST_SCHEME"]

अनुरोध किए गए यूआरएल की योजना को सत्यापित करने के लिए। लेकिन, जैसा कि अन्य उत्तरों में उल्लिखित है, एसएसएल वास्तव में इस्तेमाल होने से पहले अन्य मानकों को सत्यापित करना समझदार है।




मुझे ये पैराम स्वीकार्य भी मिलते हैं और अधिकतर वेब सर्वर स्विच करते समय झूठी सकारात्मक स्थिति नहीं होती है।

  1. $ _SERVER [ 'HTTPS_KEYSIZE']
  2. $ _SERVER [ 'HTTPS_SECRETKEYSIZE']
  3. $ _SERVER [ 'HTTPS_SERVER_ISSUER']
  4. $ _SERVER [ 'HTTPS_SERVER_SUBJECT']

    if($_SERVER['HTTPS_KEYSIZE'] != NULL){/*do foobar*/}
    



यदि आप इंकापुला के लोड बैलेंसर का उपयोग कर रहे हैं तो आपको अपने सर्वर के लिए कस्टम हेडर जेनरेट करने के लिए एक आईरूल का उपयोग करना होगा। मैंने एक HTTP_X_FORWARDED_PROTO शीर्षलेख बनाया है जो पोर्ट को 80 पर सेट किया गया है और "https" अगर यह 443 के बराबर है तो "http" के बराबर है।




आप इस बारे में क्या सोचते है?

if (isset($_SERVER['HTTPS']) && !empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off')
    $scheme = 'https';
else
    $scheme = 'http';



मुझे नहीं लगता कि एक बंदरगाह जोड़ना अच्छा विचार है - खासकर जब आपको विभिन्न बिल्डों के साथ कई सर्वर मिलते हैं। जो बदलने के लिए याद रखने के लिए बस एक और चीज जोड़ता है। डॉक्टर को देखकर मुझे लगता है कि कैसर की आखिरी पंक्ति काफी अच्छी है, ताकि:

if(!empty($_SERVER["HTTPS"]))
  if($_SERVER["HTTPS"]!=="off")
    return 1; //https
  else
    return 0; //http
else
  return 0; //http

पूरी तरह से पर्याप्त लगता है।




मैं सबसे कम रास्ता उपयोग कर रहा हूँ:

$secure_connection = !empty($_SERVER['HTTPS']);

यदि https का उपयोग किया जाता है, तो $ secure_connection सत्य है।




यह तब भी काम करता है जब $_SERVER['HTTPS'] अपरिभाषित है

if( (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off') || $_SERVER['SERVER_PORT'] == 443 ){
    //enable secure connection
}



यदि आप लोडबैंकिंग सिस्टम के रूप में nginx का उपयोग करते हैं तो $ _SERVER ['HTTP_HTTPS'] == 1 अन्य चेक एसएसएल के लिए असफल हो जाएंगे।




मेरे पास एक कदम आगे जाने का अवसर है और यह निर्धारित करना है कि मैं जिस साइट से कनेक्ट कर रहा हूं वह एसएसएल सक्षम है (एक प्रोजेक्ट उपयोगकर्ता को उनके यूआरएल के लिए पूछता है और हमें यह सत्यापित करने की आवश्यकता है कि उन्होंने हमारे एपीआई पैक को http या https साइट पर इंस्टॉल किया है)।

यहां मैं जिस फ़ंक्शन का उपयोग करता हूं - मूल रूप से, यह देखने के लिए कि क्या https काम करता है, बस URL के माध्यम से URL को कॉल करें!

function hasSSL($url) 
{
    // take the URL down to the domain name
    $domain = parse_url($url, PHP_URL_HOST);
    $ch = curl_init('https://' . $domain);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'HEAD'); //its a  HEAD
    curl_setopt($ch, CURLOPT_NOBODY, true);          // no body
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);  // in case of redirects
    curl_setopt($ch, CURLOPT_VERBOSE, 0); //turn on if debugging
    curl_setopt($ch, CURLOPT_HEADER, 1);     //head only wanted
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);    // we dont want to wait forever
    curl_exec($ch);
    $header = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    if ($header === 200) {
        return true;
    }
    return false;
}

यह सबसे भरोसेमंद तरीका है जिसे मैंने न केवल यह पाया है कि यदि आप https का उपयोग कर रहे हैं (जैसा सवाल पूछता है), लेकिन यदि आप https (या यहां तक ​​कि भी होना चाहिए) https का उपयोग कर रहे हैं।

नोट: यह संभव है (यद्यपि वास्तव में संभव नहीं है ...) कि एक साइट के पास अलग-अलग http और https पृष्ठ हो सकते हैं (इसलिए यदि आपको http का उपयोग करने के लिए कहा जाता है, तो शायद आपको बदलने की आवश्यकता नहीं है ..) साइट्स का विशाल बहुमत वही हैं, और शायद आपको खुद को फिर से शुरू करना चाहिए, लेकिन इस अतिरिक्त चेक का उपयोग है (निश्चित रूप से जैसा कि मैंने कहा था, उस परियोजना में जहां उपयोगकर्ता अपनी साइट जानकारी इनपुट करता है और आप सर्वर की ओर से सुनिश्चित करना चाहते हैं)




अपने पिछले कार्य को सभी पिछली पोस्ट पढ़ने से बनाना:

public static function isHttps()
{
    if (array_key_exists("HTTPS", $_SERVER) && 'on' === $_SERVER["HTTPS"]) {
        return true;
    }
    if (array_key_exists("SERVER_PORT", $_SERVER) && 443 === (int)$_SERVER["SERVER_PORT"]) {
        return true;
    }
    if (array_key_exists("HTTP_X_FORWARDED_SSL", $_SERVER) && 'on' === $_SERVER["HTTP_X_FORWARDED_SSL"]) {
        return true;
    }
    if (array_key_exists("HTTP_X_FORWARDED_PROTO", $_SERVER) && 'https' === $_SERVER["HTTP_X_FORWARDED_PROTO"]) {
        return true;
    }
    return false;
}