1

我有一个登录验证系统,数据库中的密码存储为 SHA-384。当我包含 Hash 函数时,以下登录脚本什么都不做。我哪里错了?

我正在使用 MSSQL Server 2008 R2,Coldfusion 10。

登录表单.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>

返回错误 在此处输入图像描述

4

4 回答 4

2

我会解决编码问题。我相信 CLOB/BLOB 通常是 Oracle 或 DB2 数据类型,而不是 MS SQL Server 的原生数据类型。我认为您不能将 CLOB/BLOB 指定为 SQL Server 中的数据类型。当您将 cf_sql_clob 传递到 cfqueryparam 时,它使用 JDBC 驱动程序在与 SQL Server 对话时尝试转换为文本或 varchar(max)。翻译中可能会丢失一些东西。由于您要连接到 SQL Server,请尝试将正确的数据类型传递给 cfqueryparam。查看 email 和 userPass 的数据库列的属性。您应该能够将 cfsqltype 设置为 cf_sql_char 或 cf_sql_varchar。我有点惊讶查询没有抛出错误,但是错误可能被数据类型转换掩盖了,而且它根本没有返回任何结果。

http://help.adobe.com/en_US/ColdFusion/10.0/CFMLRef/WSc3ff6d0ea77859461172e0811cbec22c24-7f6f.html

http://msdn.microsoft.com/en-us/library/ms378813(v=sql.105).aspx

编辑:尝试将您的查询更改为:

SELECT email,userPass FROM customers 
WHERE email = <cfqueryparam value="#FORM.email#" cfsqltype="cf_sql_varchar" maxlength="255"> 
AND userPass = <cfqueryparam value="#Hash(form.userPassword, "SHA-384")#" cfsqltype="cf_sql_varchar" maxlength="255">
于 2013-05-30T19:08:46.673 回答
2

我在专家交流论坛的( agx ) 的帮助下设法让它工作。事实证明这是我的人为错误。我在注册过程的插入查询中有一个额外的空间,并将编码设置为 UTF-8:

'(空格)#hash(form.password, "sha-384" ,'UTF-8')#'

我按照建议将密码类型更改为char(96),并修改了cfqueryparam。谢谢大家的帮助和指导。下面是故障排除代码,我曾经帮助我解决这个问题:

输入现有条目的电子邮件和密码,以从数据库中获取记录:

<cfset form.email = "some known email">
<cfset form.userPassword = "real password before hashing">

<!--- ONLY match on email ---->
<cfquery name="qGetData" ....>
     SELECT  * 
     FROM    yourTable
     WHERE   email =<cfqueryparam value='#FORM.email#' 
                            cfsqltype="cf_sql_varchar">
</cfquery>

<!--- Checking to see if the password is hashed or is in clear text --->
<cfdump var="#qGetData#">

散列明文密码并将其与 db 值进行比较。

<cfset newhash = hash(form.userPassword,'SHA-384')>
<cfif compare(newHash, qGetData.userPass) eq 0>
    SAME
<cfelse>
    DIFFERENT
</cfif>

乍一看,这些值看起来是一样的。为了确保 db 中存储的密码和登录表单中的密码相同,使用了以下代码:

<cfoutput>
   db |#qGetData.userPass#|<br>
   form |#hash(form.userPassword,'SHA-384')#|<br>
</cfoutput>

然后我使用了一个方便的网站来比较输出。结果又是一样的。经过这么多的努力,它的前面竟然多了一个空间#hash(...)#

于 2013-05-30T20:18:11.753 回答
1

使用双引号时,值被解析为对象(表、列等)。始终坚持使用安全且快速的 cfqueryparam。

尝试向 Hash 函数添加第三个参数,强制使用不同的编码;例如:

<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", "UTF-8")#" cfsqltype="cf_sql_clob" maxlength="255">
  </cfquery>

请注意 UTF-8 参数。常见的编码有:ISO-8859-1、ISO-8859-11(Latin9)。

格!

于 2013-05-30T19:33:39.093 回答
0

不确定这是 typeo 还是您的代码直接复制和粘贴:

您正在使用 value 属性的哈希函数内的双引号有效地轰炸您的 cfquery 标记。

  • 你有这个: value="#Hash(form.userPassword, "SHA-384")#"
  • 将其替换为: value="#Hash(form.userPassword, 'SHA-384')#"

请注意 SHA-384 值周围的单引号。这应该可以解决您的问题。

于 2013-05-29T18:31:38.370 回答