2010-05-19 2 views
10

Je voudrais, par exemple, bloquer toutes les adresses IP de la base 89.95 (89.95 ). Je n'ai pas de fichiers .htaccess sur mon serveur, donc je vais devoir le faire avec PHP.Bloquer un bloc IP spécifique de mon site Web en PHP

if ($_SERVER['REMOTE_ADDR'] == "89.95.25.37") die(); 

Permet de bloquer une adresse IP spécifique. Comment puis-je bloquer des blocs IP entiers?

Merci beaucoup.

Répondre

12

Essayez strpos()

if(strpos($_SERVER['REMOTE_ADDR'], "89.95") === 0) 
{ 
    die(); 
} 

Si vous remarquez, l'opérateur === veille à ce que le 89.95 est au begining de l'adresse IP. Cela signifie que vous pouvez séparer autant de l'adresse IP que vous le souhaitez, et cela bloquera, peu importe les numéros qui suivent.

Par exemple, tous ces éléments seront bloqués:

89,95 ->89.95.12.34, 89.95.1234.1, 89.95.1.1
89.95.6 ->89.95.65.34, 89.95.61.1, 89.95.6987

(certaines personnes ne sont pas des adresses IP valides)

+0

recherche générique hehe, je suis surpris que ' strpos' fonctionne ici plus vite que 'substr' – zerkms

+0

@zerkms cela ne devrait pas vraiment être surprenant -' strpos' peut retourner immédiatement si le test échoue, et ne doit pas faire toute copie ou attribution de chaîne. Aussi, je voulais juste noter que le comportement change si vous changez '===' pour '==', donc ne faites pas cela. Utilisez trois signes égaux. – gnud

+0

@gnud: pour les longues chaînes, les strpos seraient plus lentes, juste parce qu'elles devraient parcourir toute la chaîne pour fouiller l'aiguille. et je sais quelle est la différence de '===' et '=='. – zerkms

1

Créer une sous-chaîne :) Par exemple, pour bloquer 89.95.25. *, Vous créez une sous-chaîne de l'adresse IP, en coupant les deux derniers chiffres et en la comparant à "89.95.25".

3

Convertir le quadruplet à un nombre entier:

$ip = sprintf('%u', ip2long($_SERVER['REMOTE_ADDR'])); 

// only allow 10.0.0.0 – 10.255.255.255 
if (!($ip >= 167772160 && $ip <= 184549375)) { 
    die('Forbidden.'); 
} 
+0

Quelle est la raison de l'utilisation d'entiers ici? rendre le code plus obscurci? – zerkms

+0

Ce n'est pas que cela diminue l'utilité de cette réponse, mais l'Autorisation ressemble plus à un mot Opt-In, où un groupe sélectionné de personnes est autorisé. Dans ce cas, au lieu de n'autoriser que quelques personnes, il interdit ou interdit certaines personnes. En tant que tel, je pense qu'un meilleur mot serait «Interdit». –

+0

@ Chacha102: J'ai édité. – webbiedave

4

Utilisez ip2long() pour convertir décimale pointée vers une adresse IP réelle. Ensuite, vous pouvez faire des gammes facilement.

Il suffit de faire ip2long() sur la gamme haute et basse pour obtenir la valeur, puis utilisez-les comme constantes dans votre code.

Si vous êtes familier avec le masquage de sous-réseau, vous pouvez le faire comme ceci:

// Deny 10.12.*.* 
$network = ip2long("10.12.0.0"); 
$mask = ip2long("255.255.0.0"); 
$ip = ip2long($_SERVER['REMOTE_ADDR']); 
if (($network & $mask) == ($ip & $mask)) { 
    die("Unauthorized"); 
} 

Ou si vous êtes familier avec ce format 10.12.0.0/16:

// Deny 10.12.*.* 
$network = ip2long("10.12.0.0"); 
$prefix = 16; 
$ip = ip2long($_SERVER['REMOTE_ADDR']); 
if ($network >> (32 - $prefix)) == ($ip >> (32 - $prefix)) { 
    die("Unauthorized"); 
} 

Vous pouvez les transformer en fonctions et ont un code très maniable, ce qui facilite l'ajout d'adresses IP et la personnalisation des plages.

+0

Merci! C'est comme ça que nous le faisons. – Ami

+0

Enquêter juste '$ _SERVER {'REMOTE_HOST'}' serait suffisant? Parce que peut-être l'utilisateur utilise un proxy. Il y a donc d'autres paramètres que vous devez vérifier, comme 'REMOTE_ADDR' ou [ceux-ci] (http://stackoverflow.com/questions/15699101/get-the-client-ip-address-using-php#15699240). Ai-je raison? ou faire ce que j'ai lié n'est pas utile? – stack

+0

Oui, utilisez simplement REMOTE_ADDR. –

1
$user_ip = $_SERVER['REMOTE_ADDR']; // get user ip 

$denyIPs = array("111.111.111", "222.222.222", "333.333.333"); 
if (in_array ($user_ip, $denyIPs)) { 
    // blocked ip 
} 
else { 
    // not blocked 
} 
+0

Salut j'ai essayé d'utiliser ce format 222.222.222.0/15, mais ne travaillait pas ... –

1

Cela a toujours travaillé très bien pour moi: Ce contrôle pour les variables de serveur appropriées et la compare à une liste d'adresses IP connues .. et oui, PHP ne comprend wildcards, donc en utilisant * au sein de l'IP aider à bloquer les plages d'adresses IP.

// The blacklisted ips. 
$denied_ips = array(
'1.2.3.4', 
'2.3.*', 
); 

// The function to get the visitor's IP. 
function getUserIP(){ 
    //check ip from share internet 
    if (!empty($_SERVER['HTTP_CLIENT_IP'])){ 
     $ip=$_SERVER['HTTP_CLIENT_IP']; 
    } 
    //to check ip is pass from proxy 
    elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])){ 
     $ip=$_SERVER['HTTP_X_FORWARDED_FOR']; 
    } else { 
     $ip=$_SERVER['REMOTE_ADDR']; 
    } 
    return $ip; 
} 
//The user 
$visitorIp = getUserIP(); 

// Now let's search if this IP is blackliated 
$status = array_search($visitorIp, $denied_ips); 

// Let's check if $status has a true OR false value. 
if($status !== false){ 
    echo '<div class="error">Your IP has been banned! Stop spamming us!</div>'; 
    // header("Location: http://zombo.com"); 
    // exit; 
} 

Il y a aussi un grand article à Perishable Press: http://perishablepress.com/how-to-block-ip-addresses-with-php/

+0

"et oui, PHP comprend les caractères génériques, donc en utilisant * dans l'IP avec aider à bloquer les plages d'adresses IP." en êtes-vous sûr? version spécifique de php peut-être? – artfulhacker

+0

Deny array avec redirection d'en-tête fonctionne bien :) – PipBoy2000

0

utilisant Revive code, l'utiliser pour faire fonctionner

// Now let's search if this IP is blackliated 
$status = false; 
foreach($denied_ips as $val) 
{ 
    if (strpos($val,'*') !== false) 
    { 
     if(strpos($visitorIp, array_shift(explode("*", $val))) === 0) 
     { 
      $status = true; 
      break; 
     } 
    } 
    else 
    { 
     if(strcmp($visitorIp, $val) === 0) 
     { 
      $status = true; 
      break; 
     } 
    } 
} 
-2
$deny = array("111.111.111", "222.222.222", "333.333.333"); 

if (in_array($_SERVER['REMOTE_ADDR'], $deny)) { 
    header("location:http://www.google.com/"); 
    exit(); 
} 
Questions connexes