首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使查询字符串防篡改?

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

Stack Overflow用户
提问于 2009-12-03 14:48:39
回答 3查看 3.9K关注 0票数 3

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

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

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

EN

回答 3

Stack Overflow用户

发布于 2009-12-03 14:53:52

您可以加密您的querystring值,然后传递它,在您想要使用的地方,只需解密它。也可以查看这些文章...how-to-encrypt-query-string-parameters-in-asp-net

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

票数 4
EN

Stack Overflow用户

发布于 2009-12-03 14:53:14

基本上是Security with QueryString values in Asp.net MVC的复制品

底线-永远不要相信用户的输入,特别是在web上,总是假设用户可以并将篡改输入。

票数 2
EN

Stack Overflow用户

发布于 2014-11-06 13:22:30

您可以计算参数的散列并将其与查询字符串一起传递。在登录页面上,再次计算散列,并将其与查询字符串散列进行比较,如果两者不相同,则意味着URL被篡改。

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

代码语言:javascript
复制
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;
    }

在您的登录页面上,只需像这样检查

代码语言:javascript
复制
    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!";
                }

            }
   }
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1838138

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档