Java 筛选应用服务器上执行的SQL查询

Java 筛选应用服务器上执行的SQL查询,java,sql,sql-server,oracle,sql-injection,Java,Sql,Sql Server,Oracle,Sql Injection,首先,我知道这是一个糟糕的做法,但不管怎样,我仍然在寻找答案 在我们的web应用程序中,我们有一个文本区域,用户可以在其中编写SQL以引入自定义数据集并在图表中查看它们。其工作方式本质上是将写入的字符串作为查询执行。我要寻找的是我需要在我们的应用服务器后端安全方面实现的一切,以禁止执行产生除选择类型查询以外的结果的查询 用户将无法执行他想要的任何类型的SELECT查询,因为app server后端将返回的结果集扩展为两列,分别命名为X_FIELD和Y_FIELD,因此我们不太担心用户能够查看数据

首先,我知道这是一个糟糕的做法,但不管怎样,我仍然在寻找答案

在我们的web应用程序中,我们有一个文本区域,用户可以在其中编写SQL以引入自定义数据集并在图表中查看它们。其工作方式本质上是将写入的字符串作为查询执行。我要寻找的是我需要在我们的应用服务器后端安全方面实现的一切,以禁止执行产生除选择类型查询以外的结果的查询

用户将无法执行他想要的任何类型的SELECT查询,因为app server后端将返回的结果集扩展为两列,分别命名为X_FIELD和Y_FIELD,因此我们不太担心用户能够查看数据,而担心用户执行SQL会破坏数据库


我们想做的是解析字符串中的关键字,如DROP、ALTER、CREATE等。我们需要注意哪些具体的事情?是否有一个工具/库可以自动执行此操作?我们使用java作为后端代码。

过滤查询可以在应用程序级别完成,但它需要更多特定于数据库的专业知识,而不是为每个数据库创建单独的安全系统

例如,我创建了一个可以为Oracle实现这一点的。它不会解决您的问题,但代码至少可以帮助解释为什么这是一个坏主意

首先,必须了解Oracle SQL语法比大多数编程语言(如Java)复杂得多。 Oracle有2175个关键字,几乎没有一个是保留的。忘记解析SQL吧——现有的第三方解析器都不够精确,无法安全地完成这项工作

幸运的是,此任务不需要完整的解析器。Oracle语法的结构使得任何语句都只能用8个标记进行分类,不包括 空白和注释

但是建立一个和一个 这仍然很困难。这个解决办法可以解决问题 不寻常的选择类型,如select*from dual或asdf为select 1 a from dual select a from asdf;。但即使是SELECT语句也可能导致 对数据库的更改;通过隐藏在函数或类型中的PL/SQL,或通过for update锁定行

别忘了删除有时是可选的。他们工作得很好 在大多数IDE中,但在动态SQL中不允许使用它们。不要只删除最后一个字符或最后一个标记,因为一些SELECT语句允许中间的分号。
仅仅一个数据库就需要做大量的工作!如果您想使用此方法实现安全策略,您需要几乎100%的准确性。很少有人对任何数据库都有足够的热情来建立这个数据库。您不可能对多个数据库执行此操作。

创建对数据库访问权限非常有限的用户如何?您知道它运行的是SQL Server还是Oracle吗?@jarlh正如标记中所述,应用程序可以在两台服务器上运行得更多,但标记不适合,因此必须同时覆盖这两台服务器。感谢您的澄清!很多时候,没有涉及的产品都会被贴标签……我们在一个现成的应用程序中也有类似的功能。一个用户从一个非常大的表中选择了一个*并冻结了其他人的数据库,而这需要几个小时才能完成。当我们终止会话时,它使应用程序服务器崩溃。我们再也不允许这样了……谢谢你。我要传达的是,正确的做法是不要实现这一点,没有办法使其安全。