2

全て、

前もって申し訳ありませんが、私は以下のトピック (SQL、ASP) のほとんどについて初心者です。ともかく...

ユーザーがユーザー名とパスワードを使用してログインする必要がある非常に単純な Web アプリがあります。

フロント エンドは、ソルト化されたパスワードの SHA1 ハッシュを作成し、それを (ユーザー名と共に) ASP ページに投稿します。

その ASP ページはデータを受け取り、SQL Server データベースのストアド プロシージャを呼び出し、ユーザー名とハッシュ化されたパスワードを渡します。ストアド プロシージャは、情報を「users」テーブルに書き込みます。

表のパスワード列のタイプは varbinary です。

私が知る限り、ASP がパスワード (password = Request.Form("password")) を取得すると、それは文字列になります。

この方法でクエリを作成すると、SQL Server を「だまして」varbinary として処理させることができます。

query = "EXEC sp_save_user @username='" & ユーザー名 & "', @password=0x" & パスワード

IOW - パスワード文字列の先頭に「0x」を追加しています。

ただし、パラメーター化されたクエリを使用することをお勧めします。

例: SET objParam = objCommand.CreateParameter("@password",204, 1, 40, password)

ただし、パラメーターはバイナリ (204) であるはずですが、パスワードは文字列であるため、これは失敗します。

では、「4a5e6a8d521ed487b81c91e131cf27e8dae9b783」のような文字列を ASP でバイナリに変換するにはどうすればよいでしょうか。

よろしくお願いします!

4

3 に答える 3

1

こんなことで頭をぶつけていた日々を思い出します。ASP.Net にアップグレードすることをお勧めしますが、それまでの間は、次のコード (VBScript) で目的の処理が実行されるはずです。

<%

Dim result

main()

function main()

    Dim userName : userName = "Martin"
    Dim data : data = "4a5e6a8d521ed487b81c91e131cf27e8dae9b783"

    Dim db: Set db = Server.CreateObject("ADODB.Connection")
    db.Open "Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Password=password1;Initial Catalog=Test;Data Source=(local)"

    Dim cmd : Set cmd = Server.CreateObject("ADODB.Command")
    cmd.ActiveConnection = db

    cmd.CommandText = "dbo.[sp_save_user]"
    cmd.CommandType = 4    
    cmd.Parameters.Append cmd.CreateParameter("@UserName", 200, 1, 50, userName)
    Dim bytes : bytes = stringToBinary(data)
    cmd.Parameters.Append cmd.CreateParameter("@Password", 204, 1, LenB(bytes), bytes)
    cmd.Execute()

    db.Close

    result = "done"

end function

function stringToBinary(str)
    dim ahex
    for i=0 to len(str) - 1 step 2
        Dim strDigit1 
        Dim strDigit2
        strDigit1 = Ucase(Mid(str, i+1, 1))
        strDigit2 = Ucase(Mid(str, i+2, 1))

        Dim byteDigit1
        Dim byteDigit2
        byteDigit1 = InStr("0123456789ABCDEF", strDigit1) - 1
        byteDigit2 = InStr("0123456789ABCDEF", strDigit2) - 1

        ahex = ahex & ChrB((byteDigit1 * 16) + byteDigit2)
    next   

    stringToBinary = ahex          
end function
%>
<html>
    <head>
        <title>Test</title>
    </head>
    <body>
        <h1><%= result %></h1>
    </body>
</html>
于 2009-04-22T11:29:01.527 に答える
0

DBを変更する範囲があると思います...より具体的にはストアドプロシージャですか?

ハッシュを文字列として受け入れて、それを SProc 内の varbinary にキャストしないのはなぜですか?

さらに読むと、SQL Server には組み込みの String -> Varbinary 関数はありませんが、この関数は簡単な解決策として提供されています。

于 2009-04-22T11:43:40.603 に答える