


Les instructions préparées peuvent-elles gérer les noms de tables paramétrés pour empêcher l'injection SQL ?
Jan 23, 2025 pm 05:56 PMRelevés préparés : peuvent-ils gérer les noms de tables paramétrés ?
Cet article aborde la question cruciale de savoir si les instructions préparées peuvent gérer efficacement les noms de tables paramétrés pour empêcher les vulnérabilités d'injection SQL.
Le problème :
L'intégration directe des données fournies par l'utilisateur dans les requêtes SQL, y compris les noms de tables, constitue un risque de sécurité majeur. Prenons cet exemple :
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( $statment, 'sssisss', $Partner, $Merchant, $ips, $score, $category, $overall, $protocol ); $statement->execute(); }
La concaténation .$new_table.
rend cette fonction vulnérable à l'injection SQL si $new_table
n'est pas correctement nettoyée.
Tentative de paramétrage :
Une tentative courante pour atténuer ce problème consiste à essayer de paramétrer le nom de la table :
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(); }
La réalité :
Malheureusement, cette approche échoue. Les instructions préparées sont conçues pour protéger contre l'injection de valeur runtime, et non contre la modification de la structure de la requête SQL elle-même. L'analyseur de base de données interprète le nom de la table comme faisant partie de la structure de la requête, et non comme un paramètre d'exécution. Le remplacer par un espace réservé entraîne un SQL invalide.
Même avec des systèmes offrant l'émulation d'instructions préparées, comme PDO, le résultat serait une requête invalide (par exemple, SELECT * FROM 'mytable'
au lieu de SELECT * FROM mytable
).
La solution :
Le seul moyen fiable d'empêcher l'injection SQL lors du traitement des noms de table fournis par l'utilisateur est d'utiliser une liste blanche stricte. Cela implique de prédéfinir une liste de noms de table autorisés et de garantir que tout nom de table fourni par l'utilisateur est vérifié par rapport à cette liste blanche avant d'être utilisé dans une requête. N'utilisez jamais directement les entrées de l'utilisateur pour construire des requêtes SQL impliquant des noms de tables.
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!

Article chaud

Outils chauds Tags

Article chaud

Tags d'article chaud

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

Réduisez l'utilisation de la mémoire MySQL dans Docker

Comment modifier une table dans MySQL en utilisant l'instruction ALTER TABLE?

Comment résoudre le problème de MySQL ne peut pas ouvrir la bibliothèque partagée

Exécutez MySQL dans Linux (avec / sans conteneur Podman avec phpmyadmin)

Comment sécuriser MySQL contre les vulnérabilités communes (injection SQL, attaques par force brute)?

Exécuter plusieurs versions MySQL sur macOS: un guide étape par étape

Comment configurer le cryptage SSL / TLS pour les connexions MySQL?
