【问题标题】:Hash URLSearchParams to prevent manipulation散列 URLSearchParams 以防止操纵
【发布时间】:2018-06-26 03:23:01
【问题描述】:

想知道protect my link's get parameters in an email from manipulation。此代码将在服务器端运行以生成电子邮件的 URL:

    const url = new URL('https://e.dev.example.com')
    
    url.search = new URLSearchParams({
      url: 'https://dev.case.example.com/case/61914',
      user: 21,
      medium: 'email',
      id: 'foobar-123'
    })
    
    console.log(url.toString())

是否有任何好的现有解决方案来对参数进行排序(即使其规范)或以某种方式封装它们,对内容进行哈希处理,然后添加该(短)哈希以稍后验证有效负载?

【问题讨论】:

    标签: javascript security url


    【解决方案1】:

    我认为没有任何标准化的解决方案。它猜测这一切都归结为散列的安全性(防止操纵)和工作量(处理速度复杂性)。两者通常都是权衡取舍,您想做出妥协的决定。

    至于发送参数的通用方式,我猜 JSON 是当今最广泛接受且易于操作的格式。序列化 JSON 对象,然后进行散列处理将是通过 URL 发送日期的好方法。

    请参考this 链接以了解更多信息。

    【讨论】:

      【解决方案2】:

      如果您如上所述在 Javascript 中创建链接,则无法阻止操纵,因为创建链接所需的任何内容都可用于 Javascript,即。用户。在这种情况下,您的用户可以创建一个带有任意参数的链接,然后像您的 Javascript 一样为其创建哈希。

      如果您在服务器端创建链接,那就另当别论了。然后,您可以规范化参数表示(例如,按字母顺序排列它们,这可能是最简单的),并基于服务器端机密添加 MAC(消息身份验证代码)以确保真实性。用于此目的的一种好的算法是 HMAC。这样,当再次向服务器发送参数时,您可以检查(再次基于秘密)没有被篡改。

      如果您还想隐藏参数,可以使用authenticated encryption

      另外请注意,这样做会导致重放攻击,即。一次拥有链接的人可以在以后随时使用它,除非有某种保护措施(随机数或时间戳)。

      同样,您不能只在客户端执行此操作,需要在服务器上生成链接,基于某种消息身份验证机制和服务器端机密。

      【讨论】:

      • 对不起,您可以假设链接是在服务器端生成的。
      • @hendry hmac() 就是这样。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-07
      • 2015-05-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多