Ce wikiHow vous apprend comment empêcher l'injection SQL en utilisant les instructions préparées en PHP. L'injection SQL est l'une des vulnérabilités les plus courantes des applications Web actuelles. Les instructions préparées utilisent des paramètres liés et ne combinent pas de variables avec des chaînes SQL, ce qui empêche un attaquant de modifier l'instruction SQL.
Les instructions préparées combinent la variable avec l'instruction SQL compilée, de sorte que le SQL et les variables sont envoyés séparément. Les variables sont alors interprétées comme de simples chaînes et ne font pas partie de l'instruction SQL. En utilisant les méthodes dans les étapes ci-dessous, vous n'aurez pas besoin d'utiliser d'autres techniques de filtrage d'injection SQL telles que mysql_real_escape_string ().[1]
Première partie de deux:
Comprendre l'injection SQL
- 1 L'injection SQL est un type de vulnérabilité dans les applications qui utilisent une base de données SQL. La vulnérabilité survient lorsqu'une entrée utilisateur est utilisée dans une instruction SQL:
$ nom = $ _GET['Nom d'utilisateur']; $ query = "SELECT mot de passe FROM tbl_user WHERE name = '$ nom' ";
- 2 La valeur saisie par l'utilisateur dans la variable URL Nom d'utilisateur sera affecté à la variable $ nom. Il est ensuite placé directement dans l'instruction SQL, ce qui permet à l'utilisateur de modifier l'instruction SQL.
$ nom = "admin 'OU 1 = 1 -"; $ query = "SELECT mot de passe FROM tbl_user WHERE name = '$ nom' ";
- 3 La base de données SQL recevra alors l'instruction SQL comme suit:
SÉLECTIONNER mot de passe DE tbl_users OÙ prénom = 'admin' OU 1=1 -- '
- Ceci est un SQL valide, mais au lieu de retourner un mot de passe pour l'utilisateur, l'instruction retournera tous les mots de passe de la table tbl_user. Ce n'est pas quelque chose que vous voulez dans vos applications Web.
- Ceci est un SQL valide, mais au lieu de retourner un mot de passe pour l'utilisateur, l'instruction retournera tous les mots de passe de la table tbl_user. Ce n'est pas quelque chose que vous voulez dans vos applications Web.
Deuxième partie de deux:
Utiliser mySQLi pour créer des instructions préparées
-
1 Créez la requête mySQLi SELECT.
Utilisez le code ci-dessous pour CHOISIR les données d'une table à l'aide des instructions préparées mySQLi.
$ nom = $ _GET['Nom d'utilisateur']; si ($ stmt = $ mysqli->préparer("SELECT mot de passe FROM tbl_users WHERE name =?")) // Lier une variable au paramètre en tant que chaîne. $ stmt->bind_param("s", $ nom); // Exécute l'instruction. $ stmt->exécuter(); // Récupère les variables de la requête. $ stmt->bind_result($ pass); // Récupère les données. $ stmt->chercher(); // Affiche les données. printf("Mot de passe pour l'utilisateur % s est % s\ n", $ nom, $ pass); // Ferme l'instruction préparée. $ stmt->Fermer();
- Note: La variable $ mysqli est l'objet de connexion mySQLi.
-
2 Créez la requête INSERT mySQLi. Utilisez le code ci-dessous pour insérer des données dans une table à l'aide des instructions préparées mySQLi.
$ nom = $ _GET['Nom d'utilisateur']; $ mot de passe = $ _GET['mot de passe']; si ($ stmt = $ mysqli->préparer("INSERT INTO tbl_users (nom, mot de passe) VALUES (?,?)")) // Lier les variables au paramètre en tant que chaînes. $ stmt->bind_param("ss", $ nom, $ mot de passe); // Exécute l'instruction. $ stmt->exécuter(); // Ferme l'instruction préparée. $ stmt->Fermer();
- Note: La variable $ mysqli est l'objet de connexion mySQLi.
-
3 Créez la requête mySQLi UPDATE. Utilisez le code ci-dessous pour mettre à jour les données d'une table à l'aide des instructions préparées mySQLi.
$ nom = $ _GET['Nom d'utilisateur']; $ mot de passe = $ _GET['mot de passe']; si ($ stmt = $ mysqli->préparer("UPDATE tbl_users SET password =? WHERE nom =?")) // Lier les variables au paramètre en tant que chaînes. $ stmt->bind_param("ss", $ mot de passe, $ nom); // Exécute l'instruction. $ stmt->exécuter(); // Ferme l'instruction préparée. $ stmt->Fermer();
- Note: La variable $ mysqli est l'objet de connexion mySQLi.
-
4 Créez la requête mySQLi DELETE. Le script ci-dessous explique comment supprimer des données d'une table à l'aide des instructions préparées mySQLi.
$ nom = $ _GET['Nom d'utilisateur']; $ mot de passe = $ _GET['mot de passe']; si ($ stmt = $ mysqli->préparer("DELETE FROM tbl_users WHERE name =?")) // Lier la variable au paramètre en tant que chaîne. $ stmt->bind_param("s", $ nom); // Exécute l'instruction. $ stmt->exécuter(); // Ferme l'instruction préparée. $ stmt->Fermer();
- Note: La variable $ mysqli est l'objet de connexion mySQLi.