admin Founder


Registrato: Oct 03, 2008 Messaggi: 261
|
Inviato: Mar Apr 14, 2009 11:59 pm Oggetto: [PHP] DoS blocker |
|
|
Lo stavo per postare su MyHack in seguito alla richiesta di murdercode di sviluppare qualche plugin che mettesse in black list i singoli indirizzi o le subnet dei dosser, ma proprio mentre lo stavo per postare è arrivato un DoS che ha saturato il massimo numero di query ammissibili sul database, quindi lo posto qui sperando che qualcuno di MyHack lo legga e lo applichi sul forum, o anche che possa tornare utile a chiunque voglia proteggersi da attacchi DoS.
| Codice: | <?php
define ('BLACKLIST','black.list');
$list=file(BLACKLIST);
foreach ($list as $addr) {
$addr=trim($addr);
$host_addr=$_SERVER['REMOTE_ADDR'];
// Semplice indirizzo IP
if ($host_addr==$addr)
die ("Your IP is {$addr} and you're not allowed to view this page\n");
// Subnet di classe C
else if (preg_match('/(\d+\.\d+\.\d+)\.0\/24/',$addr,$sub)) {
$subnet=trim($sub[1]);
if (preg_match("/^{$subnet}/",$host_addr))
die ("Your IP is {$host_addr} and you're not allowed to view this page\n");
}
// Subnet di classe B
else if (preg_match('/(\d+\.\d+)\.0\.0\/16/',$addr,$sub)) {
$subnet=trim($sub[1]);
if (preg_match("/^{$subnet}/",$host_addr))
die ("Your IP is {$host_addr} and you're not allowed to view this page\n");
}
// Subnet di classe A
else if (preg_match('/(\d+)\.0\.0\.0\/8/',$addr,$sub)) {
$subnet=trim($sub[1]);
if (preg_match("/^{$subnet}/",$host_addr))
die ("Your IP is {$host_addr} and you're not allowed to view this page\n");
}
}
?> |
Quello che fa concettualmente è molto semplice. Attinge dal file black.list la lista degli IP bannati (o anche intere subnet), confronta l'IP che prova a collegarsi con quelli nella lista e se c'è un match piazza un die nella pagina. Il match si può fare sia inserendo nella lista IP singoli, sia inserendo subnet di classe A, B o C. Ad esempio, se metto in blacklist 1.2.0.0/16 e si collega qualcuno con indirizzo IP 1.2.3.4, quest'ultimo verràbuttato fuori in quanto il suo IP appartiene alla subnet incriminata.
Il codice in questione è consigliabile inserirlo in una pagina che viene sempre richiamata dal CMS. Ad esempio, l'header del forum o del blog, in modo che venga sempre eseguito al richiamo di ogni script PHP.
By BlackLight |
|