18/01/2012

PHP e mysql: input sanitization di base

Tutti gli addetti ai lavori sanno (o almeno dovrebbero sapere) che nell'ambito della sicurezza Web occorre prestare particolare attenzione ai dati trasmessi al server mediante gli appositi form HTML.

Tale operazione si rende indispensabile poichè un utente malevolo potrebbe "postare" delle stringhe "ad hoc" per "iniettare" del codice SQL arbitrario (SQL injection) oppure inserire all'interno della pagina del codice HTML (o javascript) che provoca il reindirizzamento su un sito infetto (iframe, redirect et similia, ovvero tutto ciò che riguarda gli attacchi XSS).

background_xss.gif

Per questo motivo ho deciso di postare qualche riga di codice PHP che consente di filtrare in modo rapido ed efficace i dati immessi dagli utenti.

In particolare, vengono svolti due controlli: il primo si occupa dell'individuazione (e la successiva rimozione) dei caratteri speciali di MySQL (apice singolo, apice doppio, backslash, cancelletto, ecc.), mentre il secondo verifica che non vi siano dei tag HTML all'interno delle stringhe immesse nei campi di input.

Ecco il codice:

if(isset($_POST['username']) && $_POST['username'] != '')
{
$username = mysqli_real_escape_string($mysqli,strip_tags($_POST['username']));
}

else
{
        $errore = 'Devi inserire lo username';
 }

Come potete notare, il campo su cui è stato implementato il filtro è quello relativo allo username. Per prima cosa viene verificato che la variabile $_POST['username'] sia settata e non sia vuota.

Se tale controllo va a buon fine, tramite la funzione strip_tags() viene rimosso l'eventuale codice HTML e successivamente, mediante mysqli_real_escape_string() vengono filtrati i caratteri speciali relativi a MySQL.

Ovviamente, attraverso tale meccanismo non darete agli utenti la possibilità di scegliere username del tipo:

<username>

o ancora:

username#

ma si sa, in questi casi bisogna certamente scendere a compromessi e capire dove sta il male minore.

A presto.

27/12/2011

Exim4: ripulire i frozen messages

Sempre più spesso mi capita di vedere rigettati dallo smarthost (leggere server SMTP) una miriade di messaggi generati dai sistemi di monitoring attivi sui miei server.

 

mail.jpg

Per intenderci, lanciando un cat /var/log/exim4/mainlog, l'output seguente è costellato da info del tipo:

2011-12-26 23:20:01 1Rehhj-0000tY-BZ Message is frozen
2011-12-26 23:20:01 1Rex2z-0003El-5p Message is frozen
2011-12-26 23:20:01 1RfIpL-0000Pq-Dg Message is frozen
2011-12-26 23:20:01 1ReajD-0001FI-Nb Message is frozen
2011-12-26 23:20:01 1Rf4Wf-0000oG-AG Message is frozen
2011-12-26 23:20:01 1Rf8Ho-0003Ku-Pq Message is frozen
2011-12-26 23:20:01 1ReloA-0003d2-AH Message is frozen
2011-12-26 23:20:01 1ReaZS-00018P-KD Message is frozen

Ok, i messaggi caratterizzati da questi ID sono "bloccati" in coda. Cosa fare dunque? Bhè, se non sono di vitale importanza, possiamo semplicemente cestinarli grazie a questo semplice comando:

nightfly@nightbox:~$ sudo exiqgrep -z -i | xargs exim -Mrm

Potete anche impostare un job su cron per eliminarli giornalmente ed evitare la formazione delle suddette code.

A presto.

06/12/2011

Cancellazione di una regola PAT sul router Cisco 837: %Static entry in use, cannot remove

Recentemente ho dovuto modificare le regole per il PAT presenti sul mio router Cisco 837, provando a rimuovere alcune entry. Poichè esse erano ancora in uso, ogni volta che provavo a cancellarle mi beccavo un messaggio del tipo:

%Static entry in use, cannot remove

Ho risolto semplicemente cancellando il contenuto della tabella relativa alle NAT translations, lanciando il comando:

clear ip nat translation *

e successivamente ho rimosso la regola per il PAT vera e propria.

Bye.