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

时间:2010-05-11 09:16:07

标签: asp.net

斐伊川,

我有一个类似“http://project/page1.aspx?userID=5”的查询字符串。如果手动更改'userID'参数,则不会执行该操作。怎么可能?

8 个答案:

答案 0 :(得分:3)

这听起来像是一个奇怪的要求。您是否尝试实施某种本土安全措施?如果是这样,你真的不应该。

无论如何,您可以采取的一种方法是获取整个网址http://project/page1.aspx?userID=5并计算其md5 sum。然后将md5总和追加到最终的URL,例如http://project/page1.aspx?userID=5&checksum=YOURCALCULATEDMD5SUM。然后在page1.aspx中,您必须验证校验和参数是否正确。

然而,这种方法非常天真,任何人都不需要花很长时间才能找出你使用过的算法。如果他们这样做,他们可以“轻松”更改用户ID并自己计算md5总和。一种更强大的方法是校验和由只有您访问的密钥加密。但我再次质疑你想要这样做的动机,因为其他安全解决方案存在得更好。

答案 1 :(得分:3)

你不能。

HTTP请求中的任何内容(包括URL,查询字符串,cookie,...)都在客户端的控制之下,很容易伪造。

这就是为什么将有效内容列入白名单很重要的原因,因为除了您提示接收的内容之外,客户还可以随意添加任何喜欢的内容。

答案 2 :(得分:3)

所有,谢谢你的帮助......我从其他一些网站得到了一些不同的解决方案。我不知道最好的解决方案。这是使用加密和解密算法对值进行编码...示例代码已经写成这样......

<a href='Page1.aspx?UserID=<%= HttpUtility.UrlEncode(TamperProofStringEncode("5","F44fggjj")) %>'>
        Click Here</a> <!--Created one anchor tag and call the function for TamperProofStringEncode-->


    
 private string TamperProofStringEncode(string value, string key)
 {
            System.Security.Cryptography.MACTripleDES mac3des = new    System.Security.Cryptography.MACTripleDES();
            System.Security.Cryptography.MD5CryptoServiceProvider md5 = new System.Security.Cryptography.MD5CryptoServiceProvider();
            mac3des.Key = md5.ComputeHash(System.Text.Encoding.UTF8.GetBytes(key));
            return Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(value)) + "-" + Convert.ToBase64String(mac3des.ComputeHash(System.Text.Encoding.UTF8.GetBytes(value)));
        }


在'Page1'的页面加载中,调用解码算法来解码查询字符串

try
        {
            string DataString = TamperProofStringDecode(Request.QueryString["UserID"], "F44fggjj");
            Response.Write(DataString);
        }
        catch (Exception ex)
        {
            Response.Write(ex.Message);
        }

private string TamperProofStringDecode(string value, string key)
    {
        string dataValue = "";
        string calcHash = "";
        string storedHash = "";

        System.Security.Cryptography.MACTripleDES mac3des = new System.Security.Cryptography.MACTripleDES();
        System.Security.Cryptography.MD5CryptoServiceProvider md5 = new System.Security.Cryptography.MD5CryptoServiceProvider();
        mac3des.Key = md5.ComputeHash(System.Text.Encoding.UTF8.GetBytes(key));

        try
        {
            dataValue = System.Text.Encoding.UTF8.GetString(Convert.FromBase64String(value.Split('-')[0]));
            storedHash = System.Text.Encoding.UTF8.GetString(Convert.FromBase64String(value.Split('-')[1]));
            calcHash = System.Text.Encoding.UTF8.GetString(mac3des.ComputeHash(System.Text.Encoding.UTF8.GetBytes(dataValue)));

            if (storedHash != calcHash)
            {
                //'Data was corrupted
                throw new ArgumentException("Hash value does not match");
                //  'This error is immediately caught below

            }
        }
        catch (Exception ex)
        {
            throw new ArgumentException("Invalid TamperProofString");
        }

        return dataValue;

    } 

答案 3 :(得分:3)

这是另一个我发现对我的要求非常有用的选项:

4 Guys From Rolla - Passing Tamper-Proof QueryString Parameters

答案 4 :(得分:2)

我最喜欢的是以下内容。它使用HTTP模块透明地编码和解码Querystring,其中显式旨在防止对查询字符串进行篡改。

http://www.mvps.org/emorcillo/en/code/aspnet/qse.shtml

当Session不是一个选项时,这是完美的!

答案 5 :(得分:1)

您无法判断是否已手动更改。如果您使用查询字符串,那么您应该确保它是否更改无关紧要。例如如果您使用它来向用户显示其帐户详细信息,则需要检查所选用户,当前用户是否显示错误消息而不是用户数据(如果不是)。

答案 6 :(得分:1)

如果允许用户更改记录5,但不允许更改记录7,则必须在服务器端强制执行此操作。要做到这一点,您需要能够识别用户,方法是要求登录,并为他们提供存储在浏览器cookie中的唯一会话密钥,或者作为url查询字符串中的另一个参数。

人工语言中有丰富的包/模块/库,用于以合理的方式处理身份验证和会话 - 让您自己承担风险:)

答案 7 :(得分:0)

嗯 - 这取决于:)

一种可能性是将userID放入会话变量中。因此用户无法查看或编辑该值。

如果您有其他方法可以检测该值无效(即不存在或不能用于该用户(您可以通过其他方式识别)或类似用户)您可能会得到在你背后的代码中自己验证输入。

但是您可能知道无法阻止用户更改查询字符串。