代码之家  ›  专栏  ›  技术社区  ›  saille

通过添加哈希值来防止查询字符串操作?

  •  4
  • saille  · 技术社区  · 17 年前

    5 回复  |  直到 17 年前
        1
  •  9
  •   Uriah Blatherwick Jeremy Powell    7 年前

    我不确定这是否提供了任何安全保障。如果中间人攻击者想要更改参数,他们所要做的就是更改查询字符串并重新计算SHA-1哈希,然后将该请求发送到服务器。

    例如,浏览器发送的URL可能是:

    http://www.example.com/addUser.html?parameterA=foo&hash=SHA1("parameterA=foo")

    如果攻击者拦截了此内容,他们可以通过以下方式对其进行编辑:

    http://www.example.com/adduser.html?parameterA=bar&hash=SHA1("parameterA=bar")

    解决这个问题的一种方法是,如果用户有一个只有他们和服务器知道的密码,那么如果攻击者更改参数,他们就不可能重新计算哈希值。例如:

    http://www.example.com/addUser.html?parameterA=foo&hash=SHA1("parameterA=foo"+"theuserpassword")

    但不要将密码作为URL中的参数之一:)

    值得注意的是,这不是验证双方之间传递的消息完整性的最新技术。今天使用的是一种基于哈希的消息认证码(HMAC)算法,在 HMAC ,并明确地 RFC2104 FIPS Pub 198-1 .

        2
  •  2
  •   Amedeo Ricchezza    15 年前

    在global.asax文件中

    protected void Application_AuthenticateRequest(Object sender, EventArgs e)
    {
        // I take the url referer host. (manipulating the query string this value is null or your local address)
        string strRefererHost = Request.UrlReferrer == null ? string.Empty : Request.UrlReferrer.Host;
    
        // This is the host name of your application 
        string strUrlHost = Request.Url.Host;
    
        // I read the query string parameters
        string strQSPars = Request.Url.Query ?? string.Empty;
    
        // If the referer is not the application host (... someone manipulated the qs)...  
        // and    there is a query string parameter (be sure of this otherwise nobody can access the default page of your site
        // because this page has always a local referer...)
        if (strRefererHost != strUrlHost && strQSPars != string.Empty)
            Response.Redirect("~/WrongReferer.aspx"); // your error page
    
    }
    
        3
  •  1
  •   Ziad    16 年前

    你可以考虑使用这个小的开源库:

    http://www.codeproject.com/KB/aspnet/Univar.aspx

    它为每台客户端计算机使用一个唯一的密钥,并附带了许多其他功能。

        4
  •  0
  •   backslash17    17 年前

    我认为添加一个包含所有其他参数哈希值的参数是个好主意。它从根本上防止了查询字符串的操作,但你必须考虑这个问题,即在应用程序的其他页面中使用这些URL,将这些URL发送给公众或以任何打印方式使用它们。如果这些页面不是动态创建的,或者你只需要手动添加这些网址,你需要有一种很好的订购方式,并特别地将它们放在手边。

    我没有看到任何其他问题。有人可能会告诉你哈希值是可以计算的,但你可以按照参数的顺序来获得不同的哈希值,这很难猜测。

        5
  •  0
  •   tobyodavies    15 年前

    这样做的一个主要问题是,javascript必须进行客户端SHA计算才能链接到页面,这当然取决于你使用JS的程度,但认为get参数可能包括pageNo=1,并且有一个“跳转到页面”输入框,如果你添加哈希值,这将变得困难,这应该是合理的。你可以在会话(服务器端)中存储任何你真的不想被操纵的东西。