2014-08-27 80 views
2

我已閱讀由Oracle here,它指出,提供的文檔:oci_bind_by_name是否安全地阻止SQL注入?

Binding is important for Oracle database performance and also as a way to avoid SQL Injection security issues.

如何安全是它使用oci_bind_by_name逃脫變量?是否有更好的做法來避免SQL注入,還是oci_bind_by_name就夠了?

TIA!

回答

3

在常見情況下使用綁定參數已足夠,並且是避免SQL注入的良好實踐。

但是,準備語句中的參數只能用於SQL表達式中的。換句話說,你通常會在哪裏寫出帶引號的字符串,帶引號的日期文字或數字文字。和一個參數==一個值(沒有列表)。

您應該爲這些情況使用綁定參數。如果你問這個問題是因爲你認爲如果有人回答他們不夠用,你可能想跳過使用綁定參數,那麼對不起,你不會免於安全編程實踐。

但是,還有其他(可能不太常見)綁定參數不起作用的情況。如果您需要使用動態表名,列名或其他標識符,或整個表達式或SQL關鍵字編寫查詢,則需要另一種方法。這些情況必須在SQL語法中修復,在準備時間,所以它們不能被參數化。

例如,這裏是由使用的變量來表示動態的部分,不能爲參數的查詢:

$sql = "SELECT * FROM mytable ORDER BY $column_of_users_choice $asc_or_desc"; 

您應該使用白名單下述情況:。換句話說,確保將一個插入到查詢中的字符串作爲動態表名稱實際上是數據庫中存在的表之一。確保SQL關鍵字是合法的關鍵字。

決不取用戶輸入逐字並將其插入SQL(或在運行時解析,想你喂eval()shellexec()參數的任何其他代碼)。這不僅僅是用戶輸入可能是不安全的內容。

另請參閱我的演示文稿SQL Injection Myths and Fallacies以獲取更多解釋。

+0

很好的回答和解釋!我現在試圖避免安全編程實踐,我只是確保我的當前方法對我的數據庫/服務器是安全的。我很欣賞時間@bill! – 2014-08-27 17:38:01