我想知道#
符号是否足够。
这是我正在使用的sql命令的一部分
WHERE login='#FORM.login#' AND password COLLATE Latin1_General_CS_AS = '#FORM.password#'
我正在尝试使用' OR 1=1
等用户名及其变体对其进行测试,但即使它不起作用,我也不希望产生错误的安全感。
我已经读过使用<cfqueryparam>
可以防止这种形式的攻击,还有其他方法吗?
答案 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)
更好的方法是使用存储过程来处理所有事情。