为了防止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
。它应该匹配目标的数据类型列/函数(或至少一个等效类型)。