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