2010-01-12 61 views

回答

119

您也可以使用$_SERVER['REMOTE_ADDR'],其中請求的客戶端的IP地址由Web服務器提供。

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

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

這會讓這實際上比欺騙IP更容易中斷。你應該真的改變它。 – 2010-01-13 00:09:14

+0

這不適合我。 $ _SERVER ['HTTP_HOST']返回我的域的文本部分(例如,如果域爲www.example.com,則爲「example」)。 – skcin7 2012-01-18 08:26:42

+3

@ skcin7可能是您的服務器設置。覈實。 – mauris 2012-01-18 11:53:06

14

$_SERVER["REMOTE_ADDR"]應該告訴你用戶的IP。儘管如此,這是可欺騙的。

查詢this bounty question進行了非常詳細的討論。

我想你對PHPMyAdmin的記憶是不同的:許多MySQL服務器被配置爲只能從本地主機訪問才能出於安全原因。

+0

哇,看起來這個問題比我想象的要多得多... – 2010-01-12 23:43:26

+0

值得注意的是,有些MySQL服務器是通過不綁定到公共接口來配置的。同樣,如果您想以相同的方式限制PHP應用程序,則應考慮通過僅綁定到內部接口的apache實例來提供服務。 – 2010-01-12 23:44:17

6

似乎它不應該使用$_SERVER['HTTP_HOST'],因爲這是在HTTP頭值,很容易僞造。

您也可以使用$_SERVER["REMOTE_ADDR"],這是更安全的價值,但它也有可能是假的。這remote_addr是Apache返回結果的地址。

+0

'REMOTE_ADDR'可以僞造,但是如果你想僞裝成'127.0.0.1'或':: 1',那就需要對機器做出妥協,因爲你最擔心的是一個欺騙性的REMOTE_ADDR。相關的答案 - http://stackoverflow.com/a/5092951/3774582 – Goose 2016-11-16 15:06:05

13

較新的OS用戶(運7,8)也可以認爲有必要在其白名單中包括陣列IPv6格式的遠程地址:

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

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

作爲補充,作爲函數...

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

作爲良好的做法,我會建議添加「其他返回false;」所以函數總是返回一個布爾值。或者,只需完全刪除「if」,而不是「return in_array($ _SERVER ['REMOTE_ADDR'],$ whitelist);」 – 2018-02-01 18:22:00

0

如果你想有一個支持靜態IP動態名一個白名單/允許列表

例如:

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

這種方式,你可以設置的名/ IP地址將能夠(肯定)被檢測到的列表。動態名稱爲從不同點訪問提供了更大的靈活性。

你有兩個共同選擇這裏,你可以在你的本地主機設置一個文件的文件名或者你可以只使用一個動態域名提供商,可以在任何地方找到。

該函數的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; 
} 

爲了更好的可靠性,你可以更換$ _ SERVER [ 'REMOTE_ADDR']get_ip_address()是@Pekka中提到他post as 「this bounty question」

+0

我不知道爲什麼有人給我的回答設置了負面分數,但它清楚地提供了動態名稱解析,而其他人沒有。 DNS解析速度很慢,這就是爲什麼需要緩存分辨率的原因。 – Heroselohim 2016-03-21 19:27:18

-1

我找到了一個簡單的答案。

因爲所有本地驅動器具有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'; 
} 
+0

這隻適用於Windows – 2018-02-11 15:32:08

0

如何比較$_SERVER['SERVER_ADDR'] === $_SERVER['REMOTE_ADDR'],以確定是否客戶端與服務器在同一臺計算機上?

相關問題