我有点毛骨悚然地问这个问题,因为我应该知道答案。有人可以友好地解释一下以下代码中是否以及如何发生注入(inject)?

<cfquery>
    select * from tableName
    where fieldName = '#value#'
</cfquery>

我特别好奇注入(inject)尝试和其他恶意输入,而不是最佳实践或用于处理“正常”用户输入的输入验证。我看到人们强烈提倡使用CFQueryParam,但我认为我没有意义。如果已验证用户输入与数据库架构的一致性(例如,对于数字数据库字段,输入必须为数字),那么使用CFQueryParam还能获得其他好处吗? <cfqueryparam CFSQLType = "CF_SQL_VARCHAR">不做什么,'#value#'不做什么?

最佳答案



是的,它将为您将'转换为''

现在猜想您将从此代码中获得什么SQL:

<cfset value = "\'; DROP TABLE tableName -- " />

<cfquery>
    select * from tableName
    where fieldName = '#value#'
</cfquery>

cfqueryparam标记有效;使用查询参数可解决SQL注入(inject)。

进行验证,清理或转义(所有单独的事情,顺便说一句)的任何自定义书面尝试充其量只能与开发人员对代码所针对的数据库系统的知识一样好。

如果开发人员不知道其他转义方法,或者在验证/转义之间修改了值并将其呈现为SQL,或者即使代码库已移植到另一个数据库系统并且看起来还不错,那么也有可能使用自定义代码崩溃。

当涉及到安全性时,您不希望有这样的机会。因此,请使用cfqueryparam。

10-04 23:13