在我们无法使用绑定变量的情况下,例如当我们的动态查询必须执行ddl语句时,下面的防御列表是否足够?
永远不要在动态查询中使用匿名块,以便execute immediate只能执行一个语句。这会阻止代码注入攻击。
使用替换功能撤消所有单引号。这会阻止声明修改攻击。
单引号以外的哪些字符可用于引用以及如何转义?
如何通过AND,UNION等攻击防止语句修改?
如何防止函数调用攻击,以便用户无法调用内置函数?每个用户都有权调用这些函数,并且调用这些函数可能导致拒绝服务和缓冲溢出攻击。如何从中拯救?
我更喜欢允许gui采用单引号字符意味着不检查Web应用程序中的客户端和服务器端验证。这是为了允许像奥布莱恩这样的名字。在数据库级别,就在execute immediate语句之前转义单引号。你知道更好的方法吗?
解决上面未列出的任何其他漏洞。
注意:我已经在这个网站上经历了十几个与SQL注入相关的问题。我仍然发布这个问题是因为:
这是oracle特有的。我在本网站上发现的关于该主题的大多数问题都与MySQL,SQL服务器等有关。
特定于无法使用绑定变量的情况。如果可以使用绑定变量,那就足够了,不需要其他防御。
最好在一个地方列出所有需要的方法。
没有详细讨论像函数调用这样的SQL注入的一些高级技术,我找不到任何解决方法。
编辑:
以下可能是一个可行的解决方案。
我想我有一个解决方案。它除了使用通常的防御措施,如静态语句,绑定变量等。它在通常的防御措施无法使用的情况下特别有用。请注意,不能使用绑定变量的唯一情况是ddl语句。对于这样的陈述:
使用静态sql验证数据库对象是否存在。这解决了问题的一半。
另一半与我们想要放入数据库对象的新值有关。例如,当更改用户的密码时:前半部分是用户名,后半部分是密码。应该在前端加密新值并将加密值保存在数据库中。加密为sql代码的加密值不会对数据库造成任何损害(例如,不能调用任何函数)。
永远不会因为各种原因(例如密码中的用户混淆)更改用户输入,该值可能在某些情况下有效,例如它可能是有效的html等。这意味着让['],[ \'],[#]不变地通过所有验证。它是静态SQL或应该处理它的加密。
是否有任何我们无法加密新值的情况?