【问题标题】:ASP.NET : Hide Querystring in URLASP.NET:在 URL 中隐藏查询字符串
【发布时间】:2009-09-29 15:56:10
【问题描述】:

我不知道我是否只是过于乐观,但有没有办法隐藏 URL 中返回的查询字符串?

我所处的场景是 page1.aspx 通过帖子将命令重定向到外部服务器,并将其返回给 page2.aspx。我遇到的唯一问题是返回变量的查询字符串仍然留在 URL 中。

我只想对普通用户隐藏丑陋的字符串/信息。那么有没有办法在 pageload 方法中编辑和重新加载它,或者我只需将变量保存在中间人页面上,然后点击第 2 页。

【问题讨论】:

    标签: asp.net post url-rewriting


    【解决方案1】:

    这些查询字符串变量的来源是什么?能不能不把所有数据都作为POST数据提交,这样就没有querystring了?

    【讨论】:

    • 它是从外部服务器返回的,它访问了我的 page2.aspx,并且 URL 是 localhost/page2.aspx?results=data。所以我无法控制它是如何到达第 2 页的,我只想将信息隐藏在地址栏中
    • 那么我同意 rick 的观点,重定向是去这里的方式。
    【解决方案2】:

    你也可以使用

    Context.RewritePath("/foo.aspx")
    

    这是 ScottGu 关于 URL 重写的博客文章的链接。

    http://weblogs.asp.net/scottgu/archive/2007/02/26/tip-trick-url-rewriting-with-asp-net.aspx

    【讨论】:

      【解决方案3】:

      不久前,我为此做了一些 http 编码加密/解密方法。有时在 asp.net 中您需要使用查询字符串,但您还需要最终用户不知道该值。我所做的是 base 64 编码,加密值,根据我的私钥对值进行散列,然后将它们用 - 粘在一起。另一方面,我检查左侧哈希以验证真实性,并解密右侧。一个非常好的问题是 +(它是一个有效的 base64 字符串值)等于 html 编码中的空格,所以我在解密时考虑到了这一点。

      我使用这个的方式是把加密后的值加到查询字符串中,然后在另一边解密

          private const string KEY = "<random value goes here>";
      
          public static string EncryptAndHash(this string value)
          {
              MACTripleDES des = new MACTripleDES();
              MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
              des.Key = md5.ComputeHash(Encoding.UTF8.GetBytes(KEY));
              string encrypted = Convert.ToBase64String(des.ComputeHash(Encoding.UTF8.GetBytes(value))) + '-' + Convert.ToBase64String(Encoding.UTF8.GetBytes(value));
      
              return HttpUtility.UrlEncode(encrypted);
          }
      
          /// <summary>
          /// Returns null if string has been modified since encryption
          /// </summary>
          /// <param name="encoded"></param>
          /// <returns></returns>
          public static string DecryptWithHash(this string encoded)
          {
              MACTripleDES des = new MACTripleDES();
              MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
              des.Key = md5.ComputeHash(Encoding.UTF8.GetBytes(KEY));
      
              string decoded = HttpUtility.UrlDecode(encoded);
              // in the act of url encoding and decoding, plus (valid base64 value) gets replaced with space (invalid base64 value). this reverses that.
              decoded = decoded.Replace(" ", "+");
              string value = Encoding.UTF8.GetString(Convert.FromBase64String(decoded.Split('-')[1]));
              string savedHash = Encoding.UTF8.GetString(Convert.FromBase64String(decoded.Split('-')[0]));
              string calculatedHash = Encoding.UTF8.GetString(des.ComputeHash(Encoding.UTF8.GetBytes(value)));
      
              if (savedHash != calculatedHash) return null;
      
              return value;
          }
      

      【讨论】:

      • 感谢 Matt Briggs 的解决方案。我一直在寻找这个解决方案很长一段时间,并在这里找到了它。奇迹般有效 。非常感谢:)
      【解决方案4】:

      我不喜欢这种方法,但它会起作用。

      一旦你知道你在你需要的地方,你可以Response.Redirect到同一个页面,它们就会消失。

      【讨论】:

        【解决方案5】:

        它保留查询字符串和表单变量(可选)。它不会显示在用户 Web 浏览器中重定向请求的真实 URL。 Server.Transfer 在浏览器一无所知的情况下发生。浏览器请求一个页面,但服务器返回另一个页面的内容。

        protected void btnServer_Click(object sender, EventArgs e)
        {
            Server.Transfer("~/About.aspx?UserId=2");
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-01-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-05
          • 2013-02-16
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多