【问题标题】: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。
另外请注意,这样做会导致重放攻击,即。一次拥有链接的人可以在以后随时使用它,除非有某种保护措施(随机数或时间戳)。
同样,您不能只在客户端执行此操作,需要在服务器上生成链接,基于某种消息身份验证机制和服务器端机密。