2014-03-19 95 views
0

假設,使用PHP和MySQL,我準備下面的SQL語句:SQL注入和預處理語句

$statement = $connection->prepare("SELECT departmentName FROM departments WHERE department_type='academic' AND buildingName=?") 

- 在buildingName是通過URL的查詢字符串傳遞的(這是驗證一個參數,成爲綁定)並且department_type是已知參數。

這種風格的準備語句仍然容易受到SQL注入或任何其他SQL攻擊?具體來說,是否放置了一個權威參數,在這種情況下department_type,直接放入準備好的語句的命令字符串中一個可能的漏洞?

回答

3

不,它不會受到攻擊。使用預準備語句是防範SQLi的建議方法。

如果您確定department_type參數不受任何用戶輸入的影響,那麼將其直接放入查詢中是安全的。

雖然受到用戶輸入影響的變量有點複雜。這種效果也可以是間接的。例如,如果從數據庫中檢索到department_type,該數據庫保存在受用戶影響的另一個頁面上,則它受到用戶輸入的間接影響,應被視爲「不可信」。

1

消除輸入(有時甚至輸出)是一種很好的做法,因爲它可能會破壞應用程序的其他部分。如果您使用準備好的語句,則您的數據庫不會受到影響,但如果您正在提供網頁,則可能會受到攻擊的影響。

以可能的攻擊類型爲例,您可以檢查XSS attacks。它目前被列爲owasp網站中使用次數最多的第三種攻擊類型。