不包括cfqueryparam的cfsqltype对sql注入保护仍然有用吗?

时间:2011-08-02 14:28:47

标签: sql coldfusion sql-injection

有人解释一下,如果不包括cfqueryparam的cfsqltype仍然对SQL注入保护有用吗?以及cfqueryparam与cfsqltype和w / o cfsqltype实际发生的情况。

<!--- without cfsqltype--->
<cfqueryparam value="#someValue#"> 

<!--- with cfsqltype--->
<cfqueryparam value="#someValue#" cfsqltype="cf_sql_char">  

2 个答案:

答案 0 :(得分:11)

为了更好地了解cfsqltype在幕后的内容,请查看Java / JDBC PreparedStatement类:http://download.oracle.com/javase/6/docs/api/java/sql/PreparedStatement.html

您会注意到各种setInt,setDate等方法 - 我的理解是cfsqltype在创建预准备语句时与相应的方法匹配。

如果指定了一个类型,那么ColdFusion需要能够将变量转换为该类型,如果不能,它会在将查询发送到数据库之前抛出异常。

当省略cfsqltype时,它可能调用setObject或setString。接下来发生的事情的行为取决于您此时使用的JDBC驱动程序。我已经看到一些情况,即使你传入有效的变量,省略类型也会导致错误,我想到的是在MySQL上使用日期和日期时间。

另一件需要考虑的事情是,如果省略cfsqltype on let说一个整数字段,但是你传递一个非整数值,ColdFusion可能会在连接到数据库之前抛出异常并在你指定cfsqltype时发送查询,但如果没有它,你就会在数据库服务器上浪费数据库连接和执行时间。

答案 1 :(得分:2)

cfqueryparam的一个好处是在将值发送到数据库之前进行类型检查。例如,您指定cf_sql_integer,CF不仅验证值是数字,而且它是特定范围内的整数。省略cfsqltype时,CF将使用cf_sql_char。因此,您显然会丢失日期和数字等类型的类型检查。

就个人而言,我认为你应该提供一个cfsqltype。但是,即使你没有,使用cfqueryparam意味着CF使用绑定变量。绑定变量的一个附带好处是有助于保护您的查询免受SQL注入。所以从这个意义上说,它仍然是一件好事。

  

我认为这很有用但是“验证”不是“sql查询注入   保护”。

更新:不,它仍然适用。保护来自使用绑定变量。由于CF仍然会使用绑定变量,即使没有类型,我相信基本的sql注入保护仍然适用。

也就是说,在cf_sql_char列之外的其他内容上使用char可能会强制数据库执行到目标列的数据类型的隐式转换,有时会产生意外结果。所以一般我会说你应该指定一个cfsqltype。