防止ColdFusion中SQL注入的方法

防止ColdFusion中SQL注入的方法,coldfusion,sql-injection,Coldfusion,Sql Injection,我想知道#符号是否足够 这是我正在使用的sql命令的一部分 其中login='#FORM.login#和密码对照拉丁语1_General_CS_AS='#FORM.password# 我试图用用户名(如”或1=1及其变体)来测试它,但即使它不起作用,我也不想有一种错误的安全感 我已经读到使用可以防止这种形式的攻击,还有其他方法吗?方法是。它简单、直接、数据类型安全,可以处理列表(用于(…)中的),并且可以处理条件空值。此外,在循环中您还可以从中获得好处—查询文本本身只发送到服务器一次,每次循环迭

我想知道
#
符号是否足够

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

其中login='#FORM.login#和密码对照拉丁语1_General_CS_AS='#FORM.password#

我试图用用户名(如
”或1=1
及其变体)来测试它,但即使它不起作用,我也不想有一种错误的安全感

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

方法是
。它简单、直接、数据类型安全,可以处理列表(用于(…)中的
),并且可以处理条件空值。此外,在循环中您还可以从中获得好处—查询文本本身只发送到服务器一次,每次循环迭代只传输参数值

您可以使用
“#var”
,并且相对安全。在
标记的上下文中,ColdFusion将扩展
var
的值,并使用单引号进行转义,因此存在某种针对SQL注入的自动防御但要小心:根据设计,函数返回值不会出现这种情况:例如,在
中,“#Trim(var)#”
单引号不会被转义。这很容易被忽视,因此很危险

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

简而言之:尽可能使用

WHERE
  login        = <cfqueryparam value="#FORM.login#" cfsqltype="CF_SQL_VARCHAR">
  AND password = <cfqueryparam value='#Hash(FORM.password, "SHA-512")#' cfsqltype="CF_SQL_VARCHAR">
在哪里
登录=
密码=

正如@SLaks在他的评论中指出的那样,您确实应该使用盐渍散列,而不是简单的散列。

更好的方法是对所有内容使用存储过程

不要以纯文本形式存储密码。你应该用一个安全的salted hash(不是MD5)散列你的密码。我同意,但这不是我的数据库…@Daniel:没人说数据库结构必须改变,你可以在VARCHAR中存储一个散列或明文密码,到DB中,这都是一样的。但存储散列更智能、更安全(或者,换言之:存储明文密码是难以置信的愚蠢和危险)。密码字段有多长?。。这听起来并不缺乏同情心,但开发人员仍然对他们处理的信息的安全性负有责任,无论这些信息是否是他们的数据库。我只是在写一份重写此应用程序的建议,而我可能不得不重写它,“存储明文密码是难以置信的愚蠢和危险”是一个很好的素材:)+1是关于函数的提示。每天学习新的东西。存储过程有其用途,但不是万能的。在构建coldfusion应用程序时,原始SQL实际上是没有位置的。它的执行速度比存储的进程慢,如果您在没有保护的情况下使用params,它会被注入。