換句話說,我如何判斷使用我的Web應用程序的人是否位於它駐留的服務器上?如果我沒有記錯,PHPMyAdmin出於安全原因做了這樣的事情。如何檢測用戶是否位於PHP中的本地主機上?
回答
您也可以使用$_SERVER['REMOTE_ADDR']
,其中請求的客戶端的IP地址由Web服務器提供。
$whitelist = array(
'127.0.0.1',
'::1'
);
if(!in_array($_SERVER['REMOTE_ADDR'], $whitelist)){
// not valid
}
$_SERVER["REMOTE_ADDR"]
應該告訴你用戶的IP。儘管如此,這是可欺騙的。
查詢this bounty question進行了非常詳細的討論。
我想你對PHPMyAdmin的記憶是不同的:許多MySQL服務器被配置爲只能從本地主機訪問才能出於安全原因。
哇,看起來這個問題比我想象的要多得多... – 2010-01-12 23:43:26
值得注意的是,有些MySQL服務器是通過不綁定到公共接口來配置的。同樣,如果您想以相同的方式限制PHP應用程序,則應考慮通過僅綁定到內部接口的apache實例來提供服務。 – 2010-01-12 23:44:17
似乎它不應該使用$_SERVER['HTTP_HOST']
,因爲這是在HTTP頭值,很容易僞造。
您也可以使用$_SERVER["REMOTE_ADDR"]
,這是更安全的價值,但它也有可能是假的。這remote_addr
是Apache返回結果的地址。
'REMOTE_ADDR'可以僞造,但是如果你想僞裝成'127.0.0.1'或':: 1',那就需要對機器做出妥協,因爲你最擔心的是一個欺騙性的REMOTE_ADDR。相關的答案 - http://stackoverflow.com/a/5092951/3774582 – Goose 2016-11-16 15:06:05
較新的OS用戶(運7,8)也可以認爲有必要在其白名單中包括陣列IPv6格式的遠程地址:
$whitelist = array('127.0.0.1', "::1");
if(!in_array($_SERVER['REMOTE_ADDR'], $whitelist)){
// not valid
}
作爲補充,作爲函數...
function is_localhost() {
$whitelist = array('127.0.0.1', '::1');
return in_array($_SERVER['REMOTE_ADDR'], $whitelist);
}
作爲良好的做法,我會建議添加「其他返回false;」所以函數總是返回一個布爾值。或者,只需完全刪除「if」,而不是「return in_array($ _SERVER ['REMOTE_ADDR'],$ whitelist);」 – 2018-02-01 18:22:00
如果你想有一個支持靜態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」
我不知道爲什麼有人給我的回答設置了負面分數,但它清楚地提供了動態名稱解析,而其他人沒有。 DNS解析速度很慢,這就是爲什麼需要緩存分辨率的原因。 – Heroselohim 2016-03-21 19:27:18
我找到了一個簡單的答案。
因爲所有本地驅動器具有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';
}
這隻適用於Windows – 2018-02-11 15:32:08
如何比較$_SERVER['SERVER_ADDR'] === $_SERVER['REMOTE_ADDR']
,以確定是否客戶端與服務器在同一臺計算機上?
- 1. php檢測文檔索引是否是本地主機
- 2. 檢測是否地址(主機)解析爲本地計算機
- 3. 如何測試主機名是否指本地機器
- 4. 如何檢測用戶上傳的文件是否大於post_max_size?
- 5. 本地主機上的ab測試和主機名是否有區別?
- 6. Rails檢查請求主機是否與本地主機相同
- 7. PHP:如何檢查客戶端是否是本地的?
- 8. (c#)如何檢查某個exe是否位於用戶計算機上?
- 9. 如何檢測光標是否位於Firefox的文本區域
- 10. 如何檢查IP地址是多宿主系統上的本地主機?
- 11. PHP - 如何檢測用戶位置
- 12. 如何使用ssl測試本地主機上的Facebook-Connect
- 13. 測試Chrome的本地主機上
- 14. WAMP PHP測試在本地主機
- 15. 如何在mac上測試本地主機上的子域名?
- 16. 如何檢測腳本是否在虛擬機上運行?
- 17. 如何檢測用戶是否中止了連接php
- 18. 用於檢測用戶位置的替代地理位置
- 19. 如何測試AD用戶是否是本地組的成員
- 20. 檢查用戶是否是外部計算機上的本地管理員
- 21. 檢查IP地址是否映射到本地主機
- 22. asp.net檢查是否使用本地主機
- 23. 本地主機上的PHP Simplexml失敗
- 24. 本地主機上的Netbeans 7.2和PHP
- 25. 本地主機上的PHP錯誤wampserver
- 26. 如何在本地主機上使用server_name測試Nginx?
- 27. 如何檢查本地主機
- 28. 主機名檢測PHP
- 29. 檢測移動Web應用程序是否位於本地Facebook應用程序
- 30. 檢測鼠標是否位於iframe中的某個元素上
這會讓這實際上比欺騙IP更容易中斷。你應該真的改變它。 – 2010-01-13 00:09:14
這不適合我。 $ _SERVER ['HTTP_HOST']返回我的域的文本部分(例如,如果域爲www.example.com,則爲「example」)。 – skcin7 2012-01-18 08:26:42
@ skcin7可能是您的服務器設置。覈實。 – mauris 2012-01-18 11:53:06