簡體   English   中英

如何在Java中構建查詢以防止使用預准備語句進行SQL注入

[英]How to build query in Java to prevent SQL injection using prepared statement

我需要以防止SQL注入攻擊的可能性的方式構建查詢。

我知道構建查詢的兩種方法。

String query = new StringBuilder("select * from tbl_names where name = '").append(name).append(';).toString();

String query = "select * from tbl_names where name = ? ";

在第一種情況下,我所做的只是一個connection.preparestatement(查詢)

在第二種情況下,我做了類似的事情:

PreparedStatement ps = connection.prepareStatement(query)
ps.setString(1,name);

我想知道什么是行業標准? 您是否使用字符串追加方式來構建查詢,然后准備語句或准備語句並稍后傳遞參數?

您的第一個代碼片段不安全,容易受到SQL注入攻擊。 你不應該使用那個表格。

要使第一個片段安全,您需要手動轉義該值以防止SQL注入。 這很難正確執行,並且選擇錯誤的處理值的方式可能會降低性能,具體取決於底層數據庫(例如,如果為整數列提供字符串文字,某些數據庫系統將不會使用索引)。

第二個片段是標准方式。 它可以保護您免受SQL注入。 使用此表單。

使用帶參數占位符的預准備語句要簡單得多,它還允許您使用不同的值集重用已編譯的語句。 此外,根據數據庫的不同,這可以為跨連接重用查詢計划提供額外的性能優勢。

您也可以使用[OWASP ESAPI library][1] 它包括驗證器,編碼器和許多其他有用的東西。 例如,你可以做到

ESAPI.encoder().encodeForSQL(Codec,input);

正在開發更多編解碼器。 目前,支持MySQL和Oracle。 其中一個可能對您的情況有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM