方法一:密碼比對
思路:首先通過使用者輸入的使用者名稱去查詢資料庫,得到該使用者名稱在資料庫中對應的密碼,再將從資料庫中查詢到的密碼和使用者提交過來的密碼進行比對。
代碼:
代碼如下 |
複製代碼 |
$sql="select password from users where username='$name'"; $res=mysql_query($sql,$conn); if ($arr=mysql_fetch_assoc($res)){//如果使用者名稱存在 if ($arr['password']==$pwd) {//密碼比對 echo "登入成功"; }else{ echo "密碼輸入有誤"; } }else { echo "該使用者名稱不存在"; } |
分析:該情況下,代碼健壯了不少,即使在magic_quote_gpc=Off的情況下,也能防止SQL注入攻擊。因為攻擊者想成功登入的話,得繞過兩道坎,第一是輸入的使用者名稱要存在,這一步可以構造一個SQL語句(‘ or 1=1%23)直接繞過,但是這樣子無法通過第二道坎。因為需要使用者輸入一個正確的密碼才能通過,顯然,這已經拒絕了SQL注入攻擊。
方法二:使用PDO的PDO::prepare()預先處理操作來防止SQL注入攻擊
思路:建立一個pdo對象,利用pdo的預先處理操作可以防止SQL注入攻擊
代碼:
代碼如下 |
複製代碼 |
$name=$_GET['username']; $pwd=$_GET['password']; $sql="select * from users where username=? and password=?"; //1.建立一個pdo對象 $pdo=new PDO("mysql:host=localhost;port=3306;dbname=injection","root",""); //2.設定編碼 $pdo->exec("set names 'utf8'"); //3.預先處理$sql語句 $pdoStatement=$pdo->prepare($sql); //4.把接收到的使用者名稱和密碼填入 $pdoStatement->execute(array($name,$pwd)); //5.取出結果 $res=$pdoStatement->fetch(); if(empty($res)){ echo "使用者名稱或密碼輸入有誤"; }else{ echo "登入成功"; } |