我正在使用 ESRI 的 arcpy 模块,我需要指定一个WHERE
子句作为此函数的参数。由于结果最终将用于从数据库中检索数据,WHERE
子句的文本有时会直接传递到数据库,但遗憾的是,ESRI 没有给我任何参数化查询的选项。由于我想防止潜在的 SQL 注入,我需要找到一些替代方法来保护我的数据库。
想到的一个选项是限制输入,如果不符合,则在此函数调用之前抛出错误。在我的例子中,呼叫者只需要 ASCII 字母数字字符。列中不允许使用其他类型的字符进行过滤。将用户限制为仅字母数字字符是否足以防止 SQL 注入,特别是因为文本必须作为字符串引用?
如果您真的可以限制为字母数字字符,那么可以,如果您限制为 ANSI 字母数字字符,那很好。在 Unicode 中,因为每个字符都超过一个字节,所以许多字母数字字符的表示实际上是不安全的并且可能导致注入。
您需要清理数据服务器端并确保编码是安全的。我建议您查看 OWASP 的 ESAPI 库,了解它们是如何做到的(参见本页第三部分)。
正常的方法是确保用户输入的字符串中不允许来自 SQL 的各种关键字。但是,有很多情况需要检查。
可以通过这样的方式避免引用:
返回admin并且可以在 WHERE 中使用以这种方式将字符添加在一起的技术,而无需使用引号。
所以基本上 - 你必须构建你的查询,并且在将它发送到数据库之前,通过将它与 SQL 关键字匹配来验证它没有做你不希望它做的任何事情,但是有很多事情去检查。因此,请确保诸如 select、exec(所有变体)、convert、union、drop、truncate 以及几乎任何大写/小写组合中的任何危险关键字等内容不在用户字符串中。此外,不应该允许任何可以转换的字节流(0x 数字)以避免许多字典检查,特别是如果从字典中忘记了 exec 命令。
如果它是 Web 应用程序,请确保检查此服务器端而不是客户端。
如果您不能使用参数,这几乎是我能提供的最佳建议。
如果使用 Oracle——并且如果您能够针对它运行任意语句——那么您可以首先使用
dbms_assert.enquote_literal
(至少,我的理解是这确保文字被正确引用——甚至允许引用)来清理输入嵌入字符串中)。有关详细信息,请参阅http://docs.oracle.com/cd/E11882_01/appdev.112/e40758/d_assert.htm 。