gpt4 book ai didi

sql - ColdFusion 查询 - 注入(inject)保护

转载 作者:行者123 更新时间:2023-12-02 05:50:26 29 4
gpt4 key购买 nike

我有点不好意思地问这个问题,因为我应该知道答案。有人可以解释一下在下面的代码中是否以及如何发生注入(inject)吗?

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

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

最佳答案

更新:

虽然这回答了您的部分问题,Peter's response更好,因为它直接解决了您的问题“为什么使用 cfqueryparam,当 CF 通过转义单引号自动添加保护时?”。答:简而言之,因为后者并不总是有效。绑定(bind)变量。


It says in the docs "escapes string variables in single-quotation marks" but doesn't CF already "magically" do this in CF query tag when you wrap evaluated variables in single quotes?

是的,大多数版本自动转义单引号作为对那些不使用 cfqueryparam 的人的保护措施。然而,正如 Scott 上面指出的,最好使用 cfqueryparam(即绑定(bind)变量),因为它们 ensure parameters are not executed as sql commands .绑定(bind)变量有效,即使在自动转义不起作用的情况下也是如此,as Peter's answer demonstrates .

也就是说,sql 注入(inject)保护实际上只是使用绑定(bind)变量的副作用。使用绑定(bind)变量的主要原因是性能。 Bind variables encourage databases to re-use query plans ,而不是每次您的#parameters# 更改时都创建一个新计划。这减少了编译时间,提高了性能。

Cfqueryparam 还有很多其他的好处:

  • 提供数据类型检查(长度、值、类型……)
  • 提供简化“列表”和null 值处理的属性
  • 将任何 sql 发送到数据库之前执行数据类型检查,防止浪费数据库调用

虽然它并不真正适用于字符串列,但 IMO 使用它的另一个重要原因是准确性。当您将带引号的字符串传递给数据库时,您依赖于 implicit conversion .本质上,您是将其留给数据库来确定如何最好地执行比较,而结果并不总是您所期望的。 (日期字符串是一个典型的例子)。您可能会以不准确的结果结束,或者有时查询速度变慢,具体取决于数据库决定执行 sql 的方式。使用 cfqueryparam 通过消除歧义避免了这些问题。

关于sql - ColdFusion 查询 - 注入(inject)保护,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18792320/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com