2009-09-23 15 views
5

Używam poniższego fragmentu do przekierowania tablicy adresów IP. Zastanawiałem się, jak bym go o dodanie całą gamę/blok adresów IP do mojego dissallowed tablicy ...Jak przekierować cały zakres/blok adresów IP za pomocą PHP?

<?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; 
} 
?> 

Próbowałem za pomocą „76.105.99. *”, „76.105.99”, „76,105 .99.0-76.105.99.255 "bez żadnego szczęścia.

Potrzebuję używać PHP zamiast mod_rewrite i .htaccess z innych powodów.

+0

Myślę, że trzeba ponownie inżynier kod porównania zrozumieć skrót masz zamiar użyć. – Lazarus

Odpowiedz

4

Spróbuj substr funkcję:

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

sir co, jeśli format zakresu ip to 76.105.99.0/127? –

0

Byłoby lepiej, aby to zrobić w Apache (lub innego serwera)

1

Kto dokładnie jesteś zainteresowany blokowanie? Możesz użyć PHP lub Apache do zablokowania (lub zezwolenia) na kilka konkretnych adresów IP.

Jeśli jesteś zainteresowany blokowaniem ludzi z całego kraju, na przykład, są narzędzia, które dają ci adresy IP, które musisz zablokować. Niestety, nie jest tak proste, jak tylko określenie zakresu.

Zapoznaj się z http://www.blockacountry.com/, który generuje wiele adresów IP, które możesz umieścić w .htaccess, aby zablokować całe kraje.

0

Uważam, że trzeba tworzyć pętli for, aby dodać każdy adres IP (w zakresie) na swojej tablicy.

pseudokod

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

Wykonywanie pętli for wydaje się być bardzo nieoptymalnym rozwiązaniem. – rogeriopvl

11

Oto przykład, w jaki sposób można sprawdzić konkretną kombinację sieci/maski:

$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; 
} 

Jest lepsza niż mecz oparciu ciąg jak można przetestować inne maski wyrównanie wewnątrz oktetu, np a/20 blok IP

+0

To nie działa dla mnie. Każdy pomysł, dlaczego? – Ameer

+1

Zrobiłeś coś nie tak, lub zrobiłeś założenie, które nie było prawidłowe. –

+0

Mój kod jest tutaj: ' ' Zawsze mówi, że nie pasuje. Uwaga: Mój adres IP to 124.195.223.99 – Ameer

3

Możesz podejść do problemu w inny sposób.

Jeśli chcą zakazać 76.105.99 * można zrobić.

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

Co trzeba zrobić, to mieć test, aby sprawdzić, czy dany adres mieszka wewnątrz określonego zakresu adresów zdefiniowane przez CIDR

Tak na przykład, trzeba być w stanie powiedzieć

jest 192.168.1.5

wewnątrz

192.168.1.0/24

Ta funkcja jest łatwa do napisania, zakładając, że masz kilka podstawowych narzędzi do pracy z CIDR.

Zakładając, że są na systemie 32-bitowym, ta klasa http://snipplr.com/view/15557/cidr-class-for-ipv4/ zwrócić uwagę na funkcję 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

Byłoby lepiej, gdybyś również objaśnił kod. –