有了存储过程,cfSqlType是必要的吗?

时间:2015-04-03 14:32:56

标签: coldfusion sql-injection lucee

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

1 个答案:

答案 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。它应该与目标的数据类型匹配   列/函数(或至少是等效类型)。