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).
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.
12:16 Scritto da: nazarenolatella in SO: Linux | Link permanente | Commenti (0) | Segnala | Tag: xss, sqli, input sanitization, mysql, javascript, php, html, tags, special chars | OKNOtizie |
Facebook
15/08/2011
Visualizzare mediante PHP il nome del database utilizzato
Recentemente ho dovuto modificare parzialmente uno dei CRM che ho sviluppato. Non volendo inficiare il DB in produzione ho dovuto "clonarlo", in modo da poter fare i miei esperimenti in assoluta libertà.
Poichè volevo essere sicuro che ciascuna pagina utilizzasse effettivamente il database "clone" (avendo a disposizione un solo server), ho implementato un controllo in PHP che mi restituisse il nome del DB in uso all'apertura della pagina.
Ecco lo script:
$db = $mysqli -> query("SELECT DATABASE()");
while($riga1 = $db -> fetch_assoc())
{
echo $riga1["DATABASE()"];
}
La chiave di lettura delle righe di codice sopra riportate sta proprio nella funzione DATABASE() di MySQL, la quale consente di individuare il nome del DB in uso.
Da riga di comando avremo una situazione simile alla seguente:
mysql> SELECT DATABASE();
+------------+
| DATABASE() |
+------------+
| prova |
+------------+
1 row in set (0.00 sec)
mysql>
Il post termina qui, a presto.
16:45 Scritto da: nazarenolatella in Web Editing | Link permanente | Commenti (0) | Segnala | Tag: php, mysql, database(), current database | OKNOtizie |
Facebook
25/07/2011
Script per il backup giornaliero di un database remoto
Visto che la ridondanza non è mai troppa (Murphy vi dice qualcosa?), ho pensato di realizzare uno script per effettuare il backup di un database hostato su un server remoto.
Ecco lo script (basato su expect):
#!/usr/bin/expect -f
set date [exec date +%d_%m_%y]
set password1 "<pass1>"
set password2 "<pass2>"
set database "<nomedb>"
spawn ssh user@hostname
expect "*?assword:*"
send "$passwordr"
send "r"
expect ":~$"
send "mysqldump $database -u root -ppassvostrodb > $database_$date.plr"
send "$database_$date.pl user@hostname:/home/userr"
expect "*?assword:*"
send "$password2r"
send "r"
expect ":~$"
send "rm database_*r"
expect eof
Lo script in questione si collega via SSH al server remoto, esegue un dump del database per poi copiarlo tramite SCP sul mio server.
Affinchè tale script venga eseguito giornalmente (per la precisione ogni sera alle 22) è necessario editare il file /etc/crontab aggiungendo la seguente direttiva:
00 22 * * * user cd /home/user/ && ./backupremotedb > /dev/null 2>&1
Per ulteriori info contattatemi.
A presto.
















