2011-08-26 52 views
2

我用一些SQL語句在視圖中在Web應用程序中使用playframework.I開發具有以下Java函數是我的SQL查詢容易受到SQL注入或其他攻擊

public static void search(String word){ 
    String trimword = word.trim(); 
    String pattern = "%"+trimword+"%"; 
    String query="select distinct item from Item item where item.name like :pattern"; 
    List<Item> items = Item.find(query).bind("pattern", pattern).fetch(); 
    ... 
} 

的「字」是一個字符串用戶通過網頁形式的文本輸入字段輸入......可以將上述情況誤用於惡意人員,以便對我的db做惡劣的事情嗎?我嘗試過各種用戶輸入組合,例如'SomeItem or '1'='1'等,但沒有任何意外發生..但是我的sql的知識是最小的。如果任何人都可以指出這個漏洞,並提出改進/保護措施,那將是有幫助的

回答

2

.bind("pattern", pattern)可防止SQL注入攻擊。因此,您的查詢不容易受到SQL注入攻擊。

另外,附加%值的代碼與輸入%的用戶類似。 bind()方法將以相同的方式處理。

2

您的查詢不傾向於sql注入。作爲一般規則,除了表名和列名之外的所有內容都使用綁定變量,您無法使用綁定變量。

所以,vunerable

select distinct item from item where name like '&pattern' 

不可能,

select distinct item from :item where name like = 'buggy' 

好嗎

select distinct item from item where name like :pattern 

編輯 @JNK,你必須假設我編寫了Oracle連接正確,因爲execute()會運行到大約80行。

>>> import oracle 
>>> db = oracle.OracleConnection('schema/[email protected]') 
>>> db.connect() 
>>> SQL = """ select 1 from feed_logs where file_id = :file_id""" 
>>> bind_vars = { 'file_id' : '1; delete from feed_logs'} 
>>> db.DBCursor.execute(SQL, bind_vars=bind_vars) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
cx_Oracle.NotSupportedError: Variable_TypeByValue(): unhandled data type dict 
>>> 
+0

如果用戶輸入'1;從用戶刪除 - 「? – JNK

+0

@JNK在第三個查詢中,需要調用「Item.find(query).bind(」pattern「,pattern).fetch();」。 bind()方法將處理轉義和防止SQL注入。 – Ryan