2009-07-07 9 views

Antwort

5

können Sie ip2long verwenden gepunkteten Quads zu lange Werte zu konvertieren, dann nur etwas Arithmetik ausführen eine gegebene Netzwerk/Maske Kombination zu überprüfen:

$network=ip2long("200.10.10.0"); 
$mask=ip2long("255.255.255.0"); 

$remote=ip2long($_SERVER['REMOTE_ADDR']); 

if (($remote & $mask) == $network) 
{ 
    //match! 
} 
else 
{ 
    //does not match! 
} 
+0

+1 Das ist eine viel bessere Lösung als damals, die ich mir ausgedacht habe. Vielen Dank! –

3

Nun, vorausgesetzt, Sie verwenden Apache, gibt es ein Modul namens mod_authz_host, das Sie verwenden können.

Zusammen mit der Datei-Direktive können Sie den Zugriff auf ein bestimmtes PHP-Skript für eine Reihe von IP-Adressen beschränken. Hier

ist der Link zu der Dokumentation zu diesem Modul: http://httpd.apache.org/docs/2.2/mod/mod_authz_host.html

Hier ist ein kurzes Beispiel (vorausgesetzt, Ihre PHP-Datei heißt admin.php):

<file admin.php> 
    Order Deny,Allow 
    Deny from all 
    Allow from 200.10.10 
</file> 

Der zusätzliche Nutzen für die andere Die hier vorgeschlagene Lösung besteht darin, dass Sie die Sicherheitsaspekte von außerhalb Ihrer Anwendungslogik steuern können - ein flexiblerer Ansatz, der Ihrem PHP-Code keine Einschränkungen auferlegt.

+0

+1 für diese in der Server-config/.htaccess-Datei zur Festsetzung anstatt in PHP (wenn die OP Zugriff hat) – Cheekysoft

+0

Ich mag auch diese Lösung. Ich denke, ich könnte auch einen kompletten virtuellen Host oder ein Verzeichnis schützen. Ich habe keine Lösung in PHP, obwohl. –

-1

PHP Limit/Block-Webseite Anfragen für Spinnen/Bots/Kunden usw. Hier habe ich eine PHP-Funktion geschrieben, die unerwünschte Anfragen blockieren kann, um Ihren Website-Traffic zu reduzieren. Gott für Spinnen, Bots und nervige Kunden. DEMO: http://szczepan.info/9-webdesign/php/1-php-limit-block-website-requests-for-spiders-bots-clients-etc.html

/* Function which can Block unwanted Requests 
* @return boolean/array status 
*/ 
function requestBlocker() 
{ 
     /* 
     Version 1.0 11 Jan 2013 
     Author: Szczepan K 
     http://www.szczepan.info 
     me[@] szczepan [dot] info 
     ###Description### 
     A PHP function which can Block unwanted Requests to reduce your Website-Traffic. 
     God for Spiders, Bots and annoying Clients. 

     */ 

     $dir = 'requestBlocker/'; ## Create & set directory writeable!!!! 

     $rules = array(
       #You can add multiple Rules in a array like this one here 
       #Notice that large "sec definitions" (like 60*60*60) will blow up your client File 
       array(
         //if >5 requests in 5 Seconds then Block client 15 Seconds 
         'requests' => 5, //5 requests 
         'sek' => 5, //5 requests in 5 Seconds 
         'blockTime' => 15 // Block client 15 Seconds 
       ), 
       array(
         //if >10 requests in 30 Seconds then Block client 20 Seconds 
         'requests' => 10, //10 requests 
         'sek' => 30, //10 requests in 30 Seconds 
         'blockTime' => 20 // Block client 20 Seconds 
       ), 
       array(
         //if >200 requests in 1 Hour then Block client 10 Minutes 
         'requests' => 200, //200 requests 
         'sek' => 60 * 60, //200 requests in 1 Hour 
         'blockTime' => 60 * 10 // Block client 10 Minutes 
       ) 
     ); 
     $time = time(); 
     $blockIt = array(); 
     $user = array(); 

     #Set Unique Name for each Client-File 
     $user[] = isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : 'IP_unknown'; 
     $user[] = isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : ''; 
     $user[] = strtolower(gethostbyaddr($user[0])); 

     # Notice that i use files because bots does not accept Sessions 
     $botFile = $dir . substr($user[0], 0, 8) . '_' . substr(md5(join('', $user)), 0, 5) . '.txt'; 


     if (file_exists($botFile)) { 
       $file = file_get_contents($botFile); 
       $client = unserialize($file); 

     } else { 
       $client    = array(); 
       $client['time'][$time] = 0; 
     } 

     # Set/Unset Blocktime for blocked Clients 
     if (isset($client['block'])) { 
       foreach ($client['block'] as $ruleNr => $timestampPast) { 
         $left = $time - $timestampPast; 
         if (($left) > $rules[$ruleNr]['blockTime']) { 
           unset($client['block'][$ruleNr]); 
           continue; 
         } 
         $blockIt[] = 'Block active for Rule: ' . $ruleNr . ' - unlock in ' . ($left - $rules[$ruleNr]['blockTime']) . ' Sec.'; 
       } 
       if (!empty($blockIt)) { 
         return $blockIt; 
       } 
     } 

     # log/count each access 
     if (!isset($client['time'][$time])) { 
       $client['time'][$time] = 1; 
     } else { 
       $client['time'][$time]++; 

     } 

     #check the Rules for Client 
     $min = array(
       0 
     ); 
     foreach ($rules as $ruleNr => $v) { 
       $i   = 0; 
       $tr   = false; 
       $sum[$ruleNr] = ''; 
       $requests  = $v['requests']; 
       $sek   = $v['sek']; 
       foreach ($client['time'] as $timestampPast => $count) { 
         if (($time - $timestampPast) < $sek) { 
           $sum[$ruleNr] += $count; 
           if ($tr == false) { 
             #register non-use Timestamps for File 
             $min[] = $i; 
             unset($min[0]); 
             $tr = true; 
           } 
         } 
         $i++; 
       } 

       if ($sum[$ruleNr] > $requests) { 
         $blockIt[]    = 'Limit : ' . $ruleNr . '=' . $requests . ' requests in ' . $sek . ' seconds!'; 
         $client['block'][$ruleNr] = $time; 
       } 
     } 
     $min = min($min) - 1; 
     #drop non-use Timestamps in File 
     foreach ($client['time'] as $k => $v) { 
       if (!($min <= $i)) { 
         unset($client['time'][$k]); 
       } 
     } 
     $file = file_put_contents($botFile, serialize($client)); 


     return $blockIt; 

} 


if ($t = requestBlocker()) { 
     echo 'dont pass here!'; 
     print_R($t); 
} else { 
     echo "go on!"; 
}