Java:用户提供where子句:如何防止SQL注入(inject)?

标签 java dynamic where-clause sql-injection clause

我们目前正在开发一项功能,其中一部分是允许用户为简单的 select 语句定义一个 where 子句,这样他就可以通过 GUI 限制他想要获得的结果。

表名可能不同,但它只是一个“select * from TABLE_NAME”(我知道,这是一个糟糕的主意,但客户就是国王)。 由于这为 SQL 注入(inject)提供了无限的可能性,我一直在寻找可行的方法,至少防止最广泛使用的 SQL 注入(inject)技术,但在过去的几天里我找不到很多信息。大多数提示都是基于这样的假设,即用户只提供查询的参数,这可以通过PreparedStatements 来解决。但就我而言,它们几乎毫无用处。

我目前正在考虑两种方法,我可能会将它们结合起来以获得最佳效果,但我不知道是否有更好的方法来防止注入(inject)以及如何准确地实现它(也许存在开源工具或框架)。 我想分析一下文本

  1. 根据广泛使用的 SQL 注入(inject)技术,定义用户输入不得包含的内容。
  2. 定义用户输入的内容。

对于1.我想创建一个实用程序类,其中包含检查不同SQL注入(inject)情况的方法。我可以使用正则表达式来识别模式。

对于2.我认为使用正则表达式或XText框架来定义DSL,因此只有当用户输入与定义的规则匹配时才接受用户输入。我还可以提取列名来检查它们是否确实存在于当前的 TABLE_NAME 中。但在这种情况下,它将迫使我们只允许对查询进行某种限制(即 rownum<=100 不起作用,或者需要特殊处理)。

如果您能为我推荐任何更好的技术、工具或方法,我将非常感激,因为正如我所提到的,关于此主题的信息并不多。

提前谢谢您!

最佳答案

您正在构建一个 SQL 注入(inject)应用程序

您可以做两件事:

  1. 限制数据库用户可以执行的查询类型。例如,不要授予更新权限。

  2. 将 where 子句限制为仅匹配一些简单的条件,例如a 子句必须匹配 t.col=value。然后使用简单的解析器将所有输入与您的规则进行比较

注入(inject)技术有多种,可能很难全部掌握。

关于Java:用户提供where子句:如何防止SQL注入(inject)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40812591/

相关文章:

java - EclipseLink 动态 MOXy 访问枚举值

mysql - 如何更新以特定文本结尾的列?

c# - 如何在 Where 子句中使用组合条件 AND/OR 编写查询?

MySQL 查询匹配别名 WHERE 不起作用

Android ContentProvider 初始化不在应用程序启动时

java - Marklogic 路径范围查询中不区分大小写的搜索

java - 如何禁用 JXTable 默认搜索操作?

java - 如果线程不更改映射结构,我应该使用 ConcurrentHashMap 还是 HashMap?

javascript - 使用 javascript 和表排序器动态获取时无法对日期列进行排序

Java 为 Android 解析 JSON