Relevés préparés et sécurité des noms de table : un examen critique
De nombreux développeurs s'appuient sur mysqli_stmt_bind_param
pour prévenir les vulnérabilités d'injection SQL. Cependant, cette approche présente des défis lors de la tentative de paramétrage des noms de tables.
Considérez cet exemple :
<code class="language-php">function insertRow($db, $mysqli, $new_table, $Partner, $Merchant, $ips, $score, $category, $overall, $protocol) { $statement = $mysqli->prepare("INSERT INTO " . $new_table . " VALUES (?,?,?,?,?,?,?);"); mysqli_stmt_bind_param($statement, 'sssisss', $Partner, $Merchant, $ips, $score, $category, $overall, $protocol); $statement->execute(); }</code>
Bien que cela tente d'atténuer l'injection SQL en liant des variables, cela laisse le nom de la table, $new_table
, vulnérable. Pouvons-nous utiliser un espace réservé pour $new_table
dans la déclaration préparée ?
Non. Les instructions préparées par la base de données ne prennent en charge la liaison de paramètres que pour les valeurs, pas pour les identifiants de table ou de colonne. En effet, le nom de la table fait partie intégrante de la structure et de la validité de l'instruction SQL ; le modifier dynamiquement pourrait conduire à un SQL invalide.
Même avec des interfaces de base de données comme PDO, qui offrent une utilisation plus flexible des espaces réservés, tenter de remplacer un nom de table entraîne directement un SQL invalide :
<code class="language-sql">SELECT * FROM ?</code>
L'approche correcte consiste à utiliser l'interpolation de chaînes :
<code class="language-php">SELECT * FROM {$mytable}</code>
Cependant, cela nécessite une mesure de sécurité cruciale : liste blanche stricte des tables. Validez toujours $mytable
par rapport à une liste prédéfinie de noms de tables autorisés pour empêcher toute entrée malveillante de compromettre votre base de données. Ne vous fiez jamais uniquement aux instructions préparées pour la sécurité des noms de table.
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!