Position actuelle: Accueil> Derniers articles> Quel rôle important MySQLI_STMT :: __ Construct joue-t-il pour prévenir l'injection SQL?

Quel rôle important MySQLI_STMT :: __ Construct joue-t-il pour prévenir l'injection SQL?

gitbox 2025-07-26

L'injection SQL est l'une des vulnérabilités de sécurité communes dans les applications Web. Les attaquants obtiennent un accès à la base de données non autorisés en insérant le code SQL malveillant dans les requêtes. Pour empêcher l'injection de SQL, les développeurs doivent prendre une série de mesures pour assurer la sécurité des requêtes SQL. Dans PHP, la construction MySQLI_STMT :: __ , en tant que mécanisme de déclaration de prétraitement, fournit aux développeurs un outil puissant pour aider à prévenir les attaques d'injection SQL. Cet article explorera en profondeur la façon dont MySQLI_STMT :: __ Construct joue un rôle important dans la prévention de l'injection SQL.

1. Concepts de base des déclarations de prétraitement

MySQLI_STMT :: __ Construct est une méthode fournie par l'extension MySQLI en PHP pour créer un nouvel objet de déclaration de prétraitement. Contrairement aux instructions de requête SQL ordinaires, les instructions de prétraitement permettent séparément le traitement des instructions et des données SQL, empêchant ainsi efficacement l'injection de code malveillante. En utilisant des instructions de prétraitement, les développeurs peuvent transmettre séparément la structure et les paramètres des requêtes SQL au serveur de base de données, évitant les utilisateurs malveillants de manipuler les instructions SQL.

2. Comment fonctionne l'injection SQL

Les attaques d'injection SQL sont généralement implémentées en insérant le code SQL malveillant dans les champs d'entrée utilisateur. Par exemple, supposons qu'un formulaire de connexion reçoit un nom d'utilisateur et un mot de passe et utilise la requête SQL suivante pour vérifier l'identité de l'utilisateur:

 <span><span><span class="hljs-variable">$sql</span></span><span> = </span><span><span class="hljs-string">"SELECT * FROM users WHERE username = '<span class="hljs-subst">$username</span></span></span><span>' AND password = '</span><span><span class="hljs-subst">$password</span></span><span>'";
</span></span>

Si l'attaquant entre dans le contenu suivant dans le champ du nom d'utilisateur:

 <span><span><span class="hljs-string">' OR '</span></span><span>1</span><span><span class="hljs-string">' = '</span></span><span>1
</span></span>

La requête deviendra:

 <span><span><span class="hljs-keyword">SELECT</span></span><span> </span><span><span class="hljs-operator">*</span></span><span> </span><span><span class="hljs-keyword">FROM</span></span><span> users </span><span><span class="hljs-keyword">WHERE</span></span><span> username </span><span><span class="hljs-operator">=</span></span><span> </span><span><span class="hljs-string">''</span></span><span> </span><span><span class="hljs-keyword">OR</span></span><span> </span><span><span class="hljs-string">'1'</span></span><span> </span><span><span class="hljs-operator">=</span></span><span> </span><span><span class="hljs-string">'1'</span></span><span> </span><span><span class="hljs-keyword">AND</span></span><span> password </span><span><span class="hljs-operator">=</span></span><span> </span><span><span class="hljs-string">'$password'</span></span><span>;
</span></span>

Cela contourne l'authentification et renvoie toutes les données dans la base de données directement, ce qui entraîne de graves problèmes de sécurité.

3. Comment empêcher l'injection SQL par des déclarations de prétraitement

Les instructions de prétraitement évitent d'affecter directement l'exécution des requêtes SQL en traitant séparément la structure des requêtes SQL des données. Lorsque vous utilisez MySQLI_STMT :: __ Construct , la structure de l'instruction SQL est envoyée à la base de données, qui pré-pat et compile la requête, tandis que les paramètres réels sont liés à la requête à un stade ultérieur. Cette méthode a effectivement isolé la structure de la requête des données d'entrée dynamique, empêchant les attaques d'injection SQL.

3.1 Structure et séparation des données

En utilisant MySQLI_STMT :: __ Construct , toutes les variables de l'instruction de requête seront passées sous forme de paramètres au lieu d'être directement intégrées dans la chaîne SQL. Par exemple, créez une instruction de prétraitement en utilisant la méthode suivante:

 <span><span><span class="hljs-variable">$conn</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title function_ invoke__">mysqli</span></span><span>(</span><span><span class="hljs-variable">$host</span></span><span>, </span><span><span class="hljs-variable">$username</span></span><span>, </span><span><span class="hljs-variable">$password</span></span><span>, </span><span><span class="hljs-variable">$dbname</span></span><span>);
</span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$conn</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">prepare</span></span><span>(</span><span><span class="hljs-string">"SELECT * FROM users WHERE username = ? AND password = ?"</span></span><span>);
</span></span>

À ce stade, le point d'interrogation ( ? ) Dans l'instruction de requête représente l'espace réservé, et la valeur réelle sera liée plus tard en utilisant la méthode Bind_param :

 <span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">bind_param</span></span><span>(</span><span><span class="hljs-string">"ss"</span></span><span>, </span><span><span class="hljs-variable">$username</span></span><span>, </span><span><span class="hljs-variable">$password</span></span><span>);
</span></span>

Dans ce cas, le système de base de données ne traitera plus le nom d'utilisateur $ et le mot de passe $ dans le cadre de l'instruction SQL, mais seront traités sous forme de données. Cela signifie que même si l'utilisateur entre dans le code SQL malveillant, la base de données ne l'exécutera pas dans le cadre de la requête.

3.2 Contraintes strictes sur les types de données

Lors de l'appel Bind_param , le développeur doit également spécifier le type de données pour chaque paramètre. Par exemple, "SS" signifie que $ nom d'utilisateur et $ mot de passe sont deux types de chaînes. Cette contrainte de type de données garantit que les données d'entrée sont toujours transmises à la base de données dans le format correct, améliorant davantage l'effet anti-injection. Même si l'utilisateur entre dans des caractères spéciaux ou du code potentiellement malveillant, la base de données sera traitée en fonction du type de données spécifié et n'effectuera aucune opération dangereuse.

4. Autres avantages de sécurité des déclarations de prétraitement

En plus de prévenir l'injection SQL, les instructions MySQLI_STMT :: __ Construct and Pretroriement offrent également les avantages de sécurité suivants:

  • Empêcher la fuite de données : en utilisant des instructions de prétraitement, des données sensibles telles que les mots de passe ne seront pas directement intégrées dans le journal de requête, empêchant les risques de fuite potentiels.

  • Améliorer les performances : les déclarations de prétraitement peuvent être réutilisées. Dans les requêtes avec la même structure, seule une requête doit être compilée une fois, et seuls les différents paramètres doivent être liés lors de l'exécution ultérieure, ce qui peut améliorer l'efficacité de l'exécution, en particulier lorsque la même requête est exécutée plusieurs fois.

  • La gestion des erreurs est plus robuste : en utilisant des instructions de prétraitement, vous pouvez vous assurer que le format des instructions SQL est toujours correct, réduisant les risques potentiels dus aux erreurs de syntaxe.

5. Résumé

MySQLI_STMT :: __ Construct joue un rôle crucial dans la prévention de l'injection SQL. En traitant séparément la structure et les paramètres de la requête, il évite que la saisie de l'utilisateur de modifier directement l'instruction de requête. De plus, les déclarations de prétraitement améliorent encore la sécurité des applications Web grâce à des contraintes de type de données, à l'amélioration des performances et à l'amélioration de la sécurité. Dans le développement de PHP moderne, il est fortement recommandé que les développeurs utilisent des instructions de prétraitement pour créer des requêtes de base de données pour s'assurer que les applications sont protégées de l'injection SQL.