अगर उपयोगकर्ता PHP में लोकलहोस्ट पर है तो मैं कैसे पता लगा सकता हूं?


99

दूसरे शब्दों में, मैं कैसे बता सकता हूं कि मेरे वेब एप्लिकेशन का उपयोग करने वाला व्यक्ति उस सर्वर पर है, जिस पर वह रहता है? अगर मुझे सही से याद है, तो PHPMyAdmin सुरक्षा कारणों से ऐसा कुछ करता है।

जवाबों:


177

आप यह भी उपयोग कर सकते हैं $_SERVER['REMOTE_ADDR']जिसके लिए ग्राहक अनुरोध का आईपी पता वेब सर्वर द्वारा दिया गया है।

$whitelist = array(
    '127.0.0.1',
    '::1'
);

if(!in_array($_SERVER['REMOTE_ADDR'], $whitelist)){
    // not valid
}

2
जिससे यह आईपी को खराब करने की तुलना में वास्तव में तोड़ने में आसान होगा। आपको वास्तव में इसे बदलना चाहिए।
पेका

3
@ skcin7 आपकी सर्वर सेटिंग हो सकती है। इसे जाँचे।
मौरिस

4
@Pekka 웃 आप सिर्फ उदाहरण के लिए भेज सकते हैं Host: 127.0.0.1और यह आबादी में होगा HTTP_HOST, इसलिए यह बिल्कुल विश्वसनीय तरीका नहीं है।
देजन मार्जनोविक

4
हाँ, यह बुरी सलाह है और इसके मौजूदा स्वरूप में और इसे संपादित किए जाने की आवश्यकता है - या अधोगामी।
पेका

3
IPv6 को न भूलें:$whitelist = array('127.0.0.1', '::1');
CrazyMax

26

एक पूरक के रूप में, एक समारोह के रूप में ...

function isLocalhost($whitelist = ['127.0.0.1', '::1']) {
    return in_array($_SERVER['REMOTE_ADDR'], $whitelist);
}

5
अच्छे अभ्यास के रूप में मैं "और झूठे लौटाने" की सलाह दूंगा। ताकि फ़ंक्शन हमेशा बूलियन मान लौटाता है। या वैकल्पिक रूप से, बस "यदि" पूरी तरह से और इसके बजाय "वापसी in_array ($ _SERVER ['REMOTE_ADDR'], $ श्वेतसूची) को हटा दें;
जो इर्बी

15

नए OS उपयोगकर्ता (विन 7, 8) को अपने श्वेतसूची में IPV6- प्रारूप दूरस्थ पता शामिल करना आवश्यक हो सकता है:

$whitelist = array('127.0.0.1', "::1");

if(!in_array($_SERVER['REMOTE_ADDR'], $whitelist)){
    // not valid
}

14

$_SERVER["REMOTE_ADDR"]आपको उपयोगकर्ता का आईपी बताना चाहिए। हालांकि यह खराब है।

बहुत विस्तृत चर्चा के लिए इस भरपूर प्रश्न की जाँच करें

मुझे लगता है कि आप PHPMyAdmin के साथ जो कुछ भी याद करते हैं वह कुछ अलग है: कई MySQL सर्वर कॉन्फ़िगर किए गए हैं ताकि उन्हें केवल सुरक्षा कारणों से लोकलहोस्ट से एक्सेस किया जा सके।


यह ध्यान देने योग्य है कि कुछ MySQL सर्वर एक सार्वजनिक इंटरफ़ेस के लिए बाध्य नहीं होने के कारण कॉन्फ़िगर किए गए हैं। इसी तरह, यदि आप PHP एप्लिकेशन को उसी तरह से प्रतिबंधित करना चाहते हैं, तो आपको इसे केवल एक आंतरिक इंटरफ़ेस से बंधे अपाचे उदाहरण के माध्यम से सेवा देने पर विचार करना चाहिए।
फ्रैंक किसान

8

मुझे खेद है लेकिन ये सभी उत्तर मुझे भयानक लगते हैं। मैं इस सवाल का जवाब देना चाहूंगा क्योंकि एक अर्थ में सभी मशीनें "लोकलहोस्ट" हैं।

प्रश्न होना चाहिए; मैं किस कोड के आधार पर अलग-अलग कोड पथ चलाता हूं।

मेरी राय में, सबसे आसान तरीका DEVMACHINE नामक एक फाइल बनाना है या जो आप वास्तव में चाहते हैं और फिर बस जांचें

file_exists ( 'DEVMACHINE')

लाइव होस्टिंग पर्यावरण पर अपलोड करते समय इस फ़ाइल को बाहर करना याद रखें!

यह समाधान नेटवर्क कॉन्फ़िगरेशन पर निर्भर नहीं है, इसे खराब नहीं किया जा सकता है और "लाइव-कोड" और "देव-कोड" चलाने के बीच स्विच करना आसान बनाता है।


6

ऐसा नहीं लगता कि आपको इसका उपयोग करना चाहिए $_SERVER['HTTP_HOST'], क्योंकि http हेडर में यह आसानी से नकली है।

आप इसका उपयोग $_SERVER["REMOTE_ADDR"]भी कर सकते हैं , यह अधिक सुरक्षित मूल्य है, लेकिन यह नकली भी संभव है। यह remote_addrवह पता है जहां अपाचे परिणाम देता है।


REMOTE_ADDRनकली करना संभव है, हालांकि यदि आप इसे 127.0.0.1या तो नकली बनाना चाहते हैं ::1, या इसके लिए मशीन से समझौता करने की आवश्यकता होती है, जिस पर एक स्पूफ REMOTE_ADDRआपकी चिंताओं से कम है। प्रासंगिक उत्तर - stackoverflow.com/a/5092951/3774582
हंस

1

यदि आप एक श्वेतसूची / अनुमति देना चाहते हैं जो स्थैतिक आईपी और गतिशील नामों का समर्थन करता है ।

उदाहरण के लिए:

$whitelist = array("localhost", "127.0.0.1", "devel-pc.ds.com", "liveserver.com");
if (!isIPWhitelisted($whitelist)) die();

इस तरह आप नाम / आईपी की एक सूची निर्धारित कर सकते हैं जो (निश्चित रूप से) पता लगाने में सक्षम होगी। डायनामिक नाम विभिन्न बिंदुओं तक पहुंचने के लिए अधिक लचीलापन जोड़ते हैं।

आपके पास यहां दो सामान्य विकल्प हैं, आप अपनी स्थानीय होस्ट फ़ाइल में नाम सेट कर सकते हैं या आप केवल एक गतिशील नाम प्रदाता का उपयोग कर सकते हैं जो कहीं भी पाया जा सकता है।

यह फ़ंक्शन CACHES परिणाम देता है क्योंकि gethostbyname एक बहुत धीमा कार्य है।

इस शिष्य के लिए मैंने इस समारोह को लागू किया है:

function isIPWhitelisted($whitelist = false)
{
    if ( isset($_SESSION) && isset($_SESSION['isipallowed']) )
        { return $_SESSION['isipallowed'];  }

    // This is the whitelist
    $ipchecklist = array("localhost", "127.0.0.1", "::1");
    if ($whitelist) $ipchecklist = $whitelist;

    $iplist = false;
    $isipallowed = false;

    $filename = "resolved-ip-list.txt";
    $filename = substr(md5($filename), 0, 8)."_".$filename; // Just a spoon of security or just remove this line

    if (file_exists($filename))
    {
        // If cache file has less than 1 day old use it
        if (time() - filemtime($filename) <= 60*60*24*1)
            $iplist = explode(";", file_get_contents($filename)); // Read cached resolved ips
    }

    // If file was not loaded or found -> generate ip list
    if (!$iplist)
    {
        $iplist = array(); $c=0;
        foreach ( $ipchecklist as $k => $iptoresolve )
        {
            // gethostbyname: It's a VERY SLOW function. We really need to cache the resolved ip list
            $ip = gethostbyname($iptoresolve);
            if ($ip != "") $iplist[$c] = $ip;
            $c++;
        }

        file_put_contents($filename, implode(";", $iplist));
    }

    if (in_array($_SERVER['REMOTE_ADDR'], $iplist)) // Check if the client ip is allowed
        $isipallowed = true;

    if (isset($_SESSION)) $_SESSION['isipallowed'] = $isipallowed;

    return $isipallowed;
}

बेहतर विश्वसनीयता के लिए आप get_ip_address () के लिए $ _SERVER ['REMOTE_ADDR'] की जगह ले सकते हैं, जो @Pekka ने अपने पोस्ट में "इस बेशुमार प्रश्न" के रूप में उल्लेख किया है


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

1

$_SERVER['SERVER_ADDR'] === $_SERVER['REMOTE_ADDR']यदि ग्राहक सर्वर के समान मशीन पर है, तो यह निर्धारित करने के लिए तुलना करने के बारे में कैसे ?


$_SERVER['SERVER_ADDR']हमेशा सर्वर पते को मज़बूती से वापस नहीं करता है, उदाहरण के लिए अगर लोड बैलेन्सर का उपयोग करते हुए यह लोड बैलेंसर का आईपी पता लौटाता है जो मुझे विश्वास है।
माइक डब्ल्यू

-2

मुझे एक आसान जवाब मिला।

क्योंकि सभी स्थानीय ड्राइव में C: या D: या F: ... आदि होते हैं।

बस पता लगाएँ कि क्या दूसरा वर्ण है:

if ( substr_compare(getcwd(),":",1,1) == 0)
{
echo '<script type="text/javascript">alert(" The working dir is at the local computer ")</script>';
    $client_or_server = 'client';
}
else
{
echo '<script type="text/javascript">alert(" The working dir is at the server ")</script>';
    $client_or_server = 'server';
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.