2009-09-23 39 views
5

我正在使用以下代碼段重定向一組IP地址。我不知道我怎麼會去加入的整個範圍/ IP的塊地址到我的dissallowed陣列...如何用PHP重定向整個範圍/ IP地址塊?

<?php // Let's redirect certain IP addresses to a "Page Not Found" 
$disallowed = array("76.105.99.106"); 
$ip = $_SERVER['REMOTE_ADDR']; 

if(in_array($ip, $disallowed)) { 
header("Location: http://google.com"); 
exit; 
} 
?> 

我嘗試使用「76.105.99。*」,「76.105.99」,「76.105 .99.0-76.105.99.255「沒有任何運氣。

由於其他原因,我需要使用PHP而不是mod_rewrite和.htaccess。

+0

我認爲你需要重新設計你的比較代碼來了解你將要使用的縮寫。 – Lazarus 2009-09-23 15:59:49

回答

4

嘗試substr功能:

$ip = '76.105.99.'; 
if (substr($_SERVER['REMOTE_ADDR'], 0, strlen($ip)) === $ip) { 
    // deny access 
} 
+0

先生如果ip範圍的格式是76.105.99.0/127,那該怎麼辦? – 2017-08-30 04:23:21

0

在apache(或任何其他服務器)中這樣做會更好

1

您究竟對阻塞感興趣?您可以使用PHP或Apache來阻止(或允許)一堆特定的IP地址。

例如,如果您有興趣阻止來自整個國家/地區的人員,則可以使用工具爲您提供需要阻止的IP地址。不幸的是,這並不像指定一個範圍那麼簡單。

退房http://www.blockacountry.com/它生成一堆IP地址,你可以堅持在你的.htaccess來封鎖整個國家。

0

我相信,你需要創建一個for循環的每個IP地址(範圍內)添加到您的陣列。

僞代碼

for i = 0 to 255 
    disallowed[i] = "76.105.99." + i 
next 
+0

做一個for循環似乎是一個非常不理想的解決方案。 – rogeriopvl 2009-09-23 16:09:09

11

這裏是你如何可以檢查特定的網絡/掩碼組合的例子:

$network=ip2long("76.105.99.0"); 
$mask=ip2long("255.255.255.0"); 
$remote=ip2long($_SERVER['REMOTE_ADDR']); 

if (($remote & $mask)==$network) 
{ 
    header("Location: http://example.com"); 
    exit; 
} 

這比使用基於字符串的比賽,你可以測試其他口罩更好在八位字節內對齊,例如a/20 IP地址塊

+0

這對我不起作用。任何想法爲什麼? – Ameer 2013-08-14 12:11:38

+1

你做錯了什麼,或做了一個無效的假設。 – 2013-08-14 12:56:36

+0

我的代碼在這裏: '<?php $ network = ip2long(「124.195.223.98」); $ mask = ip2long(「255.255.255.0」); $ remote = ip2long($ _ SERVER ['REMOTE_ADDR']); ((($ remote&$ mask)== $ network)){ echo「match」; } else { echo「No match」; } ?>' 它總是說不匹配。 注意:我的IP地址是124.195.223.99 – Ameer 2013-08-23 10:58:13

3

您可以用不同的方式處理問題。

如果你想禁止76.105.99 *你可以這樣做:

if (strpos($_SERVER['REMOTE_ADDR'], "76.105.99.")!==FALSE) 
{ 
    header ('Location: http://google.com'); 
} 
1

你需要做的是有一個測試,看是否有特定的地址居住在特定的地址範圍內所界定CIDR

因此,舉例來說,你需要能夠說

是192.168.1.5

192.168.1.0/24

這個函數很容易編寫,假設你有一些基本的工具來做CIDR工作。

假設你是一個32位系統上,這個類http://snipplr.com/view/15557/cidr-class-for-ipv4/ ,請注意IPisWithinCIDR功能

0
$blocked_ip_range_array = array('109.237.108.0','109.238.0.0'); 
for($i=0;$i<count($blocked_ip_range_array);$i++){ 
    $network=ip2long($blocked_ip_range_array[$i]); 
    $blipr = explode(".",$blocked_ip_range_array[$i]); 
    if($blipr[2]=='0'){ 
     $mask=ip2long("255.255.0.0"); 
    } 
    else{ 
     $mask=ip2long("255.255.255.0"); 
    } 
    $remote=ip2long($_SERVER['REMOTE_ADDR']); 
    if (($remote & $mask)==$network) 
    { 
     header("Location: http://xurcun.info"); 
     exit; 
    } 
}  
+0

如果你解釋了代碼,那會更好。 – 2012-11-13 02:32:07