私たちのパートナーは、token というパラメーターを含む Web サービスを呼び出しています。トークンは 2 つの数値の MD5 ハッシュの結果であり、パートナー システムを使用してユーザーを認証するのに役立ちます。当社のパートナーは、ユーザーに 2 つの文字列を要求し、それらを連結して MD5 を介して実行し、Web サービスを呼び出します。MD5 の結果はトークンであり、文字列として送信されます。
有効なトークンを DB に格納します。SQL Server を使用してトークンを計算するため、SQL はトークンを varbinary として格納するのが最も適しているようです。これは、MD5 計算のネイティブな結果です。
同じことをしようとする 2 つのコードがあります。送信されたトークンに基づいて値を引き出す選択クエリを実行します。1つは動的クエリを使用しますが(これは問題です)、機能します。もう 1 つは、パラメーター化された (より安全な) 方法で同じことを実行しようとしますが、機能しません - トークンを見つけることができません。
これが2つの競合する試みです。まず、失敗するパラメータ化されたバージョン:
byteArrayToken = System.Text.UnicodeEncoding.Unicode.GetBytes(stringToken)
scSelectThing.CommandText = "select thing from tokenstable where token=@token"
Dim param As SqlParameter = scSelectThing.Parameters.Add("@token", SqlDbType.VarBinary)
param.Value = byteArrayToken
lbOutput2.Text = scSelectThing.ExecuteScalar()
次に、動作する動的クエリ文字列バージョン:
Dim scSelectThing As New SqlCommand
scSelectThing.CommandText = "select thing from tokenstable where token=convert(varbinary, " + stringToken + " )"
lbOutput2.Text = scSelectThing.ExecuteScalar()
SQL プロファイラーを実行すると、DB に対して実際に実行されるのは次のとおりです。
exec sp_executesql N'select thing from tokenstable where token=@token',N'@token varbinary(68)',@token=0x3000780046003800380034004100450036003400430038003300440033004100380034003800460046004300380038004200390034003400330043004200370042004600
これは私には正しく見えません。スタック内の何かがどこかで間違った変換を行うように導く何かをしているように見えます。
それが何であるかについてのアイデアはありますか?そこに動的クエリを使用して起動することは明らかに受け入れられません。
編集:
文字列は MD5 ハッシュ結果です。Query Analyzer で機能させるには、次のようにします。
select * from tokenstable where
token=convert(varbinary, 0xF664AE32C83D3A848FFC88B9443CB7BF )
引用符がないことに注意してください。引用すると、クエリは失敗します。比較対象のフィールドは varbinary で、SQL Server が MD5 計算の結果を格納しています。