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.
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:
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
}
Host: 127.0.0.1
ve içine doldurulacaktır HTTP_HOST
, bu yüzden hiç de güvenilir bir yöntem değildir.
$whitelist = array('127.0.0.1', '::1');
Bir tamamlayıcı, bir işlev olarak ...
function isLocalhost($whitelist = ['127.0.0.1', '::1']) {
return in_array($_SERVER['REMOTE_ADDR'], $whitelist);
}
$_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.
Ü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.
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_ADDR
Sahte olmak mümkündür, ancak bunu sahte yapmak istiyorsanız 127.0.0.1
veya ::1
makineden ödün vermeyi gerektiriyorsa REMOTE_ADDR
, en az endişeniz bir sahtekarlıktır . İlgili cevap - stackoverflow.com/a/5092951/3774582
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.
$_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.
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';
}