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

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

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

最佳答案

为了更好地了解likley在后台执行的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,但是您传递了一个非整数值,那么如果您指定了cfsqltype,则ColdFusion可能在连接到数据库并发送查询之前引发了异常,但是没有您浪费了数据库服务器上的数据库连接和执行时间。

关于sql - 仍不包括cfqueryparam的cfsqltype对于SQL注入(inject)保护仍然有用吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6913696/

10-10 17:59