Kullanıcının PHP'de localhost'ta olup olmadığını nasıl tespit edebilirim?


99

Başka bir deyişle, web uygulamamı kullanan kişinin bulunduğu sunucuda olup olmadığını nasıl anlarım? Doğru hatırlıyorsam, PHPMyAdmin, güvenlik nedeniyle buna benzer bir şey yapar.

Yanıtlar:


177

Ayrıca $_SERVER['REMOTE_ADDR'], istemcinin hangi IP adresi için web sunucusu tarafından verildiğini de kullanabilirsiniz .

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

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

2
Bu, IP'yi aldatmaktan daha kolay kırılmasını sağlar. Onu gerçekten değiştirmelisin.
Pekka

3
@ skcin7 sunucu ayarınız olabilir. kontrol et.
mauris

4
@Pekka 웃 sadece örneğin gönderebilirsiniz Host: 127.0.0.1ve içine doldurulacaktır HTTP_HOST, bu yüzden hiç de güvenilir bir yöntem değildir.
Dejan Marjanović

4
Evet, bu kötü bir tavsiye ve şu anki haliyle düzenlenmesi veya oylanması gerekiyor.
Pekka

3
IPv6'yı unutmayın:$whitelist = array('127.0.0.1', '::1');
CrazyMax

26

Bir tamamlayıcı, bir işlev olarak ...

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

5
İyi bir uygulama olarak "else return false" eklemenizi tavsiye ederim; böylece işlev her zaman bir boole değeri döndürür. Veya alternatif olarak, "if" dizisini tamamen kaldırın ve bunun yerine "return in_array ($ _SERVER ['REMOTE_ADDR'], $ whitelist);"
Joe Irby

15

Daha yeni işletim sistemi kullanıcıları (Win 7, 8) ayrıca beyaz liste dizilerine IPV6 biçimli bir uzak adres eklemeyi gerekli bulabilir:

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

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

14

$_SERVER["REMOTE_ADDR"]size kullanıcının IP adresini söylemelidir. Yine de sahte.

Çok detaylı bir tartışma için bu ödül sorusunu kontrol edin .

PHPMyAdmin ile hatırladığınız şeyin farklı olduğunu düşünüyorum: Birçok MySQL Sunucusu, güvenlik nedenleriyle yalnızca localhost'tan erişilebilecek şekilde yapılandırılmıştır.


Bazı MySQL sunucularının genel bir arayüze bağlanmayarak bu şekilde yapılandırıldığını belirtmek gerekir. Benzer şekilde, bir PHP uygulamasını aynı şekilde kısıtlamak istiyorsanız, onu yalnızca dahili bir arayüze bağlı bir apache örneği aracılığıyla sunmayı düşünmelisiniz.
Frank Farmer

8

Üzgünüm ama tüm bu cevaplar bana korkunç geliyor. Soruyu yeniden ifade etmeyi öneririm çünkü bir anlamda tüm makineler "localhost" dur.

Soru şöyle olmalıdır; Hangi makinede çalıştırıldığına bağlı olarak farklı kod yollarını nasıl çalıştırırım.

Kanımca, en kolay yol DEVMACHINE adında bir dosya oluşturmak veya gerçekten ne istiyorsanız onu kontrol etmektir.

file_exists ('DEVMACHINE')

Canlı barındırma ortamına yüklerken bu dosyayı dışarıda bırakmayı unutmayın!

Bu çözüm, ağ yapılandırmasına bağlı değildir, sahte olamaz ve "canlı kod" ile "dev kodu" arasında geçiş yapmayı kolaylaştırır.


6

Kullanmanız gerekmiyor gibi görünüyor $_SERVER['HTTP_HOST'], çünkü bu, http başlığındaki değer kolayca taklit edilir.

Siz de kullanabilirsiniz $_SERVER["REMOTE_ADDR"], bu daha güvenli bir değerdir, ancak sahte olmak da mümkündür. Bu remote_addr, Apache'nin sonucu döndürdüğü adrestir.


REMOTE_ADDRSahte olmak mümkündür, ancak bunu sahte yapmak istiyorsanız 127.0.0.1veya ::1makineden ödün vermeyi gerektiriyorsa REMOTE_ADDR, en az endişeniz bir sahtekarlıktır . İlgili cevap - stackoverflow.com/a/5092951/3774582
Goose

1

Statik IP'leri ve dinamik adları destekleyen bir beyaz listeye / izin verilenlere sahip olmak istiyorsanız .

Örneğin:

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

Bu şekilde , tespit edilebilecek (kesin olarak) bir isim / IP listesi ayarlayabilirsiniz . Dinamik adlar, farklı noktalardan erişim için daha fazla esneklik sağlar.

Burada iki genel seçeneğiniz var, yerel ana bilgisayar dosyanızda bir ad belirleyebilir veya herhangi bir yerde bulunabilecek bir dinamik ad sağlayıcısı kullanabilirsiniz .

Gethostbyname çok yavaş bir işlev olduğu için bu işlev CACHES sonucunu verir.

Bu öğrenci için şu işlevi uyguladım:

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;
}

Daha iyi güvenilirlik için, @ Pekka'nın gönderisinde "bu ödül sorusu" olarak bahsettiği get_ip_address () için $ _SERVER ['REMOTE_ADDR'] yerine kullanabilirsiniz.


1
Açıkça dinamik ad çözümlemesi sunarken diğerlerinin sunmadığı halde birisinin cevabıma neden negatif puan verdiğini bilmiyorum. DNS çözümlemesi yavaştır, bu nedenle önbelleğe alma çözünürlükleri gereklidir.
Heroselohim

1

$_SERVER['SERVER_ADDR'] === $_SERVER['REMOTE_ADDR']İstemcinin sunucu ile aynı makinede olup olmadığını belirlemek için karşılaştırma yapmaya ne dersiniz ?


$_SERVER['SERVER_ADDR']sunucu adresini her zaman güvenilir bir şekilde döndürmez, örneğin yük dengeleyiciler kullanıyorsanız, inandığım yük dengeleyicinin IP adresini döndürür.
Mike W

-2

Kolay bir cevap buldum.

Tüm yerel sürücülerde C: veya D: veya F: ... vb.

İkinci karakterin bir:

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';
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.