【问题标题】:How can I make a query string tamper-proof?如何使查询字符串防篡改?
【发布时间】:2009-12-03 06:48:39
【问题描述】:

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

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

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

【问题讨论】:

  • 您可能需要更具体地了解您的链接解决方案在哪些方面不起作用。结果如何“被破坏”?
  • 您仅提供 Base64 的链接 - 对 URL 进行编码。这不是防篡改。
  • @Mathias:是的,我链接到的解决方案没有加密查询字符串。但是,这与防篡改是分开的。

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


【解决方案1】:

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

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

【讨论】:

  • 好的,谢谢。第二个链接与我在原始帖子中引用的相同。
【解决方案2】:

基本上是以下内容的副本: Security with QueryString values in Asp.net MVC

底线 - 永远不要相信来自用户的输入,尤其是通过网络,始终假设用户可以并且将会篡改输入。

【讨论】:

  • 没错——这就是为什么我要防篡改我的查询字符串。
【解决方案3】:

您可以计算和传递参数的哈希值以及查询字符串。在您的着陆页上,再次计算哈希值并将其与查询字符串哈希值进行比较,如果两者不同,则表示 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!";
                }

            }
   }

【讨论】:

  • MD5CryptoServiceProvider 非常适合加密。听说是弱加密算法。
猜你喜欢
  • 1970-01-01
  • 2010-12-02
  • 1970-01-01
  • 2015-01-11
  • 1970-01-01
  • 2015-04-02
  • 1970-01-01
  • 2017-04-13
  • 2015-01-28
相关资源
最近更新 更多