簡體   English   中英

SQL 注入帶有准備好的語句?

[英]SQL injections with prepared statements?

如果我沒記錯的話,我認為 Jeff 在 Stack Overflow 播客中提到了 SQL 准備好的語句中可能存在的弱點。 我想知道他指的是哪種弱點? 可能只是使用不當,還是更險惡?

據我所知,播客並沒有深入探討這個主題,只是順便說一句。

我認為他說的是,當您使用 Prepared Statements 時,SQL 服務器可以緩存您的查詢執行計划,因此,即使您修改執行查詢的某些參數,服務器也可能選擇錯誤的(可能是緩存的)執行計划那會表現得很糟糕。

他還提到了 SQL Server 2008 的一個新功能,可以強制引擎重新評估他用來克服這種情況的執行計划。

使用Prepared Statements,我唯一的問題就是這個。 考慮以下 Java 代碼:

String sql = "select * from table where name like ?";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, "PATTERN%");
ResultSet rs = pstmt.executeQuery();

在這里,您會期望,如果您在 table(name) 上有一個索引,它將被查詢計划使用。 好吧,它不會。 因為 PraparedStatement 必須預編譯並預期最壞的情況:例如,'%PATTERN%'。 所以,它不會優化。 我花了一段時間才弄清楚這一點。 它導致我的數據庫受到影響。 :(

希望能幫助到你。

除了正常的 sql 注入(我們可以稱之為一階)攻擊之外,還有二級攻擊。 例如,存儲過程使用字符串連接來構建查詢然后執行的情況並不少見。 如果檢索到的字段值的結果包含在這樣的連接中,則存在注入的危險。

如果准備好的語句具有以任何方式動態構造的參數,那么這很可能是弱點的根源。

如果您使用帶有經過測試的類的適當數據庫庫來設置參數,那么您在任何時候都不會打開自己的 SQL 注入,無論是否准備好語句。

請記住,僅僅因為准備了一條語句,或者因為您正在使用存儲過程,這並不意味着您可以免受注入攻擊。 只有當您使用數據庫提供程序代碼來清理參數的輸入(以及將其應用於所有可以使用的參數)時,您才能獲得 SQL 注入的保護。

我沒有聽過播客,但根據我的經驗,只有准備好的陳述才是好的。 它通常會提高應用程序的性能並防止 SQL 注入(如果使用正確,而不是鏈接中的第二個示例)。

暫無
暫無

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

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