本文章簡單的利用一個實例來介紹了關於php防止sql注入的簡單辦法,有需要學習的朋友可以參考一下本文章哦。
方法一:密碼比對
思路:首先通過用戶輸入的用戶名去查詢數據庫,得到該用戶名在數據庫中對應的密碼,再將從數據庫中查詢到的密碼和用戶提交過來的密碼進行比對。
代碼:
代碼如下 復制代碼$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 "登錄成功";
}