Les instructions paramétrées peuvent-elles gérer les noms de table ?
Vous avez rencontré un problème en essayant de paramétrer le nom de la table dans une instruction préparée. La séparation des variables destinées à la protection contre l'injection SQL a entraîné des erreurs.
Le code que vous avez fourni inclut la fonction insertRow, qui tente de lier le nouveau nom de table sous forme d'instruction de point d'interrogation.
function insertRow( $db, $mysqli, $new_table, $Partner, $Merchant, $ips, $score, $category, $overall, $protocol ) { $statement = $mysqli->prepare("INSERT INTO (?) VALUES (?,?,?,?,?,?,?);"); mysqli_stmt_bind_param( $statment, 'ssssisss', $new_table, $Partner, $Merchant, $ips, $score, $category, $overall, $protocol ); $statement->execute(); }
Malheureusement, paramétrer le nom de la table dans une instruction préparée n'est pas possible. Les instructions préparées permettent uniquement de lier les paramètres aux éléments « valeur » d'une instruction SQL. Les noms de table ne sont pas des valeurs d'exécution et modifient la validité de l'instruction, modifiant potentiellement sa signification.
Même si une interface de base de données comme PDO autorisait la substitution d'espace réservé n'importe où, la valeur de l'espace réservé de la table serait une chaîne incluse dans le SQL, ce qui entraîne un SQL invalide.
Pour se protéger contre l'injection SQL, il est essentiel d'utiliser une liste blanche de tables et de vérifier les entrées de l'utilisateur par rapport à cette liste. Votre code doit ressembler à ce qui suit :
if (in_array($mytable, $whitelist)) { $result = $db->query("SELECT * FROM {$mytable}"); }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!