哈希URLSearchParams以防止操纵

时间:2018-06-26 03:23:02

标签: javascript security url

想知道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())

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

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

如果您按上述方法在Javascript中创建链接,则无法阻止操作,因为创建链接所需的任何内容均适用于Javascript。用户。在这种情况下,您的用户可以使用任意参数创建链接,并且只需像使用Javascript一样为其创建哈希即可。

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

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

还请注意,这样做可以重放攻击,即。一次拥有链接的人可以在以后的任何时间使用它,除非已经采取了某种保护措施(随机数或时间戳)。

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