我的 sql 查询是否容易受到 sql 注入或其他攻击

发布于 2024-12-01 14:26:57 字数 565 浏览 0 评论 0原文

我在使用 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 或 '1'='1' 等,但没有发生任何意外的事情..但是我对 sql 的了解很少..如果有人能指出找出其中的任何漏洞并提出改进/保障措施,这会很有帮助

I was using some sql statements in views in a web app developed using playframework.I have the following java function

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

The 'word' is a string entered by user through a text input field in a web page form..Can the above be misused by an evil person to do nasty things to my db?I tried various combinations of user input like 'SomeItem or '1'='1' etc but nothing unexpected happened..But my knowledge of sql is minimal ..If anyone can point out any vulnerabilities in this and suggest improvements/safeguards ,it would be helpful

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

初相遇 2024-12-08 14:26:57

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

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

The .bind("pattern", pattern) prevents SQL Injection attacks. Thus your query is not prone to an SQL Injection attack.

Also, your code appending the % values is similar to a user entering the %. The bind() method will handle both the same way.

慈悲佛祖 2024-12-08 14:26:57

您的查询不容易出现 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
>>>

Your query is not prone to sql injection. As a general rule use bind variables on everything but table names and column names, which you can't use bind variables for.

So, vunerable

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

impossible,

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

okay

select distinct item from item where name like :pattern

EDIT @JNK, you'll have to assume that I've coded the oracle connections correctly as execute() runs to about 80 lines.

>>> 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
>>>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文