2017-06-20 47 views
0

我想保護SQL注入的參數化SQL查詢。我已經閱讀了一篇關於使用PreparedStatement避免SQL注入的文章。 link如何防止特殊字符的SQL注入

根據這篇文章,它描述了準備工作有助於從緩存中選擇預編譯查詢,並且在最後一步用用戶數據替換了laceholder,並且不會再次編譯查詢。因此,如果有人提供sql查詢作爲用戶輸入,它將有助於避免SQL注入,因爲查詢將僅被編譯一次。

但是如果有人給字符串提供特殊字符如'x'='x'會發生什麼。例如,在最終查詢中,如「SELECT * FROM users WHERE username ='blah'AND password ='foo'或'x'='x'」,用戶數據替換爲'x'='x'。 PreparedStatement如何處理這些類型的特殊字符?

任何人可以幫我瞭解這個

+2

準備好的語句不需要處理這個問題,因爲查詢和數據被分別發送到服務器。 – CBroe

+0

OR應該如何添加?如果不是由你來添加? – baao

+0

閱讀此https://stackoverflow.com/questions/1582161/how-does-a-preparedstatement-avoid-or-prevent-sql-injection –

回答

1

基本上,數據庫引擎解析佔位符的SQL字符串並記住只有這部分將被執行。

完成此操作後,它將接受數據並用實際數據替換佔位符。

這意味着如果某人以某種方式設法將一個SQL字符串變爲一個變量來破壞SQL並使其執行其他操作,那麼數據庫引擎將視爲不會執行的文本。因此,您可能會將完整的SQL語句輸入到文本字段中,並且它只會作爲文本插入,而不是被數據庫引擎解析和執行,因此,您的代碼是「安全的」(總是有的你錯過了一些可能成爲潛在漏洞的地方)

這也不是JAVA專有的,它也適用於PHP等,它只是告訴數據庫以不同於通常情況的方式處理查詢。