3

为了防止 sql 注入,我在 ColdFusion 的介绍中读到我们将使用 cfqueryparam 标签。

但是在使用存储过程时,我将变量传递给 SQL Server 中相应的变量声明:

DROP PROC Usr.[Save] 
GO 
CREATE PROC Usr.[Save] 
(@UsrID Int 
,@UsrName varchar(max) 
) AS 
UPDATE Usr  
SET UsrName = @UsrName 
WHERE UsrID=@UsrID  
exec Usr.[get] @UsrID

问:调用存储过程时,包含 cfSqlType 有什么价值吗?以下是我目前在 Lucee 中的做法:

storedproc procedure='Usr.[Save]' {
    procparam value=Val(form.UsrID);
    procparam value=form.UsrName;
    procresult name='Usr';
}
4

1 回答 1

4

这个问题间接出现在另一个线程上。该线程是关于查询参数的,但同样的问题也适用于过程。总而言之,是的,您应该始终键入查询和过程参数。转述另一个答案:

由于 cfsqltype 是可选的,它的重要性常常被低估:

  • 验证: ColdFusion 使用选定的 cfsqltype(日期、数字等)来验证“值”。这发生任何 sql 被发送到数据库之前。因此,如果“值”无效,例如 cf_sql_integer 类型的“ABC”,您就不会在 sql 上浪费一个无论如何都不会工作的数据库调用。当您省略 时cfsqltype,所有内容都作为字符串提交,您将失去额外的验证。

  • 准确性: 使用不正确的类型可能会导致 CF 向数据库提交错误的值。选择正确的cfsqltype确保您发送正确的值 - 并且 - 以明确的格式发送它,数据库将解释您期望的方式。

    同样,从技术上讲,您可以省略cfsqltype. 但是,这意味着 CF 会将所有内容作为字符串发送到数据库。因此,数据库将执行隐式转换 (通常是不可取的)。使用隐式转换,字符串的解释完全由数据库决定——它可能并不总能得出您期望的答案。

    以字符串而不是日期对象的形式提交日期就是一个很好的例子。您的数据库将如何解释像“05/04/2014”这样的日期字符串?是 4 月 5 日还是 5 月 4 日?这要看情况。更改数据库或数据库设置,结果可能完全不同。

确保结果一致的唯一方法是指定适当的cfsqltype. 它应该匹配目标列/函数的数据类型(或至少是等效类型)。

于 2015-04-03T17:16:05.903 回答