如何保护自己免受动态查询中的 SQL 注入?

发布于 2024-11-14 18:22:42 字数 222 浏览 3 评论 0原文

我的应用程序获取对数据库的字符串对象查询。例如,字符串查询 = 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 技术交流群。

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

发布评论

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

评论(4

巡山小妖精 2024-11-21 18:22:42

即使您不知道其结构,也可以使用 PreparedStatement。让我用一个简单的例子来演示:

List<Object> arguments = new ArrayList<Object>();
String sql = "SELECT * FROM user WHERE someCondition = ?";
if (queryOnEmail) {
  sql = sql + " AND email LIKE ?";
  arguments.add(email);
}
if (queryOnUserName) {
  sql = sql + " AND user_name LIKE ?";
  arguments.add(userName);
}
PreparedStatement stmt = con.prepareStatement(sql);
int i = 1;
for(Object o : arguments) {
  stmt.setObject(i, o);
  i++;
}

当然,您可以将这个 SQL + 参数构造包装到它自己的类中以简化其使用。

Even if you do not know the structure, you can use a PreparedStatement. Let me demonstrate with a simple example:

List<Object> arguments = new ArrayList<Object>();
String sql = "SELECT * FROM user WHERE someCondition = ?";
if (queryOnEmail) {
  sql = sql + " AND email LIKE ?";
  arguments.add(email);
}
if (queryOnUserName) {
  sql = sql + " AND user_name LIKE ?";
  arguments.add(userName);
}
PreparedStatement stmt = con.prepareStatement(sql);
int i = 1;
for(Object o : arguments) {
  stmt.setObject(i, o);
  i++;
}

Of course you can wrap this SQL + arguments construct into its own class to simplify its usage.

ζ澈沫 2024-11-21 18:22:42

当您构建查询并使用PreparedStatement时,您可以动态构建语句的变量列表。

You can dynamically build list of variables for statement when you build query and use PreparedStatement.

笑梦风尘 2024-11-21 18:22:42

正如这篇文章中所解释的,与经典表DROP相比,您的应用程序可能发生更多糟糕的事情:

  • 调用睡眠函数,使您的所有数据库连接都将繁忙,从而使您的应用程序无法
  • 提取敏感数据数据来自DB
  • 绕过用户身份验证

最重要的是,在构建 SQL 语句时永远不应该使用字符串连接。为此目的使用专用 API:

As explained in this post, there are more bad things that can happen to your application than the classic table DROP:

  • call a sleep function so that all your database connections will be busy, therefore making your application unavailable
  • extracting sensitive data from the DB
  • bypassing the user authentication

Bottom line, you should never use string concatenation when building SQL statements. Use a dedicated API for that purpose:

情绪 2024-11-21 18:22:42

另外:永远不要相信用户的输入总是好的做法。在处理任何输入数据之前,首先删除所有转义字符和特殊字符:
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("\\" | "\"", "");

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