Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
这是避免SQL注入的好方法吗?_Sql_Oracle_Security_Sql Injection - Fatal编程技术网

这是避免SQL注入的好方法吗?

这是避免SQL注入的好方法吗?,sql,oracle,security,sql-injection,Sql,Oracle,Security,Sql Injection,在我工作的公司里,我们有一个支持工具,它提供了一个允许用户运行选择查询的页面。它应该防止用户运行UPDATE、INSERT、DELETE、DROP等。此外,每个select语句都被接受 它的工作方式是通过执行 SELECT * FROM (<query>) 但是它失败了,因为它的SQL连接器不接受的字符 那么,有没有办法在这样的查询中追加修改语句 顺便说一下,这是Oracle SQL 编辑: 更清楚地说:我知道这不是一个好办法。但我必须向我的同事证明这一点,以证明修改代码的合理性。

在我工作的公司里,我们有一个支持工具,它提供了一个允许用户运行选择查询的页面。它应该防止用户运行UPDATE、INSERT、DELETE、DROP等。此外,每个select语句都被接受

它的工作方式是通过执行

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 --