我有一個登錄驗證系統,數據庫中的密碼存儲爲SHA-384。當我包含哈希函數時,下面的登錄腳本什麼也不做。我哪裏錯了?Coldfusion:驗證散列密碼
我使用的是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>
返回錯誤
它什麼都不做?你看到了什麼?它是否加載?你可以提交嗎?您是否驗證了參數正在進入服務器頁面?當你說它的工作沒有哈希,這意味着你成功登錄?如果這是原因,那麼您的密碼可能不會在數據庫中散列。檢查你的客戶表:如果你能以純文本的方式讀取密碼,那麼密碼就不會被散列。在查找它們之前調用它們的散列函數將不起作用。如果你想讓它們被散列,你必須計算散列並將其存回表中。 –
您是否嘗試過從數據庫輸出userPass字段,並通過調用hash()密碼的結果進行比較?通常這些問題是由數據保存方式引起的。例如,如果可以使用base64或其他格式。嘗試保存「密碼」的密碼,然後用你在SQL中看到的內容更新你的問題,以及你從CF的散列函數中得到的內容。這可能會給我們一些工作 – barnyr
@Patrick M,如果我使用的形式工作:userPass = 。我可以用一個虛擬賬戶登錄,該賬戶存儲在數據庫中,不需要加密。 –