Come rendere il database più sicuro

- MySQL, PHP

SQL inject

Se hai un sito web in cui memorizzi dati dell’utente è probabile che si utilizzi un database, come MySQL, SQLite o altro, ed è importante assicurarsi che il proprio database sia sicuro da e per gli utenti.

Creare istruzioni di query al volo come la sequente:

$sql = "INSERT INTO commenti (nome, commento) VALUES (".$nome.",".$commento.")";

è considerata una cattiva pratica che può essere facilmente superata, eliminando la maggior parte dei problemi, utilizzando dichiarazioni SQL prepare.

Realizzare istruzioni SQL come la precedente può essere rischioso. Se un utente malizioso invia, tramite il modulo del commento, una istruzione SQL appositamente predisposta, è possibile eseguire query al database. Invece, è necessario utilizzare dichiarazioni prepare come questa:

$sql = $db->prepare('INSERT INTO commenti (nome, commento) VALUES (?,?)');

aggiungere poi i valori singolarmente

$sql->bindParam(1, $nome);
$sql->bindParam(2, $commento);

e infine eseguire la query

$sql->execute();

Si trattano di poche righe in più, ma che rendono il vostro codice molto più sicuro.

Non solo il database deve essere al sicuro contro le query non intenzionali, ma anche gli utenti.
Se qualcuno è in grado di memorizzare un commento che sarà visualizzato da tutti gli altri utenti, allora l’input deve essere limitato a quello che ci aspettiamo, come in questo caso solo testo. Se invece permettiamo di scrivere codice HTML, un utente malizioso potrebbe caricare un malware da un altro sito, il classico exploit XSS.

Una soluzione semplice può essere l’utilizzo di funzioni per sterilizzare l’input, dunque sostituire, come nel caso citato, i tag HTML con quelli innocui.
Ad esempio, in un codice PHP che si interfaccia con un database MySQL è possibile utilizzare:

$nome = mysql_real_escape_string($_POST['nome']);

che inserisce l’escape davanti a caratteri speciali in una istruzione SQL.

Puoi leggere l’articolo su come utilizzare più istruzioni SQL prepare con PHP per approfondire l’argomento, e risolvere il problema di utilizzare più dichiarazioni SQL prepare per l’esecuzione.

Potrebbero Interessarti

  • Utilizzare più istruzioni SQL prepare con PHP MySQLi11 Febbraio 2010 Utilizzare più istruzioni SQL prepare con PHP MySQLi Giorni fa in ufficio, durante lo sviluppo di un'applicazione di gestione, mi sono imbattuto in un errore causato dal tentativo di utilizzare più istruzioni prepare di MySQLi. Ieri ho trovato un articolo che mi ha risolto il problema: Carson McDonald spiega quale sia la causa che […]
  • Utilizzare le Viste in MySQL5 Agosto 2010 Utilizzare le Viste in MySQL Un errore particolarmente importante che fanno molti programmatori è mescolare la logica applicativa e il modello. Gli sviluppatori PHP, ad esempio, hanno la tendenza di mettere insieme una quantità tremenda di query SQL nella loro logica del sito web, con conseguente […]
  • Evento Symfony Live 201016 Febbraio 2010 Evento Symfony Live 2010 Il principale evento della stagione dedicato totalmente al framework Symfony è iniziato ieri: è il secondo evento Symfony Live ma il primo dedicato alla comunità internazionale, in quanto il precedente era in lingua esclusivamente francese. La conferenza si terrà nel giorni 16-17 […]
  • Xdebug: debugging e profiling delle applicazioni PHP17 Febbraio 2011 Xdebug: debugging e profiling delle applicazioni PHP Xdebug è un'estensione PHP gratuita e open source che permette il debugging e il profiling degli script PHP in dettaglio. Considerando che è una estensione, l'utilizzo è facile e richiede pochissime configurazione per integrarlo nelle nostre applicazioni. Xdebug ti aiuta fornendo […]

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.