Problemi delle query in PDO in PHP
Come dovresti già sapere, le query SQL sono vulnerabili alle SQL injection. L'estensione PDO è progettata per combattere le injection, ma di default, non lo fa automaticamente.
Esaminiamo il problema con un esempio. Supponiamo di avere la seguente query, in cui viene inserita una variabile:
<?php
$sql = "SELECT * FROM users WHERE id=$id";
$res = $pdo->query($sql);
?>
Supponiamo che la nostra variabile provenga da un input esterno, ad esempio, da un parametro GET. Per semplicità, però, impostiamo semplicemente il suo valore manualmente. Ci aspettiamo un valore numerico, ad esempio, così:
<?php
$id = 1;
?>
Un malintenzionato hacker, tuttavia, potrebbe passare
il seguente valore (supponiamo che esista
un campo role):
<?php
$id = '-1 OR role="admin"';
?>
Il risultato è che noi intendevamo la seguente query:
<?php
$sql = "SELECT * FROM users WHERE id=1";
$res = $pdo->query($sql);
?>
Ma abbiamo ottenuto la seguente, che estrae l'amministratore del sito:
<?php
$sql = "SELECT * FROM users WHERE id=-1 OR role="admin"";
$res = $pdo->query($sql);
?>
Per evitare questa situazione, in PDO è previsto un meccanismo speciale, chiamato prepared statements (query preparate). Le analizzeremo nella prossima lezione.
Esegui intenzionalmente una SQL injection nel tuo database.