Maison > base de données > tutoriel mysql > Les instructions préparées peuvent-elles paramétrer en toute sécurité les noms de tables ?

Les instructions préparées peuvent-elles paramétrer en toute sécurité les noms de tables ?

DDD
Libérer: 2025-01-23 18:16:14
original
657 Les gens l'ont consulté

Can Prepared Statements Securely Parameterize Table Names?

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>
Copier après la connexion

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>
Copier après la connexion

L'approche correcte consiste à utiliser l'interpolation de chaînes :

<code class="language-php">SELECT * FROM {$mytable}</code>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal