2014-11-15 13 views
5

Mój skrypt otwiera dwa pliki: whitelist.txt i blacklist.txt wypełnione adresami IP.Dodawanie efektywności Skrypt do mojej czarnej listy-białej listy IP

Chcę dodać wszystkie wystąpienia ip w blacklist.txt, które nie istnieją w whitelist.txt do zmiennej.

Ten skrypt zawiera maksymalnie 2 znaki wieloznaczne.

Działa teraz przez 37 minut, a ja chciałbym, aby było szybciej.

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

Odpowiedz

3

Czy ten kod spełnia wszystkie wymagania?

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

To Wyjścia:

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

Zadziała tylko dla jednego zamiennika dla mnie. Czarny: 1.0.214.36 Biały: 1.0. *. * To było bardzo szybkie, ale – Brandacus

+0

Zdrap to teraz działające dla mnie. Myślałem, że to zrobiło:/Tablice z wartościami wyodrębnionymi z pliku nie działają z dwoma znakami wieloznacznymi, ale tablice z wartościami zakodowanymi na stałe działają. Zrzuciłem tablicę odczytaną z pliku i odczytałem ją tak samo, jak tablica wyglądałaby na sztywno. To jest dziwne. Jakie są Twoje myśli? – Brandacus

+0

Po prostu literówka w kodzie, przepraszam :) Naprawiono to teraz. Wzór dla * to '\ d {1,2}', a teraz '\ d {1,3}'. –

Powiązane problemy