如果我有一个有效的SQL字符串,我是否可以在我的PL/SQL中执行它,但要保证它是一个SELECT语句,only...without执行复杂的解析,以确保它没有任何转义字符/嵌套命令或任何jazz?
编辑:
我真正想要实现的是一个通用的、内置到我的应用程序中的查询工具。它有一个友好的、特定于领域的GUI,可以让非技术用户创建相当复杂的查询。该工具处理搜索的版本控制,在需要的地方添加innerjoin,以及一些典型的SQL DEV类型工具找不到的其他特定于应用程序的东西。
应用程序成功创建了一个SQL查询。问题是我还允许用户直接输入他们自己的SQL。我担心潜在的SQL注入类型问题。
我不确定这是不是合适的地方;但是,除了这个问题-如果有人可以推荐一本好的Oracle书籍让我快速了解这类事情-我将非常感激。
发布于 2009-12-12 07:14:09
一种解决方案是,如果这是用户唯一有权执行的操作,则只允许用户使用GRANT SELECT权限。
参见"Oracle Database Security Guide: Introduction to Privileges“
然而,我不认为仅仅因为您将查询限制为SELECT,您的应用程序就一定是安全的。当您允许不安全地使用SELECT查询时,可能会发生一些恶作剧的例子。
重新回答你澄清的问题:我已经研究过SQL注入,并写了很多关于它的文章。我可以建议的一般规则是:永远不会将用户输入作为代码执行。注入就是这样发生的。
您可以设计一种特定于域的语言并将用户输入映射到SQL操作,但要确保有一个将用户选择转换为数据库模式的层。如果通过引入映射层将用户输入从SQL代码中分离出来,那么就应该没问题了。
另请参阅我对“How do I protect this function from sql injection”的回答。
发布于 2009-12-12 17:58:36
Oracle附带了许多授予public的execute权限。因此,即使用户没有明确的insert/update/delete/execute权限,也可以进行恶意操作。
说到恶作剧,即使选择了一个用户也可能会带来麻烦。"SELECT * FROM table FOR UPDATE of column“将锁定整个表。SELECT...FOR更新只需要SELECT权限。
哑巴查询(例如笛卡尔连接)可以使数据库满足其需求(尽管资源管理器应该能够阻止大多数查询,只允许执行少于指定数量的IO或CPU的查询)。
给他们一个允许执行的SQL列表和一个让他们提名要包含的SQL的流程,怎么样?
发布于 2009-12-12 07:10:49
在oracle中,您只需检查第一个单词是否为"select“或"with”。这是由于PL/ SQL的Ada传统,它要求复合语句位于begin/end块中,因此通常的SQL注入技术只会导致语法错误。
当然,最好的答案是授予权限,如果可能的话,避免直接计算未知输入。但有趣的是,begin/end语法消除了许多SQL注入攻击向量。
https://stackoverflow.com/questions/1891326
复制相似问题