1

ログイン認証システムがあり、データベースのパスワードは SHA-384 として保存されます。ハッシュ関数を含めると、次のログイン スクリプトは何もしません。どこが間違っていますか?

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

Experts Exchange フォーラムの( 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>

一見、値は同じに見えました。データベースに保存されたパスワードとログインフォームからのパスワードの両方が同じであることを確認するために、次のコードが使用されました。

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

次に、便利な Web サイトを使用して出力を比較しました。結果はまた同じでした。この苦労の末、 の前に余分なスペースができました#hash(...)#

于 2013-05-30T20:18:11.753 に答える
2

私はエンコーディングの問題に行きます。CLOB/BLOB は通常、Oracle または DB2 のデータ型であり、MS SQL Server に固有のものではないと思います。SQL Server で CLOB/BLOB をデータ型として割り当てることはできないと思います。cf_sql_clob を cfqueryparam に渡すと、JDBC ドライバーを使用して、SQL Server とやり取りするときに text または 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 に答える
0

これが typeo なのか、直接コピーして貼り付けたコードなのかわからない:

value 属性のハッシュ関数内の二重引用符で cfquery タグを効果的に爆撃しています。

  • あなたはこれを持っています: value="#Hash(form.userPassword, "SHA-384")#"
  • これを次のように置き換えます: value="#Hash(form.userPassword, 'SHA-384')#"

SHA-384 値を一重引用符で囲んでいることに注意してください。これで問題が解決するはずです。

于 2013-05-29T18:31:38.370 に答える