这是避免SQL注入的好方法吗?
在我工作的公司里,我们有一个支持工具,它提供了一个允许用户运行选择查询的页面。它应该防止用户运行UPDATE、INSERT、DELETE、DROP等。此外,每个select语句都被接受 它的工作方式是通过执行这是避免SQL注入的好方法吗?,sql,oracle,security,sql-injection,Sql,Oracle,Security,Sql Injection,在我工作的公司里,我们有一个支持工具,它提供了一个允许用户运行选择查询的页面。它应该防止用户运行UPDATE、INSERT、DELETE、DROP等。此外,每个select语句都被接受 它的工作方式是通过执行 SELECT * FROM (<query>) 但是它失败了,因为它的SQL连接器不接受的字符 那么,有没有办法在这样的查询中追加修改语句 顺便说一下,这是Oracle SQL 编辑: 更清楚地说:我知道这不是一个好办法。但我必须向我的同事证明这一点,以证明修改代码的合理性。
SELECT * FROM (<query>)
但是它失败了,因为它的SQL连接器不接受的字符
那么,有没有办法在这样的查询中追加修改语句
顺便说一下,这是Oracle SQL
编辑:
更清楚地说:我知道这不是一个好办法。但我必须向我的同事证明这一点,以证明修改代码的合理性。理论上的答案是好的,但我认为真正的注入会更有效。这种保护基于这样的想法/假设,即“更新查询”永远不会生成结果表(这就是使其成为SELECT FROM(…)的有效子表达式所需要的) 带有专有语言扩展的专有引擎可能会破坏这一假设。尽管不可否认,这似乎仍然不太可能,但在专有扩展的世界中,确实有一些疯狂的东西在四处传播,所以不要太轻率地假设 可能还需要注意将“不返回表”强制转换为“某种类型的空表”的表达式编译器。你知道的。因为任何系统都必须尽其所能让用户操作成功,而不是失败/崩溃/
并且也许还认为如果“查询任何你喜欢的”真的是需要的功能,那么你的DBMS很可能已经有一些工具或组件允许…(甚至是专门为此目的而设计的)。
我假设用户可以看到从该帐户访问的任何数据(这似乎就是设计的目的) 使用此选项执行拒绝服务也相当简单,无论是使用效率低下的查询,还是使用可用于锁定关键表的select for update Oracle是一个功能丰富的数据库,这意味着在查询中可能有多种方式运行DML。您需要找到一个内联PL/SQL函数,该函数允许您执行DML或具有其他副作用。它将取决于可用包的具体模式——XML DB包有一些运行任意SQL的机制,UTL_HTTP包通常可用于发起网络攻击,java功能非常强大防止这种情况发生的正确方法是使用DB安全机制——对只读模式(仅在表上具有查询权限的模式)运行这种机制 处理SQL注入的好方法包括参数。你的方法使用参数吗?如果你不信任这些用户,那么就不要让他们自己编写代码。只要你在执行他们写的任何代码,他们就有可能利用它。至少他们用来访问数据的帐户应该没有任何写权限。@GordonLinoff:我想不出使用参数的方法,因为用户应该能够运行完整的查询。据我所知,参数只能替换值。参数化查询将完成您的工作。同样,如果您想成为完全可靠的用户,请创建一个用户并分配一个仅具有读取权限的角色,然后使用该用户执行用户查询。如果用户应该能够运行完全查询,则可以绕过用户权限
SELECT * from dual); DROP table users --