2014-11-15 3 views
5

Mein Skript öffnet zwei Dateien: whitelist.txt und blacklist.txt mit IP-Adressen gefüllt.Effizienz hinzufügen mein IP-Blacklist-Whitelist-Skript

Ich möchte alle Instanzen von ip in blacklist.txt hinzufügen, die nicht in whitelist.txt zu einer Variablen existieren.

Dieses Skript berücksichtigt bis zu 2 Platzhalter.

Es läuft im Moment 37 Minuten, und ich würde gerne dafür schneller sein.

$blacklist = file_get_contents("blacklist.txt"); 
$whitelist = file_get_contents("whitelist.txt"); 

$black_ips = explode("\n", $blacklist); 
$white_ips = explode("\n", $whitelist); 

$wildcard = array(); 
for($i = 0; $i < 256; $i++) { 
    $wildcard[] = $i; 
} 

foreach($black_ips as $bkey => $black) { 
    if(stristr($black, ".")) { 

    foreach ($white_ips as $wkey => $white) { 
     $count = substr_count($white, '*'); 

     if($count) { 
     switch($count){ 
      case 1: 
      foreach ($wildcard as $i) { 
       if(substr($white, 0, strlen($white) - 1) . $i == $black){ 
       continue 4; 
       } 
      } 
      break; 
      case 2: 
      foreach ($wildcard as $i) { 
       foreach ($wildcard as $k) { 
       if(substr($white, 0, strlen($white) - 3) . $i . '.' . $k == $black){ 
        continue 5; 
       } 
       } 
      } 
      break; 
     } 
     } 
     else if($black == $white) { 
     continue 2; 
     } 
    } 
    $nginxdeny .= "deny " . $black . ";\n"; 
    } 
} 

Antwort

3

Erfüllt dieser Code, was Sie brauchen?

$white = array(
    '192.168.*.*', 
    '10.10.10.*', 
); 

$black = array(
    '192.168.8.8', 
    '10.10.10.3', 
    '10.10.1.2', 
); 

$patterns = array(); 
foreach ($white as $subnetwork) { 
    $patterns[] = str_replace(array('.', '*'), array('\\.', '(\d{1,3})'), $subnetwork); 
} 

$notMatched = array(); 
foreach ($black as $ip) { 
    foreach ($patterns as $pattern) { 
     if (preg_match("/^{$pattern}$/", $ip)) { 
      continue 2; 
     } 
    } 
    $notMatched[] = $ip; 
} 

var_dump($notMatched); 

Es gibt:

array(1) { 
    [0]=> 
    string(9) "10.10.1.2" 
} 
+0

Dies funktioniert nur für eine Wildcard für mich. Schwarz: 1.0.214.36 Weiß: 1.0. *. * Das war sehr schnell, obwohl – Brandacus

+0

Scratch, dass es für mich jetzt funktioniert. Ich dachte es getan:/Arrays mit Werten extrahiert aus einer Datei arbeiten nicht mit zwei Platzhalter, sondern Arrays mit Werten hardcoded funktionieren. Ich habe das Array aus der Datei gelesen und es liest das gleiche wie ein Array würde hartcodierte aussehen. Das ist komisch. Was sind deine Gedanken? – Brandacus

+0

Nur ein Tippfehler im Code, sorry :) Es jetzt behoben. Muster für * war '\ d {1,2}' und jetzt ist es '\ d {1,3}'. –