2012-01-30 38 views
16

爲了得到一些數據,我創建一個SQL查詢:)
當然還有一些過濾和訂購零件。防止在Oracle SQL注入「排序依據」部分

爲了讓我用「是NamedParameterJdbcTemplate」,當我需要的東西添加到「哪裏」的一部分,我用的參數映射,以防止注射的結果。

但「按訂單」的部分是不同的,因爲沒有自動轉義(和它的SQL的一部分)。該訂單部分有時會填充來自用戶的數據(直接),有時會從內部代碼中添加一些額外的排序參數。有一個問題:有時這種排序字段不僅包含列名,而且還包含sql語句

現在對於排序每個參數被替換一些字符(如「),以空字符串手動逃過一劫,但我們對我們的代碼設置一些參數是有點複雜,通過這一規則。

當您使用jdbc模板時,在查詢的排序部分防止sql注入的最佳方法是什麼?

+9

+1關懷:) – RedFilter 2012-01-30 13:23:15

+1

可能使用'PreparedStatement'? – Romain 2012-01-30 13:25:30

+0

我不知道jdbc,但可以在Oracle中的'order by'中使用綁定變量。 – Ben 2012-01-30 13:33:11

回答

7

爲了幫助防止在數據庫端SQL注入後衛,看看內置的Oracle包DBMS_ASSERThttp://docs.oracle.com/cd/B28359_01/appdev.111/b28419/d_assert.htm

您可能會發現SIMPLE_SQL_NAME功能將有助於防止SQL注入你的ORDER BY條款。

希望它有幫助...

+0

這可能會更好,然後使用自定義轉義函數。如果沒有辦法做到這一點與一些庫(jdbctemplate或類似的東西),可能會做到這一點。 – Dainius 2012-01-30 17:10:36

1

一種方法我用了,雖然略有不同的原因是使用 順序按3,2(第三列,第二列)

所以,如果你可以計算出用戶位置的列中輸入列名輸出,間接應該殺死注入向量。

+0

問題有時這種排序字段不僅包含列名,而且還包含一條sql語句 – Dainius 2012-01-30 13:37:01

+0

用戶輸入了sql語句? – 2012-01-30 15:42:41

+0

不是直接的,一些鏈接有傳遞給「order by」部分的參數。首先要解決的問題是創建允許排序字段的映射,並通過url參數獲取該字段,作爲一個關鍵字,類似於(或相同的)文森特的建議。但也有一些舊代碼,我不想修改(誰知道它會生存多久),並且有一些sql。並且可能會有其他地方使用此訂單參數。 – Dainius 2012-01-31 07:50:28

2

您可以限制排序順序的選擇。大多數應用程序只允許用戶按顯示列進行排序,用戶可以選擇要在列位置排序的列。

在這種情況下,你將只接受來自用戶的整數(你能接受一個負數的降序排序)。您可以通過接受整數列表讓用戶按幾列排序。

整數很容易檢查,這不會將底層列名暴露給用戶。