【问题标题】:Issue with Base64-encoded parameter in query string查询字符串中的 Base64 编码参数问题
【发布时间】:2012-06-26 11:22:33
【问题描述】:

我正在我的网络应用程序中向用户邮件发送一个链接(用于确认用户注册),如下所示:

<a target="_blank" href="http://localhost:2817/ConfirmRegistration?confirm=Y0tcmGepe7wjH7A1CT1IaA==">
http://localhost:2817/ConfirmRegistration?confirm=Y0tcmGepe7wjH7A1CT1IaA==
</a>

但 Chrome 会提示此消息:

查询字符串是否无效?我该如何解决?

顺便说一句:
我的应用程序是 C# 和 MVC3

【问题讨论】:

标签: html asp.net-mvc-3 c#-4.0 hyperlink


【解决方案1】:

我使用的是 HttpUtility.UrlEncode,但如果 base64 编码的字符串包含“+”号,我会遇到问题。它被正确地编码为“%2b”,但是当它从浏览器返回时,它被解释为一个空格。所以,我改用了两种简单的编码/解码方法:

public static string UrlEncodeBase64(string base64Input)
{
    return base64Input.Replace('+', '.').Replace('/', '_').Replace('=', '-');
}

public static string UrlDecodeBase64(string encodedBase64Input)
{
    return encodedBase64Input.Replace('.', '+').Replace('_', '/').Replace('-', '=');
}

【讨论】:

    【解决方案2】:

    您应该对 confirm 参数进行 URL 编码。您得到的错误是因为最后一个 == 片段。

    为此使用HttpServerUtility.UrlEncode 或类似的框架方法。

    【讨论】:

    • 我的用户 Url.Encode 和确认查询字符串更改为 ?confirm=Y0tcmGepe7wjH7A1CT1IaA%3d%3d,但谷歌再次提醒相同的消息!
    • 我遇到了将“+”符号解释为空格的问题,因此我不得不自己替换三个不安全的 base64 字符,请参阅:stackoverflow.com/a/48441540/236008
    【解决方案3】:

    您可能应该对参数值进行 URL 编码,因为 = 本身用于将参数名称与参数值分开。

    【讨论】:

      【解决方案4】:

      您可以通过将两个字符 + 替换为 _ 并将 / 替换为 - 来发送您的值:

      string confirm=confirm.Replace('+', '_').Replace('/', '+');
      
      <a target="_blank" href="http://localhost:2817/ConfirmRegistration?confirm=@confirm">
      http://localhost:2817/ConfirmRegistration?confirm=@confirm
      </a>
      

      您可以通过以下方式在服务器端获取数据:

      if (Request.QueryString["confirm"] != null && Request.QueryString["confirm"].ToString() != "")
      {
             string confirm = HttpUtility.HtmlDecode(Request.QueryString["confirm"]).Replace('_', '+').Replace('-', '/');
      }
      

      【讨论】:

        【解决方案5】:

        如果您使用的是 ASP.net 核心,则可以使用 WebEncoders.Base64UrlEncode 和 WebEncoders.Base64UrlDecode

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-07-22
          • 1970-01-01
          • 2011-09-22
          • 2012-06-02
          相关资源
          最近更新 更多