Logged as: guest
Login | Register
## noSentinel ##


Questa sentinella si occupa di bloccare alcuni attacchi usati per mettere in pericolo la sicurezza di un sito web e/o degli utenti dello stesso.
La sentinella, chiamata "noSentinel" (dal nickname dell'autore: nessuno, nobody in inglese; da cui la radice "no") è stata scritta in PHP OOP (Programmazione in PHP Orientata ad Oggetti).

Le funzioni principali di noSentinel si occupano di:

  • Bloccare attacchi "XSS" (Cross Site Scripting) [possiblità di bannare IP]
  • Bloccare attacchi "SQL INJECTIONS" [possiblità di bannare IP]
  • Bloccare RFI (Remote File Inclusion) [possiblità di bannare IP]
  • Convertire in entità html ogni variabile presente negli array super globali quali: $_POST, $_GET, $_COOKIE o $_REQUEST

Queste sono le funzioni principali a disposizione del programmatore.
Ci sono alcune funzioni "interne" alla classe, che vengono eseguite in automatico al momento in cui viene creato un nuovo oggetto.
Queste funzioni sono:
  • Bloccare "User Agent" inconsueti, dunque possibili exploit e scanner di vulnerabilità web
  • Sistema di BAN degli indirizzi IP che hanno provato più volte (massimo tre) ad attaccare il sito web

## installazione ##


Premettendo che in questa versione (la 0.0.1) non è disponibile lo script di installazione automatica, dovete fare questi piccoli e semplici passaggi che nella prossima versione verranno automatizzati.
Il primo passaggio è aprire il file della sentinella con un editor di testo e dare un occhiata alle prime righe:
il file: /path/dove_si_trova/noSentinel/sentinel.php
Diamo un occhiata al seguente codice:
    #### you MUST modify this email, whit your! ####
    protected $ADMIN_noSentinel = 	"your@address.here";
    #### if you want you can modify this file name (that are the databases)####
    ### do NOT remove the slashes before file names! ###
    protected $XSS_noSentinel =	"/xss.txt";
    protected $COUNT_noSentinel = 	"/count.txt";
    protected $NUMERIC_noSentinel = "/numeric.txt";
    protected $AGENT_noSentinel = 	"/agent.txt";
    protected $BAN_noSentinel = 	"/ban.txt";
    protected $SQL_noSentinel = 	"/sql.txt";
Come si può capire, dovete modificare l'indirizzo email con il vostro indirizzo e SE VOLETE (non è indispensabile) potete cambiare il nome dei file che useremo come database degli attacchi bloccati. NON rimuovere le slash "\" prima nei nomi!
Modificato il seguente file, non vi resta che creare nella directory di noSentinel i file VUOTI che avete definito prima, in questo caso i file:
  • xss.txt
  • count.txt
  • numeric.txt
  • agent.txt
  • ban.txt
  • sql.txt

Ultima cosa, creare il file .htaccess con il seguente contenuto (ovviamente sempre nella stessa directory della sentinella):
<Files ~ ".+">
Order allow,deny
Deny from all
Satisfy All
</Files>

Per attivare la protezione basta includere in ogni pagina che vorrete monitorata il seguente codice:
include_once(dirname(__FILE__)."/path/dove_si_trova/noSentinel/sentinel.php");
Io ad esempio ho aggiunto quella riga di codice all'interno del file delle funzioni che viene incluso in ogni pagina del sito.

## utilizzo ##

Creiamo un nuovo oggetto:
Notice: Undefined variable: COOKIE in /web-sites/nessuno/noSentinel/menu.php on line 77 Notice: Use of undefined constant CHECK - assumed 'CHECK' in /web-sites/nessuno/sentinel/sentinel.php on line 64
$test = new noSentinel(0, $_POST, $_GET, $_COOKIE)
Spieghiamo.

Nel primo parametro è stato inserito uno zero (0). Se noi avessimo voluto trasformare in entità html i parametri passati dopo basta sostitiure lo zero con la stringa "entities". In questo modo:
$test = new noSentinel(entities, $_POST, $_GET, $_COOKIE)
Gli altri tre parametri sono inseriti in ordine casuale, si possono tranquillamente scambiare. Qui gli abbiamo inseriti tutti e tre, ma è possible inserirne anche solo uno.
Al posto di inserire tutti i tre i parametri sarebbe stato possibile inserire solamente $_REQUEST e lasciare inalterati gli altri.

Ora che abbiamo creato l'oggetto da utilizzare non ci resta che utilizzare le sue funzioni.

Già avendo creato l'oggetto abbiamo attivato delle funzioni, che sono: il controllo dell'user agent ed il controllo degli IP bannati.

## funzioni id ##

Le funzioni id sono utili quando lavoriamo direttamente con gli array super globali sopra citati.
Per esempio se volessimo controllare che una stringa "k" passata tramite il metodo GET non sia un possibile attacco XSS.
La nostra variabile ha il seguente aspetto $_GET['k'].

Useremo la funzione xss_id_check, in questo modo:
if($test->xss_id_check('k'))
    echo "Nessun tentativo di attacco XSS rilevato";
else echo "I Tuoi dati sono stati salvati :\ Attacco di tipo XSS rilevato";
Come si può notare la funzione restituisce falso in caso venga rilevato un attacco di tipo XSS, vero in caso contrario.
La funzione xss_id_check ha un secondo parametro OPZIONALE. Il parametro per l'aggiunta al contatore degli attacchi da un determinato IP. Questo parametro è: BAN
Basterà modificare la funzione in questo modo:
if($test->xss_id_check('k',BAN))
    echo "Nessun tentativo di attacco XSS rilevato";
else echo "I Tuoi dati sono stati salvati. Attacco di tipo XSS rilevato";
Per aggiungere uno (+1) al numero di attacchi effettuati da un determinato IP.
Ovviamente se per comodità  volete solo notificare un caso di intrusione basta modificare l'istruzione if anteponendo l'operatore ! (NOT logico).

Un altra funzione id è la funzione sql_id_check. La sua sintassi è identica a quella della funzione appena spiegata.
Questa funzione blocca gli attacchi di tipo "SQL Injections". Utilizzando la stessa variabile $_GET['k'] di prima un esempio potrebbe essere:
if($test->sql_id_check('k'))
    echo "Nessun attacco di tipo SQL rilevato";
else echo "I Tuoi dati sono stati salvati. Attacco di tipo SQL INJECTION rilevato";
Per l'operazione di somma al numero di tentativi di intrusione effettuati, vale lo stesso discorso di prima.
if(!$test->sql_id_check('k',BAN)) //anteponendo l'operatore NOT
    echo "I Tuoi dati sono stati salvati. Attacco di tipo SQL INJECTION rilevato";
Un altra funzione a disposizione del programmatore è: numeric_id_check.
Questa funzione controlla che la variabile sia di tipo numerico, utile quando per esempio si ha un guestbook che include volta per volta una pagina numerata in progressione, passando la variabile tramite GET.
La sintassi è identica alle precedenti.
if(!$test->numeric_id_check('k')) //anteponendo l'operatore NOT
    echo "I Tuoi dati sono stati salvati. Questa variabile non accetta dati di tipo non numerico";
Per l'operazione di somma al numero di tentativi di intrusione effettuati dall'ip dell'attacker valo lo stesso discorso di prima.
if(!$test->numeric_id_check('k',BAN)) //anteponendo l'operatore NOT
    echo "I Tuoi dati sono stati salvati. Questa variabile non accetta dati di tipo non numerico";

## funzioni su variabili assegnate ##

Questo tipo di funzione è utile da utilizzare quando si usano le varabili prese dagli array super globali sopra citati a si assegnano a variabili interne.
Un esempio è questo caso:
$variabile = isset($_GET['k']) ? $_GET['k'] : '';
Assegnamo il valore di $_GET['k'] alla variabile $variabile solo se è stata settata, altrimenti niente.

Le funzioni disponibili fanno esattamente gli stessi controlli delle precedenti, cambia solo il nome.
  • xss_check
  • sql_check
  • numeric_check
La sintassi differisce solo per quanto riguarda il modo di passare il valore. Un esempio di utilizzo delle funzioni, chiarisce egregiamente il concetto.
<?php
 
    $variabile1 = isset($_GET['k']) ? $_GET['a'] : '';
    $variabile2 = isset($_GET['k']) ? $_GET['b'] : '';
    $variabile3 = isset($_GET['k']) ? $_GET['c'] : '';
 
    $test = new noSentinel(0,$_GET);
 
    if(!$test->xss_check($variabile1))
	  echo "Dati salvati, rilevato tentativo di attacco XSS\n";
    else echo(htmlentities($variabile1));
 
    if(!$test->sql_check($variabile2,BAN))
	  die('Attacco di TIPO SQL, chiudo la connessione alla pagina');
    else echo(htmlentities($variabile2));
 
    if(!$test->numeric_check($variabile3))
	  die('Non è stato passato un valore numerico come richiesto');
 
    #questi tre sono esempi molto banali per chiarire in concetto ;-)
?>
Penso che l'esempio sia abbastanza chiaro su come usare le funzioni, anche qui è disponibile il parametro opzionale "BAN" per ogni funzione, come usato nella funzione sql_check.

## funzioni utili e pubblicitarie ##

Sono disponibili le seguenti funzioni:
  • banner();
  • show_version();
  • show_counter

Queste funzioni sono "funzioni grafiche" in quanto non controllano nulla, ma si limitano a mandare in output il loro contenuto.
Una pagina d' esempio molto banale di utilizzo di queste funzioni:
<?php
 
    $test = new noSentinel(0);
    echo "<br />";
    echo($test->show_version()."<br />");
    echo($test->show_counter()."<br />");
    echo($test->banner());
 
?>
Questa pagina darà in output il seguente risultato: Notice: Use of undefined constant CHECK - assumed 'CHECK' in /web-sites/nessuno/sentinel/sentinel.php on line 64
noSentinel, version: 0.0.1
noSentinel Attack locked: 159



Come potete vedere quella che si nota maggiormente è il banner che viene centrato tramite gli appositi tag html.
Lo stile dei link cambierà a seconda dello stile (stile inteso come colore e carattere del font) adottato dal vostro sito web, ma non le dimensioni.

Sorgente con evidenziazione : qui
Sorgente versione .txt: qui
Archivio tar: qui

Discussione di riferimento: qui

Sorgenti e guida rilasciati sotto licenza Creative Commons Attribution-Share Alike 2.5 Italy License.
Potete condividere liberamemente la guida ed i sorgenti ed utilizzarli a patto che citate la fonte, ovvero mettendo un link a http://nessuno.gotdns.org/ e/o al forum http://nessuno.gotdns.org/forum/. (potete usare la funzione banner(); ;-) )