为了防止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';
}
答案 0 :(得分:4)
这个问题间接地出现在另一个问题上。该线程与查询参数有关,但同样的问题适用于程序。总而言之,是的,您应该始终键入query和proc参数。解释另一个答案:
由于cfsqltype是可选的,因此它的重要性经常被低估:
<强>验证强> ColdFusion使用选定的cfsqltype(日期,数字等)来验证&#34;值&#34;。在任何sql发送之前发生 数据库。所以如果&#34;值&#34;是无效的,比如&#34; ABC&#34;对于类型 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 (通常不受欢迎)。用隐式转换,解释 字符串完全留给数据库 - 它可能 并不总是想出你期望的答案。将日期作为字符串而不是日期对象提交是一个 主要的例子。您的数据库将如何解释日期字符串 &#34; 05/04/2014&#34 ;? 4月5日还是5月4日?这得看情况。改变 数据库或数据库设置和结果可能是完全的 不同。
确保结果一致的唯一方法是指定 适当的
cfsqltype
。它应该与目标的数据类型匹配 列/函数(或至少是等效类型)。