为了防止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';
}

最佳答案

这个问题间接地出现在另一个线程上。该线程与查询参数有关,但是相同的问题也适用于过程。总而言之,是的,您应该始终键入query和proc参数。换个说法:

由于cfsqltype是可选的,因此其重要性经常被低估:


  • 验证:
    ColdFusion使用所选的cfsqltype(日期,数字等)来验证“值”。这在将任何sql发送到之前发生
    数据库。因此,如果“值”无效,则类型为“ABC”
    cf_sql_integer,您不会浪费对从未使用过的sql的数据库调用
    反正去上班。当您省略cfsqltype时,一切都是
    作为字符串提交,您将失去额外的验证。
  • 精度:
    Using an incorrect type may cause CF to submit the wrong value to the database。选择正确的cfsqltype可确保您
    发送正确的值-和-以无歧义的格式发送它
    数据库将解释您期望的方式。

    同样,从技术上讲,您可以省略cfsqltype。但是那个
    表示CF会将所有内容作为字符串发送到数据库。
    因此,数据库将执行implicit conversion
    (通常是不可取的)。通过隐式转换,解释
    的字符串完全由数据库决定-它可能
    并非总是能提供您期望的答案。

    以字符串而不是日期对象的形式提交日期是
    主要的例子。您的数据库将如何解释日期字符串,例如
    “2014年5月4日”?是4月5日还是5月4日?这要看情况。改变
    数据库或数据库设置,结果可能是完全
    不同。


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

    10-02 20:17