【发布时间】:2013-05-28 15:40:44
【问题描述】:
我有一个登录验证系统,数据库中的密码存储为 SHA-384。当我包含 Hash 函数时,以下登录脚本什么都不做。我哪里错了?
我正在使用 MSSQL Server 2008 R2,Coldfusion 10。
loginform.cfm
<cfif IsDefined("FORM.email")>
<cfset redirectLoginSuccess="admin.cfm">
<cfset redirectLoginFailed="login.cfm">
<cfquery name="UserAuth" datasource="sql1007539">
SELECT email,userPass FROM customers WHERE email=<cfqueryparam value="#FORM.email#" cfsqltype="cf_sql_clob" maxlength="255">
AND userPass=<cfqueryparam value="#Hash(form.userPassword, "SHA-384")#" cfsqltype="cf_sql_clob" maxlength="255">
</cfquery>
<cfif UserAuth.RecordCount NEQ 0>
<cftry>
<cflock scope="Session" timeout="30" type="Exclusive">
<cfset Session.Username=FORM.email>
<cfset Session.UserAuth="">
</cflock>
<cfif IsDefined("URL.accessdenied") AND true>
<cfset redirectLoginSuccess=URL.accessdenied>
</cfif>
<cflocation url="#redirectLoginSuccess#" addtoken="no">
<cfcatch type="Lock">
</cfcatch>
</cftry>
</cfif>
<cflocation url="#redirectLoginFailed#" addtoken="no">
<cfelse>
<cfset LoginAction=CGI.SCRIPT_NAME>
<cfif CGI.QUERY_STRING NEQ "">
<cfset LoginAction=LoginAction & "?" & XMLFormat(CGI.QUERY_STRING)>
</cfif>
</cfif>
编辑:如果不使用 HASH 函数,该脚本可以工作。 编辑:我还可以确认密码存储在 SHA-384 中。我使用以下 HASH 标识符进行了检查:duncanwinfrey.com/tools/hashid/hash.php
29/05/13 编辑
**代码返回错误,当我删除 cfparam 标记 **
<cfquery name="UserAuth" datasource="sql1007539">
SELECT email,userPass FROM customers WHERE email="#FORM.email#"
AND userPass="#hash(form.userPassword, "sha-384")#"
</cfquery>
返回错误
【问题讨论】:
-
它什么都不做?你看到了什么?它加载吗?可以提交吗?您是否已验证参数正在进入服务器页面?当你说它在没有哈希的情况下工作时,这意味着你成功登录了吗?如果是这个原因,很可能您的密码没有在数据库中散列。检查您的
customers表:如果您可以以纯文本形式读取密码,那么密码永远不会被散列。在查找它们之前调用它们的哈希函数是行不通的。如果您希望它们被散列,则必须计算散列并将其存储回表中。 -
您是否比较了 DB 执行 SHA-384 哈希和 CF 执行相同操作的结果? IE:使用已知密码,并将其添加到系统中。从数据库表中提取其哈希。使用 CF 同样散列相同的纯文本密码。比较两者的结果。事物的编码/存储方式可能会有所不同,您需要在两个系统之间进行结合。
-
您的 SQL customers.userPass 的数据类型是什么?它也是一个CLOB吗?它需要是CLOB吗?尝试不使用 cfqueryparam 进行测试,看看是否是您的 cfsqltype 的问题。将您的查询更改为 ...AND userPass= '#Hash(form.userPassword, "SHA-384")#'。看看你是否可以让它以这种方式识别你的散列密码。在将其投入生产之前不要忘记将其改回。
-
是的,它们存储正确您需要更具体地说明您尝试了哪些故障排除步骤;-) Adam 就如何解决问题提供了一些非常好的建议。您应该能够使用它们来组合一个可靠的repro case,您可以将其包含在您的问题中。在此过程中,您可能会自己找出问题所在。但即使你不这样做,发布一个其他人可以独立测试的示例也会导致更快的答案,因为它消除了猜测。
-
该错误是由双引号引起的。 sql 值需要单引号。 userPass='#Hash(form.userPassword, "SHA-384")#' 同样,确保在投入生产之前将 cfqueryparam 放回原处。这只会帮助您排除故障。我仍然不确定为什么密码字段需要是 CLOB。如果可以的话,Peter 有一个很好的建议,可以切换到 char()。数据库中密码字段的实际数据类型是什么?
标签: hash coldfusion