2012-11-09 102 views
0

我正在使用PDO並提供用戶可以用其搜索結果選擇的選項。一些示例是排序,結果數量,頁碼等。我嘗試使用預準備語句來驗證此數據以防止SQL注入攻擊,但變量永遠不會傳遞到查詢中。爲PDO使用MySQL查詢選項準備好的語句

我在做什麼錯?結果的排序和數量是SELECT菜單,頁碼是文本輸入表單,可以輸入數字。

$query = "SELECT SQL_CALC_FOUND_ROWS * FROM people ORDER BY id :sortBy LIMIT $start, :total"; 
$result = $conn->prepare($query); 
$result->bindValue(":sortBy", $sortBy, PDO::PARAM_STR); 
$result->bindValue(":total", $total, PDO::PARAM_INT); 
+0

你如何確定「變量永遠不會傳遞到查詢中」? – deceze

+1

你爲什麼要綁定一些,而不是全部?即'$ start'。 –

+0

當我刪除bindValues並在查詢中輸入ASC和100代替:sortBy和:totalResults時,它可以工作。 – Zoolander

回答

2

綁定參數適用於要傳遞到查詢中的實際數據。你不能綁定實際的控制命令 - MySQL會將它們解釋爲數據,而不是命令。

你可以做什麼,而不是你的排序是檢查你發送,並通過'ASC'或'DESC'到查詢。您不會將用戶提供的信息傳遞給查詢,而是用於確定您要傳入的一組預定義命令中的哪一個。沒有注入風險。

+0

這不完全正確。你可以綁定任何你想要的。問題不在於你無法綁定某些東西,而是它綁定的方式。 –

+0

我的觀點是,如果你綁定類似於表標識符的東西,它將不會被MySQL識別,並且你的查詢將失敗。 – dersam