2017-06-12 147 views
0

我想禁止IP地址阻止用戶訪問網站。我有這個禁止IP地址的代碼。PHP禁止IP地址阻止用戶訪問網站

$deny = array("111.111.111", "222.222.222", "333.333.333"); 
if(in_array ($_SERVER['REMOTE_ADDR'], $deny)){ 
    die("Your IP has been banned from accessing the website"); 
} 

現在,如果我在數據庫中有逗號分隔的值,我可以通過獲取數據並對其進行爆炸來輕鬆地對其進行編碼。但是我將它作爲每行一個IP存儲。現在我該如何檢查數組?

+0

如果您使用Apache,'.htaccess'文件可以更輕鬆地完成IP阻塞:http://www.htaccess-guide.com/deny-visitors-by-ip-address/ –

+0

另外,請閱讀欺騙'$ _SERVER'值:https://stackoverflow.com/questions/5092563/how-to-fake-serverremote-addr-variable –

+0

爲什麼你要使用in_array,如果你的數據庫中每行有一個IP。你不能只是做一個選擇,並檢查你的ban_list表中是否存在$ _SERVER ['REMOTE_ADDR']? – GullDe

回答

-1

您可以通過$ _SERVER [REMOTE_ADDR]獲取IP地址,然後使用group_concat子句從表中獲取數據,如果ip地址存在於數組中,則阻止其他允許的訪問。

$query = "select group_concat('ipaddress') bannedAddress from iptable limit 0,1"; 
$result = mysql_fetch_array(mysql_query($query)); 


if(in_array ($_SERVER['REMOTE_ADDR'], $result[0]['bannedAddress'])){ 
    die("Your IP has been banned from accessing the website"); 
} 
+0

你爲什麼要加入這些行只是爲了將它們炸開?爲什麼不循環遍歷結果中的多行並將它們添加到數組中。或者更好的是,使用where子句並僅選擇count(*)WHERE ip =:ipaddress' –

2

你不需要一個數組或一個循環或任何實現這一目標。只需嘗試從表中選擇IP地址即可。如果它不存在,你知道IP不被禁止。

<?php 
    $ip = $_SERVER['REMOTE_ADDR']; 
    $sql = "SELECT * FROM banned_ips WHERE ip_address = '$ip'"; 
    $result = $conn->query($sql); 

    if ($result->num_rows > 0) { 
     die("Your IP has been banned from accessing the website"); 
    } 
?> 
-1

你可以做到這一點從該表中選擇每一行,然後推動它在陣列中,像這樣(在這裏我使用mysqli的,但它與正常的MySQL工作爲好。你只需要修改代碼一點點):

$deny = array(); 
$sql = "SELECT * FROM `banned_addresses`"; 
$result = $mysqli->query($sql); 

while ($row = $result->fetch_assoc()) { 
    array_push($deny, $row["address"]; 
} 

if(in_array ($_SERVER['REMOTE_ADDR'], $deny)) { 
    die("Your IP has been banned from accessing the website"); 
} 

但是有更好的方法來禁止IP。例如,您可以檢查表中是否存在該IP地址的條目。這是更快:

$sql = "SELECT * FROM `banned_addresses`"; 
$result = $mysqli->query($sql); 

if(mysql_fetch_array($result) !== false) { 
    die("Your IP has been banned from accessing the website"); 
} 

對於許多服務器,也有方法可以直接禁止IP地址。對於Apache,有this指南。

+1

這可能會很昂貴。他可以使用WHERE子句並搜索數據庫中是否存在,而不是獲取所有IP。 – Ibu