3

トークンとパスワードのリセットに関するいくつかの質問を投稿しましたが、最終的にこれをすべて理解することができました. みんな、ありがとう!

したがって、特定の文字がクエリ文字列で機能しないことを読む前に、クエリ文字列をハッシュすることにしましたが、ご想像のとおり、プラス記号は取り除かれています。

クエリ文字列をどのように保護またはハッシュしますか?

これは私が受け取った会社の電子メールのサンプルで、文字列は次のようになります。

AweVZe-LujiIAuh8i9HiXMCNDIRXfSZYv14o4KX0KywJAGlLklGC1hSw-bJWCYfia-pkBbessPNKtQ&t=pr&ifl

私のセットアップでは、単純に GUID を使用しています。しかし、それは問題ですか?

私のシナリオでは、ユーザーは GIUD がなくてもパスワード ページにアクセスできません。これは、クエリ文字列がセッション変数と一致しない場合、ページがオンロードをリダイレクトするように設定されているためですか?

上記のような結果を得るためにクエリ文字列を処理する方法はありますか?

この質問は、知識の習得に関するものです。

アップデート:

ハッシュコードは次のとおりです。

    public static string QueryStringHash(string input)
    {
        byte[] inputBytes = Encoding.UTF8.GetBytes();
        SHA512Managed sha512 = new SHA512Managed();

        byte[] outputBytes = sha512.ComputeHash(inputBytes);
        return Convert.ToBase64String(outputBytes);
    }

次に、HASH (UserID) を SESSION に渡してからクエリ文字列として送信します。次のページでは、セッション HASH はクエリと同じではないため、値が一致せず、クエリ文字列が無効になります。

注:すべてのハッシュと暗号化を処理する Encryption というクラスを作成しました。

Session["QueryString"] = Encryption.QueryStringHash(UserID);

Response.Redirect("~/public/reset-password.aspx?uprl=" +
  HttpUtility.UrlEncode(Session["QueryString"].ToString())); 

また、このページに記載されているすべてを試しましたが、うまくいきませんでした:

C# ですべてのスペースを %20 に置き換えるにはどうすればよいですか?

読んでくれてありがとう。

4

2 に答える 2

10

問題は、base64 エンコーディングが URL で特別な意味を持つ「+」および「/」文字を使用することです。クエリ パラメータを base64 でエンコードする場合は、それらの文字を変更する必要があります。通常、これはRFC 4648で指定されているように、「+」と「/」をそれぞれ「-」と「_」(ダッシュとアンダースコア) に置き換えることによって行われます。

コードでは、次のようにします。

public static string QueryStringHash(string input)
{
    byte[] inputBytes = Encoding.UTF8.GetBytes();
    SHA512Managed sha512 = new SHA512Managed();

    byte[] outputBytes = sha512.ComputeHash(inputBytes);
    string b64 = Convert.ToBase64String(outputBytes);
    b64 = b64.Replace('+', '-');
    return b64.Replace('/', '_');
}

もちろん、受信側では、ベース 64 から変換するメソッドを呼び出す前に、'-' と '_' を対応する '+' と '/' に置き換える必要があります。

埋め込み文字 (「=」) を使用しないことをお勧めしますが、使用する場合は URL エンコードする必要があります。エンコードされた文字列の長さが常にわかっている場合は、埋め込み文字を伝える必要はありません。受信側で必要なパッド文字を追加できます。ただし、可変長の文字列を使用できる場合は、埋め込み文字が必要になります。

クエリ パラメーターで base 64 エンコーディングが使用されている場合は、常に次のように処理されます。いたるところにあり、おそらく最も一般的なのは YouTube の動画 ID です。

于 2013-06-10T20:51:40.277 に答える