如何保护自己免受动态查询中的 SQL 注入?
我的应用程序获取对数据库的字符串对象查询。例如,字符串查询 = EMAIL(如“% test%”)和 USER_NAME(如“% user%”)
。该查询是动态构建的,我不知道它的结构,因此我无法利用 PrepareStatement
。有谁知道在这种情况下防止 SQL 注入的方法吗?
数据库:Oracle
语言:Java 1.6
请帮忙。
My application gets in a String object query to the database. E.g. String query = EMAIL like '% test%' and USER_NAME like '% user%'
. The query is built dynamically and I do not know its structure, so I can not take advantage of PrepareStatement
. Does anyone know of a way that in this case to guard against SQL injection?
Database: Oracle
Language: Java 1.6
Please help.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
即使您不知道其结构,也可以使用
PreparedStatement
。让我用一个简单的例子来演示:当然,您可以将这个 SQL + 参数构造包装到它自己的类中以简化其使用。
Even if you do not know the structure, you can use a
PreparedStatement
. Let me demonstrate with a simple example:Of course you can wrap this SQL + arguments construct into its own class to simplify its usage.
当您构建查询并使用PreparedStatement时,您可以动态构建语句的变量列表。
You can dynamically build list of variables for statement when you build query and use PreparedStatement.
正如这篇文章中所解释的,与经典表
DROP
相比,您的应用程序可能发生更多糟糕的事情:最重要的是,在构建 SQL 语句时永远不应该使用字符串连接。为此目的使用专用 API:
As explained in this post, there are more bad things that can happen to your application than the classic table
DROP
:Bottom line, you should never use string concatenation when building SQL statements. Use a dedicated API for that purpose:
另外:永远不要相信用户的输入总是好的做法。在处理任何输入数据之前,首先删除所有转义字符和特殊字符:
String.replace("\\" | "\"", "");
In addition: it is ALWAYS good practice to NEVER trust a users input. Before you process any input data first remove all escape and special characters:
String.replace("\\" | "\"", "");