2012-02-06 166 views
4

可否讓我很快就在這澄清,只是討論我有:PDO準備語句

使用這個作爲一個例子:

$conn->prepare ('SELECT * FROM table WHERE id = "' . $_POST['id'] . '"'); 

是否防止SQL注入,你必須綁定參數或在準備聲明之前對值進行消毒?或者我錯了,只使用準備就完全可以嗎?

+0

重複的:http://stackoverflow.com/questions/1996344/is-preventing-xss-and-sql-injection-as-easy-as-does-這個 – phpmeh 2012-02-06 15:21:29

+1

@AshleyBanks:我想最簡單的方法來解釋它給其他人的是,在你的例子中沒有查詢和參數的分離(這是什麼阻止注入),你只是將所有的東西都合併到查詢中(Hello注入!)。數據庫引擎對自己說,這個位是查詢,這個位是參數,它們不能改變角色,也不能合併在一起。如果他們仍然沒有得到它,真實的例子將會訣竅,畢竟看到的是相信。 – Leigh 2012-02-06 15:45:48

回答

5

準備好的語句使用佔位符來插入值。您問題中的代碼片段已將值插入查詢中,因此很容易發生SQL注入。

下面的僞代碼亮點預處理語句:

$stmt = $conn->prepare('SELECT * FROM `table` WHERE `id` = ?'); 
$stmt->execute($_POST['id']); 

在這個例子中,這背後的「代碼」的邏輯將照顧正確引用無論是在$_POST['id']而代問號?這一點。您還可能會遇到以下佔位符:但是

$stmt = $conn->prepare('SELECT * FROM `table` WHERE `id` = :id'); 
$stmt->execute(array(
    'id' => $_POST['id'] 
)); 

注意的是,預處理語句不免除您的責任將其傳遞到(我的)SQL語句之前驗證用戶提供的輸入:如果id是預期是一個整數,只接受整數作爲輸入。

2

是的,它不能防止SQL注入,你應該使用

$conn->prepare ('SELECT * FROM table WHERE id = ?');

0

右鍵,你必須綁定參數從PDO的SQL注入保護中受益。

並記住,PDO不添加htmlspecialchars,所以如果這對你很重要,你必須自己做。