在ColdFusion中防止SQL注入的方法

时间:2011-08-25 17:18:03

标签: coldfusion sql-injection

我想知道#符号是否足够。

这是我正在使用的sql命令的一部分

WHERE login='#FORM.login#' AND password COLLATE Latin1_General_CS_AS = '#FORM.password#'

我正在尝试使用' OR 1=1等用户名及其变体对其进行测试,但即使它不起作用,我也不希望产生错误的安全感。

我已经读过使用<cfqueryparam>可以防止这种形式的攻击,还有其他方法吗?

2 个答案:

答案 0 :(得分:11)

要走的路是<cfqueryparam>。它简单,直接,数据类型安全,可以处理列表(与IN (...)一起使用)并且可以处理条件NULL。另外,你可以在循环中获得一个好处 - 查询文本本身只发送到服务器一次,每次进一步的循环迭代只传输参数值。

您可以使用'#var#'并且相对安全。在<cfquery>标记的上下文中,ColdFusion将使用单引号转义扩展var的值,因此可以对SQL注入进行某种自动防御。 但要注意:这将 - 按设计 - 不会发生函数返回值:例如,在'#Trim(var)#'单引号中将不会转义。这很容易被忽视,因而很危险。

此外,它在循环中运行时有一个缺点:由于变量插值在之前发生将SQL发送到服务器,因此ColdFusion将在循环的每次迭代中生成新的查询文本。这意味着线路上的字节数更多,服务器上没有查询计划缓存,因为每个查询文本都不同。

简而言之:尽可能使用<cfqueryparam>

WHERE
  login        = <cfqueryparam value="#FORM.login#" cfsqltype="CF_SQL_VARCHAR">
  AND password = <cfqueryparam value='#Hash(FORM.password, "SHA-512")#' cfsqltype="CF_SQL_VARCHAR">

而不是简单的Hash(),你应该使用salted哈希,正如@SLaks在他的评论中指出的那样。

答案 1 :(得分:-1)

更好的方法是使用存储过程来处理所有事情。