pdo通过预处理语句防止sql注入

本文会通过一个简单的登录验证来演示通过预处理语句防注入。


数据库:test;

创建表:

 

  1. CREATE TABLE USER(  
  2. id INT UNSIGNED AUTO_INCREMENT KEY,  
  3. username VARCHAR(20) NOT NULL,  
  4. password CHAR(32) NOT NULL,  
  5. email CHAR(32) NOT NULL  
  6. );  


向表中插入一条数据:

 

  1. INSERT INTO user(username,password,email) VALUES('baby','baby','444@qq.com');  



登入界面:

  1. <!DOCTYPE html>  
  2. <html lang="en">  
  3. <head>  
  4.     <meta charset="UTF-8">  
  5.     <title>login</title>  
  6. </head>  
  7. <body>  
  8.     <form action="check.php" method="post" accept-charset="utf-8">  
  9.         用户名 <input type="text" name="username"><br>  
  10.         密 码 <input type="password" name="psw"><br>  
  11.         <input type="submit"value="提交">  
  12.     </form>  
  13. </body>  
  14. </html>  



1.首先先正常编写check.PHP页面,不做任何处理。

  1. <?php  
  2. header('content-type:text/html;charset=utf-8');  
  3. $username=$_POST['username'];  
  4. $psw=$_POST['psw'];  
  5. try {  
  6. $pdo=new PDO('mysql:host=localhost;dbname=test','root','root');  
  7. $sql="select * from user where username='{$username}' and password='{$psw}'";  
  8. $stmt=$pdo->query($sql);  
  9. //返回结果集中的行数  
  10. echo $stmt->rowCount();  
  11. } catch (Exception $e) {  
  12. echo $e->getMessage();  
  13. }  
  14. ?>  

输入正确的用户名:baby  密码:baby      结果:1   (因为查询到一条记录  通过echo  rowCount()输出)

输入错误的用户名或密码               结果:0

输入注入语句 用户名:'or 1=1 #  密码:随便写  结果:1

 

 

2.更换为预处理语句(占位符)

  1. <?php  
  2. header('content-type:text/html;charset=utf-8');  
  3. $username=$_POST['username'];  
  4. $psw=$_POST['psw'];  
  5.     try {  
  6.         $pdo=new PDO('mysql:host=localhost;dbname=test','root','root');  
  7.         $sql="select * from user where username=:username and password=:psw";  
  8.         $stmt=$pdo->prepare($sql);  
  9.         $stmt->execute(array(":username"=>$username,":psw"=>$psw));  
  10.         echo $stmt->rowCount();  
  11.     } catch (Exception $e) {  
  12.         echo $e->getMessage();  
  13.     }  
  14. ?>  


  1. <?php  
  2. header('content-type:text/html;charset=utf-8');  
  3. $username=$_POST['username'];  
  4. $psw=$_POST['psw'];  
  5.     try {  
  6.         $pdo=new PDO('mysql:host=localhost;dbname=test','root','root');  
  7.         $sql="select * from user where username=? and password=?";  
  8.         $stmt=$pdo->prepare($sql);  
  9.         $stmt->execute(array($username,$psw));  
  10.         echo $stmt->rowCount();  
  11.     } catch (Exception $e) {  
  12.         echo $e->getMessage();  
  13.     }  
  14. ?>  


输入注入语句 用户名:'or 1=1 #  密码:随便写      结果:0   说明已经无法注入。

posted @ 2017-06-23 20:30  鹏哥哥blog  阅读(496)  评论(0)    收藏  举报