Einfache Login-PDO-Vorverarbeitung, um SQL-Injection zu verhindern
1, eine neue Benutzertabelle erstellen
Tabellenbenutzer erstellen(
id int(4) not null Primary Key auto_increment ,
name varchar(255) nicht null,
pwd varchar(255) nicht null)
CHARSET=utf8;
2, Testdaten einfügen
INSERT INTO user(name,pwd) VALUES('bobo','bobo');
3. Erstellen Sie eine neue login.php-Datei, um die Login-HTML-Seite zu schreiben
Der Code lautet wie folgt:
<?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, erstellen Sie eine neue check.php-Datei, um sie abzurufen Holen Sie sich die Formularübermittlungsdaten für die Datenbankverbindungsverarbeitung
Der Code lautet wie folgt:
<?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(); }
Das Ergebnis der Ausführung des Browsers ist wie folgt:
Geben Sie den Benutzernamen bobo ein und das Passwort bobo wird ausgedruckt 1
Geben Sie den falschen Benutzernamen und das falsche Passwort ein und drucken Sie 0
Geben Sie die Injektions-SQL-Anweisung „oder“ ein 1=1# Der Ausdruck ist immer noch 1. Es ist hier offensichtlich falsch. Es gibt keine Anti-Injection-Behandlung für SQL
5 , die erste Art Methode Anti-Injektion (? Methode)
<?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, der zweite Weg (Platzhaltermodus)
<?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(); }
Zwei Möglichkeiten dazu Geben Sie „oder“ ein 1=1# Drucke sind alle 0, was das SQL-Injection-Problem löst.