方法一:密碼比對
思路:首先通過用戶輸入的用戶名去查詢數據庫,得到該用戶名在數據庫中對應的密碼,再將從數據庫中查詢到的密碼和用戶提交過來的密碼進行比對.
php實例代碼如下:
- $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注入攻擊.
php實例代碼如下:
- $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(emptyempty($res)){
- //開源代碼Vevb.com
- echo "用戶名或密碼輸入有誤";
- }else{
- echo "登錄成功";
- }
新聞熱點
疑難解答