Come evitare sql-injection in php
Link sponsorizzati
Questo articolo per molti di voi sembrerà banale.. ma voglio comunque pubblicarlo. Come molti di voi sanno è possibile ricevere nel proprio sito attacchi di vario tipo. Uno degli attacchi più noti e l’sql-injection. Questa tecnica di hacking consiste nello sfruttare l’input non validato da parte del programmatore e di conseguenza inserire, modificare o leggere in maniera inappropriata informazioni all’interno del database. Può anche essere usato, per esempio, per loggarsi come admin all’interno di un sito.
Questo è un esempio di un codice non buono, che permette un’eventuale sql-injection.
Link sponsorizzati
//ipotizziamo che abbiamo fatto la connessione al db
$query = "SELECT * FROM users WHERE utente='".$_POST['username']."' AND password='".$_POST['password']."'";
$r = mysql_query($query);
$n = mysql_num_rows($r);
if($r == 1) {
echo "Utente loggato con successo";
}else {
echo "Errore nell'inserimento dei dati";
}
?>
Questo codice è corretto, sintatticamente parlando, e, se usato in modo appropriato, funziona. Il problema è dato dal fatto che, questo codice, non tiene conto dell’input inserito dall’utente, fidandosi cecamente. Ora.. ipotizziamo di inserire nel campo utente admin e nel campo password ‘ OR ”=’. Come diventa la query? Così:
Cosa vuol dire? Vuol dire che la query è sempre vera, a meno che nel database non esiste l’utente admin. Quindi, potenzialmente, ci siamo loggati come amministratori del sito (ripeto, se l’admin ha come username admin) e possiamo fare quello che vogliamo.
Come si risolve il problema? Semplice si usa la funzione mysql_real_escape_string che metti gli escape all’interno della stringa. Questo il codice corretto:
//ipotizziamo che abbiamo fatto la connessione al db
$query = "SELECT * FROM users WHERE utente='".mysql_real_escape_string($_POST['username'])."' AND password='".mysql_real_escape_string($_POST['password'])."'";
$r = mysql_query($query);
$n = mysql_num_rows($r);
if($r == 1) {
echo "Utente loggato con successo";
}else {
echo "Errore nell'inserimento dei dati";
}
?>
Spero vi sia stato utile. Alla prossima!
Link sponsorizzati

