首先,我知道这是不好的做法,但无论我还在寻找答案。
在我们的Web应用程序中,我们有一个textarea,用户可以在其中编写SQL以引入自定义数据集并在图表中查看它们。这种方式的工作方式主要是将写入的字符串作为查询执行。我正在寻找的是我需要在应用服务器后端安全性中实现的所有内容,以禁止执行产生SELECT
类型查询以外的结果的查询。
用户无法执行他想要的任何类型的SELECT
查询,因为应用服务器后端会将返回的结果集消耗为2列X_FIELD
和{{1}因此,我们并不担心用户能够像执行会破坏数据库的SQL那样查看数据。
我们想要做的是解析Y_FIELD
,DROP
,ALTER
等关键字的字符串。我们需要注意哪些具体事项?是否有自动化的工具/库?我们正在使用java作为后端代码。
答案 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%的准确性。很少有人对任何数据库充满狂热来构建它。您无法为多个数据库执行此操作。