簡單登入的PDO預處理防SQL注入
1,新建一個user表
create table user(
id int(4) not null primary key auto_increment ,
name varchar(255) not null,
pwd varchar(255) not null)
#CHARSET=utf8;
#2,插入測試資料
INSERT INTO user(name,pwd) VALUES('bobo','bobo');
#3,新建一個login.php文件,用來寫登入html頁面
程式碼如下:
<?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,新check.php檔案用來取得表單提交資料進行資料庫連線處理
#程式碼如下:
<?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(); }
瀏覽器運作結果如下:
輸入使用者名稱bobo,密碼bobo列印出1
輸入錯誤的使用者名稱密碼列印0
輸入註入sql語句'or 1=1#列印還是1,很明顯這裡錯了,沒有對sql進行防注入處理
5,第一種方式防注入(?方式)
<?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,第二種方式(佔位符方式)
<?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(); }
#兩種方式輸入'or 1=1#列印都是0,解決了sql注入問題。
#