asp.net-mvc - 无法解码 Base-64 URL

标签 asp.net-mvc base64 url-encoding

我有一个构建 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 编码 - 两者都不区分大小写。

请参阅以下链接了解更多详细信息

Base-32 - Wikipedia

MyTenPennies Base-32 .NET Implementation

这个故事的寓意是,Base-64 URL 编码在某些公共(public)环境中可能不可靠。 Base-32 虽然稍微冗长一些,但却是更好的选择。

希望这有帮助。

关于asp.net-mvc - 无法解码 Base-64 URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11828864/

相关文章:

c# - 在 ASP.net 中使用多对多关系

asp.net-mvc - 为什么我的完整 View 模型没有被 ApiController 序列化?

c# - 将纯文本从文本框转换为 SHA1,然后将 Sha1 转换为基数 64 C#

linux - 解码base64 : invalid input

python - 在 python3 请求中传递参数而不转义

javascript - 函数.createdelegate

c# - 在 ASP.NET MVC 5 中将图像添加到数据库

javascript - 在 Javascript/Jquery 中将 URL 图像转换为 Base64 或 Blob 的简单方法

asp.net - Request.QueryString[] 没有返回我想要的值

asp.net-mvc - ASP.Net MVC 2.0 : unescaping URL query parameters