过滤应用程序服务器

时间:2015-09-15 14:09:33

标签: java sql sql-server oracle sql-injection

首先,我知道这是不好的做法,但无论我还在寻找答案。

在我们的Web应用程序中,我们有一个textarea,用户可以在其中编写SQL以引入自定义数据集并在图表中查看它们。这种方式的工作方式主要是将写入的字符串作为查询执行。我正在寻找的是我需要在应用服务器后端安全性中实现的所有内容,以禁止执行产生SELECT类型查询以外的结果的查询。

用户无法执行他想要的任何类型的SELECT查询,因为应用服务器后端会将返回的结果集消耗为2列X_FIELD和{{1}因此,我们并不担心用户能够像执行会破坏数据库的SQL那样查看数据。

我们想要做的是解析Y_FIELDDROPALTER等关键字的字符串。我们需要注意哪些具体事项?是否有自动化的工具/库?我们正在使用java作为后端代码。

1 个答案:

答案 0 :(得分:2)

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

例如,我创建了一个可以为Oracle执行此操作的open source program。它不会解决您的问题,但代码至少可以帮助解释为什么这是一个坏主意。

首先,了解Oracle SQL语法 比大多数编程语言(如Java)更复杂,这一点很重要。   Oracle有2175个关键字,几乎没有一个被保留。忘记解析SQL - 现有的第三方解析器都不够准确,无法安全地执行此操作。

幸运的是,此任务不需要完整的解析器。 Oracle语法的结构使得任何语句只能被分类为8个令牌,不包括在内  空白和评论。

但建立一个tokenizer和一个  statement classifier仍然很难。该解决方案将处理  不寻常的选择,例如(select * from dual)with asdf as (select 1 a from dual) select a from asdf;。但即使是SELECT语句也可能导致  更改数据库;通过隐藏在函数或类型中的PL / SQL,或通过for update锁定行。

不要忘记删除(有时是可选的)terminator。他们工作正常  在大多数IDE中,但在动态SQL中不允许使用它们。不要只删除最后一个字符或最后一个标记,因为一些SELECT语句允许在中间使用分号。

这只是一个数据库的大量工作!如果要使用此方法实施安全策略,则需要几乎100%的准确性。很少有人对任何数据库充满狂热来构建它。您无法为多个数据库执行此操作。