2

HTML メールを作成するアプリケーションがあります。コンテンツにはエンコードされた URL パラメーターが含まれており、プロモーション コードや製品リファレンスなどが含まれている可能性があります。電子メールは Windows サービス (基本的にはコンソール アプリケーション) によって生成され、クリックされたリンクは MVC Web サイトによって処理されます。メールリンクを作成するコードは次のとおりです。

string CreateLink(string domain, string code) {
    // code == "xyz123"
    string encrypted = DES3Crypto.Encrypt(code);  // H3uKbdyzrUo=
    string urlParam = encrypted.EncodeBase64();   // SDN1S2JkeXpyVW890
    return domain + "/" + urlParam;
}

MVC コントローラーのアクション メソッドは次のように構成されます。

public ActionResult Index(string id) {
    string decoded = id.DecodeBase64();
    string decrypted = DES3Crypto.Decrypt(decoded);
    ...
}

私たちのすべてのテストで、このメカニズムは期待どおりに機能しました。

入力は有効な Base-64 文字列ではありません。これは、base 64 以外の文字、3 つ以上の埋め込み文字、または埋め込み文字の間に空白以外の文字が含まれているためです。

URL の id パラメータは「見える」ようです。問題は、DecodeBase64 メソッドが失敗した "�nl����□��7y�b�8�sJ���=" などの「文字化けした」文字列を返すため、失敗している EncodeBase64/DecodeBase64 メソッドにあるようです。リンク。

さらに、ほとんどのエラーは IE6 ユーザー エージェントからのもので、これは文字エンコーディングの問題だと思いますが、その理由はわかりません。

参考までに、base-64 URL エンコーディングのコードを次に示します。

  public static string EncodeBase64(this string source)
  {
     byte[] bytes = Encoding.UTF8.GetBytes(source);
     string encodedString = HttpServerUtility.UrlTokenEncode(bytes);
     return encodedString;
  }

  public static string DecodeBase64(this string encodedString)
  {
     byte[] bytes = HttpServerUtility.UrlTokenDecode(encodedString);
     string decodedString = Encoding.UTF8.GetString(bytes);
     return decodedString;
  }

アドバイスをいただければ幸いです。

4

3 に答える 3

2

要約すると、トリプル DES で暗号化された文字列である base-64 でエンコードされたパラメーターを使用する URL を作成していました。そのため、URL は http://[Domain_Name]/SDN1S2JkeXpyVW890 のようになりました。リンクは、MVC Web サイトのコントローラー アクションを参照していました。

次に、URL が HTML 形式の電子メールに挿入されました。エラー ログを見ると、リンクに応答したパブリック ユーザーの約 5% が「無効な base-64 文字列エラー」をスローしていることがわかりました。これらのエラーのすべてではありませんが、ほとんどが IE6 ユーザー エージェントに関連していました。

文字と URL エンコーディングに基づいて多くの解決策を試した結果、クライアントのプロセスのどこかで URL が小文字に変換されていることがわかりました。小文字のエンコーディング文字)。

ケースの破損がクライアントのブラウザ、電子メール クライアント、またはおそらくローカルのウイルス対策ソフトウェアのいずれによって引き起こされたのか、私は判断できませんでした。

解決策 標準の base-64 エンコーディング メソッドを使用しないでください。代わりに、base-32 または zBase-32 エンコーディングを使用してください。どちらも大文字と小文字が区別されません。

詳細については、次のリンクを参照してください。

Base-32 - ウィキペディア

MyTenPennies Base-32 .NET 実装

この話の教訓は、Base-64 URL エンコーディングは一部の公開環境では信頼できない可能性があるということです。Base-32 は、やや冗長ですが、より適切な選択です。

お役に立てれば。

于 2012-08-08T08:05:48.383 に答える
0

これは興味深い問題です。私の推測では、IE6はいくつかのキャラクターを食べています。

たとえば、「ywhar0xznxpjdnfnddc0yxzbk2jnqt090」を含めた文字列の長さは、 4の倍数ではありません(これは、FromBase64がhttp://msdn.microsoft.com/en-us/library/system.convert.frombase64stringで機能するための要件です。 .aspx

しかし、その文字列の長さが4の倍数になるまで( "ywhar0xznxpjdnfnddc0yxzbk2jnqt090" + "a12")パディングすると、それは機能します。

MSDNのドキュメントには、Base64メソッドへの/からのパディングに1つ( "=")または2つ( "==")の等しい文字が使用されていると記載されており、IE6は送信した文字列からそれを切り捨てていると思われます。

これは完全な推測ですが、お役に立てば幸いです。

于 2012-08-07T14:25:06.033 に答える