1, créez une nouvelle table utilisateur
créez un utilisateur de table (
id int(4) clé primaire non nulle auto_increment,
nom varchar(255) non nul,
pwd varchar(255) non null )
CHARSET=utf8;
2, insérer les données de test
INSERT INTO user(name,pwd) VALUES('bobo','bobo'); un nouveau Le fichier login.php est utilisé pour écrire la page html de connexion
Le code est le suivant :
<?php /** * Created by PhpStorm. * User: Administrator * Date: 2018/3/5 0005 * Time: 下午 1:12 */ ?> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="check.php" method="post"> 用户名:<input type="text" id="name" name="name"/><br> 密码:<input type="password" id="pwd" name="pwd" /><br> <input type="submit" id='login' name='login' value="登录"> </form> </body> </html>
4 Le nouveau fichier check.php est utilisé pour obtenir les données de soumission du formulaire pour. traitement de la connexion à la base de données
Le code est le suivant :
<?php /** * Created by PhpStorm. * User: Administrator * Date: 2018/3/5 0005 * Time: 下午 1:14 */ header('content-type:text/html;charset=utf-8'); $username=$_POST['name']; $pwd=$_POST['pwd']; try { $pdo=new PDO('mysql:host=localhost;dbname=php','root','root'); $sql="select * from user where name='{$username}' and pwd='{$pwd}'"; $stmt=$pdo->query($sql); //返回结果集中的行数 echo $stmt->rowCount(); } catch (Exception $e) { echo $e->getMessage(); }
Les résultats de l'exécution du navigateur sont les suivants :
Entrez le nom d'utilisateur bobo, le mot de passe bobo imprime 1
Saisissez le mauvais nom d'utilisateur et mot de passe et imprimez 0
Entrez l'instruction d'injection sql'ou 1 =1# L'impression est toujours 1, évidemment quelque chose ne va pas ici, il n'y a pas de traitement anti-injection pour sql
5, la première méthode est anti-injection (? méthode)
<?php
try {
$pdo=new PDO('mysql:host=localhost;dbname=php','root','root');
$sql="select * from user where name=? and pwd=?";
$stmt=$pdo->prepare($sql);
$stmt->execute(array($username,$pwd));
echo $stmt->rowCount();
} catch (Exception $e) {
echo $e->getMessage();
}
6, Non. Deux façons (mode espace réservé)
<?php
try {
$pdo=new PDO('mysql:host=localhost;dbname=php','root','root');
$sql="select * from user where name=:name and pwd=:pwd";
$stmt=$pdo->prepare($sql);
$stmt->execute(array(":name"=>$username,":pwd"=>$pwd));
echo $stmt->rowCount();
} catch (Exception $e) {
echo $e->getMessage();
}
Dans les deux sens, saisissez 'ou 1=1# et imprimez les deux 0, ce qui résout le problème d'injection SQL.