2015-04-03 18 views
3

为了防止sql注入,我在ColdFusion的介绍中读到了我们要使用cfqueryparam标签。使用存储过程,是否需要cfSqlType?

但在使用存储过程时,我通过我的变量在SQL Server中对应的变量声明:

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

问:是否有包括cfSqlType当我调用存储过程的任何值? 这里是如何我目前做它Lucee:

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

总是数据输入您的参数。 – 2015-04-03 15:30:57

+3

同意。 [总是输入参数有几个原因](http:// stackoverflow。COM /问题/ 27049918/ColdFusion的,参数化-A-querie/27066113#27066113)。虽然它涉及查询参数,但存储过程的相同问题也适用。 – Leigh 2015-04-03 15:51:42

+0

在将它们传递给查询之前验证参数也是一个非常好的主意。也许你正在这样做,但是一旦它们得到验证,我通常会将'form'(以及'url')参数放入'variables'范围。 – 2015-04-03 17:28:57

回答

4

这个问题上来间接地在另一个线程。该线程关于查询参数,但同样的问题适用于过程。总而言之,是的,你应该总是输入查询和proc参数。复述对方回答:

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

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

  • 准确性: Using an incorrect type may cause CF to submit the wrong value to the database。选择正确的cfsqltype可确保您发送正确的值 - - 并且 - 以非歧义格式发送它 数据库将解释您期望的方式。

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

    以字符串而不是日期对象的形式提交日期是 主要示例。数据库如何解释日期字符串,如 “05/04/2014”?作为4月5日还是5月4日?这得看情况。更改 数据库或数据库设置和结果可能完全不同 。

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

+1

在极少数情况下,隐式转换也会对查询性能产生负面影响。在某些情况下,优化器可能会决定将索引列的值转换为不同类型以执行比较。这可能会导致执行计划不佳。优化器通常足够聪明,可以避免这种情况,但是它可能偶尔发生。使用正确的类型完全避免了这个问题。 – Leigh 2015-04-03 17:24:56

+1

这是否意味着我们还应该键入不会像整数一样更改的查询参数?例如 2015-04-06 05:24:17

+2

@TusharBhaware - IMO,no。使用明确的'cast/convert'比使用cfqueryparam更适合静态值。查询参数的主要目的是帮助数据库引擎缓存其值可能更改的查询的执行计划。如果这些值是静态的,那么即使没有cfqueryparam,SQL Server等数据库也会缓存计划。所以IMo,你最好使用明确的'cast/convert'代替。老实说,我并不总是对简单的'bit'或'int'标记使用'cast',即1/0,但是我为模糊值如日期字符串,小数等等做了标记。 – Leigh 2015-04-06 14:07:33