ASP.NET:在URL中隐藏查询字符串

时间:2009-09-29 15:56:11

标签: asp.net post url-rewriting

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

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

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

5 个答案:

答案 0 :(得分:4)

这些查询字符串变量的来源是什么?你能否不能将所有数据作为POST数据提交,以便没有查询字符串?

答案 1 :(得分:3)

您也可以使用

Context.RewritePath("/foo.aspx")

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

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

答案 2 :(得分:2)

前来我为此目的制作了一些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;
    }

答案 3 :(得分:1)

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

一旦您知道自己所在的位置,就可以 Response.Redirect 到同一页面,它们就会消失。

答案 4 :(得分:0)

它保留了Query String和Form Variables(可选)。它不会显示在用户Web浏览器中重定向请求的真实URL。 Server.Transfer在浏览器不知情的情况下发生。浏览器请求页面,但服务器返回另一个页面的内容。

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