2014-11-15 19 views
5

Komut dizim iki dosya açar: whitelist.txt ve blacklist.txt ip adresleriyle doldurulur.Verimlilik eklemek benim kara liste beyaz liste komut dosyası

Tüm ip örneklerini whitelist.txt dosyasında bir değişkene varolmayan blacklist.txt dosyasına eklemek istiyorum.

Bu komut dosyası en fazla 2 joker karaktere sahiptir.

Şu anda 37 dakika çalışır ve bunun daha hızlı olmasını isterim.

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

cevap

3

Bu kod ihtiyacınız olan şeyi yapar mı?

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

O çıkarır: Benim için bir joker için

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

Bu yalnızca çalışır. Siyah: 1.0.214.36 Beyaz: 1.0. *. * – Brandacus

+0

Scratch olsa da bu benim için çok çalışıyordu. Bunu yaptığını düşündüm:/Bir dosyadan çıkarılan değerlere sahip diziler, iki joker karakteriyle çalışmaz, ancak kodlanmış değerleri olan diziler çalışır. Dosyadan okunan diziyi döktüm ve bir dizinin kodlanmış gibi görünmesini okudum. Bu garip. Düşüncelerin neler? – Brandacus

+0

Sadece bir yazım hatası, üzgünüm :) Şimdi düzeltildi. * Için desen "\ d {1,2}" idi ve şimdi "\ d {1,3}". –