是我的SQL查询容易出现sql注入或其他攻击

时间:2011-08-26 14:11:47

标签: sql playframework sql-injection

我在使用playframework开发的web应用程序中的视图中使用了一些sql语句。我有以下java函数

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();
   ...
}

'word'是用户通过网页表单中的文本输入字段输入的字符串。上面被一个邪恶的人滥用来对我的数据库做了讨厌的事情吗?我尝试了各种用户输入组合'SomeItem or '1'='1'等但没有发生意外。但我对sql的了解很少..如果有人能指出这方面的任何漏洞并提出改进/保障措施,那将会很有帮助

2 个答案:

答案 0 :(得分: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/pw@server')
>>> 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
>>>

答案 1 :(得分:2)

.bind("pattern", pattern)可防止SQL注入攻击。因此,您的查询不容易发生SQL注入攻击。

此外,附加%值的代码与输入%的用户类似。 bind()方法将以相同的方式处理。