2012-11-25 79 views
2

PHP PDO語句是自動轉義還是隻準備語句?PDO語句是否自動轉義?

例如,假設$username$password是用戶輸入。下面的代碼是否安全,還是易受注入?

$dbh = new PDO("mysql:host=localhost;dbname=mydb", $my_mysql_username, $my_mysql_password); 
$sth = $dbh->query("SELECT * FROM users WHERE username='$username' AND password='$password'"); 
$result = $sth->fetch(); 
if(!$result){ 
    $dbh->exec("INSERT INTO users (username, password) VALUES ('$username', '$password')"); 
} 

(上面的代碼純屬假設,例如僅供參考。)

如果它們不會自動逃脫,並提供PDO在這種情況下在mysql_功能的任何額外的保護?

+1

AFAIK他們不是,因爲怎麼會它知道查詢字符串的哪部分要逃脫?否則它會意外地逃避預期的報價。 –

回答

5

只准備語句提供AUTOMAGIC逃逸,假設你沒有一些醜陋喜歡啓用魔術引號。並且只有參數中的數據纔會被轉義,而不是在準備語句時已經存在於SQL字符串中的任何數據。

如果你想要自動轉義的好處,你必須準備一個聲明,並分別給它的數據。

$sth = $dbh->prepare("SELECT * FROM users WHERE username=? AND password=?"); 
$sth->execute(array($username, $password)); 

否則,你得到很少的保護,以及mysqli_query和朋友。 (我拒絕甚至提到mysql_query,因爲沒有自尊心的PHP程序員再次使用它哦,等等..當然,這是唯一的提到它在這裏。)

+0

查看我更新的問題,獲得一個小的增加 –

+0

@DC_:查看我的更新回答,以獲得對您的增加的回覆。 :) – cHao

+0

謝謝,有用的答案。 –