我有一个构建 HTML 电子邮件的应用程序。内容中包含编码的 URL 参数,例如,该参数可能包含促销代码或产品引用。电子邮件由 Windows 服务(本质上是控制台应用程序)生成,单击链接后由 MVC 网站处理。以下是创建电子邮件链接的代码:
string CreateLink(string domain, string code) {
// code == "xyz123"
string encrypted = DES3Crypto.Encrypt(code); // H3uKbdyzrUo=
string urlParam = encrypted.EncodeBase64(); // SDN1S2JkeXpyVW890
return domain + "/" + urlParam;
}
MVC Controller 上的action方法构造如下:
public ActionResult Index(string id) {
string decoded = id.DecodeBase64();
string decrypted = DES3Crypto.Decrypt(decoded);
...
}
在我们所有的测试中,该机制都按预期工作,但是,现在我们已经上线,我们看到大约 4% 的错误率,其中从 Base-64 的转换失败,并出现以下异常:
输入不是有效的 Base-64 字符串,因为它包含非 Base-64 字符、两个以上的填充字符或填充字符中包含非空格字符。 p>
url 中的 id 参数“看起来”没问题。问题似乎在于 EncodeBase64/DecodeBase64 方法失败,因为 DecodeBase64 方法在失败时返回“乱码”字符串,例如“�nl����□��7y�b�8�sJ���=”链接。
此外,大多数错误都来自 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;
}
如有任何建议,我们将不胜感激。
最佳答案
回顾一下,我正在创建一个使用 Base-64 编码参数的 URL,该参数本身就是一个 Triple DES 加密字符串。因此,URL 看起来像 http://[Domain_Name]/SDN1S2JkeXpyVW890 该链接引用了 MVC 网站上的 Controller 操作。
然后将该 URL 插入 HTML 格式的电子邮件中。查看错误日志,我们发现大约 5% 响应该链接的公共(public)用户抛出“无效的 base-64 字符串错误”。大多数(但不是全部)这些错误都与 IE6 用户代理有关。
在尝试了许多基于字符和 URL 编码的可能解决方案后,发现在客户端进程中的某个地方 url 被转换为小写 - 这当然破坏了 base-64 编码(因为它使用大写和小写编码字符)。
该案例的损坏是否是由客户端的浏览器、电子邮件客户端或本地防病毒软件引起的,我无法确定。
解决方案 不要使用任何标准的 base-64 编码方法,而是使用 base-32 或 zBase-32 编码 - 两者都不区分大小写。
请参阅以下链接了解更多详细信息
MyTenPennies Base-32 .NET Implementation
这个故事的寓意是,Base-64 URL 编码在某些公共(public)环境中可能不可靠。 Base-32 虽然稍微冗长一些,但却是更好的选择。
希望这有帮助。
关于asp.net-mvc - 无法解码 Base-64 URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11828864/