如何使查询字符串防篡改?

时间:2009-12-03 06:48:39

标签: .net asp.net asp.net-mvc query-string

我需要在URL中使用查询字符串,但需要确保它们没有被篡改。 I found a solution which almost works,但编码的字符串会被我的应用需要使用的服务破坏。谁能想到不同的解决方案?

编辑:我提到的解决方案对我不起作用,因为它生成的Base64编码查询字符串包含“+”。我传递此查询字符串的服务未正确处理“+”,我甚至无法将其编码为“%2B”。我想,我可以用“_”代替它。但是,我想知道是否完全有不同的解决方案。

编辑2:为了更清楚,我参考的解决方案有效,但我想知道替代解决方案。

3 个答案:

答案 0 :(得分:4)

您可以加密查询字符串值,然后将其传递到您想要使用的位置,只需将其解密即可。 还查看这些文章...... how-to-encrypt-query-string-parameters-in-asp-net

http://www.codeproject.com/KB/web-security/QueryStringEncryptionNET.aspx

答案 1 :(得分:2)

基本上是一个副本: Security with QueryString values in Asp.net MVC

底线 - 永远不会信任来自用户的输入,特别是在网络上,总是假设用户可以并且将篡改输入。

答案 2 :(得分:2)

您可以计算并传递参数的哈希值以及查询字符串。在着陆页上,再次计算哈希并将其与查询字符串哈希进行比较,如果两者不相同则表示URL已被篡改。

您可以在实用程序类中创建函数,如

const string secretKey = "%%YoUrSeCrEtKeY##";

     public static string CreateTamperProofUrl(string pageUrl)
    {
        try
        {
            return HttpUtility.UrlEncode(CreateDigest(pageUrl.Trim()));
        }
        catch (Exception)
        {
            throw;
        }
    }

    private static string CreateDigest(string pageUrl)
    {
        string urlToEncode = secretKey + pageUrl + secretKey;
        var hasher = new MD5CryptoServiceProvider();
        var encoder = new UTF8Encoding();

        byte[] hashedDataBytes = hasher.ComputeHash(encoder.GetBytes(urlToEncode));
        string signatureData = Convert.ToBase64String(hashedDataBytes);

        return signatureData;
    }

    public static bool IsValidDigest(string pageUrl, string receivedDigest)
    {
        if (receivedDigest == null)
        {
            return false;
        }

        string expectedDigest = CreateDigest(pageUrl);
        if (string.Compare(receivedDigest, expectedDigest) != 0)
        {
            return false;
        }
        else
            return true;
    }

在您的目标网页上,只需像这样检查

    if (!Page.IsPostBack)
        {
            if (Request.QueryString["Digest"] != null)
            {
                // compare the digest
                string id = Request.QueryString["fid"];
                string digest = Request.QueryString["Digest"];

                if (Utility.IsValidDigest(id, digest))
                {
                    lblStatus.ForeColor = System.Drawing.Color.DarkGreen;
                    lblStatus.Text = "Valid digest received";
                }
                else
                {
                    lblStatus.ForeColor = System.Drawing.Color.Red;
                    lblStatus.Text = "Url is tampered!";
                }

            }
   }