我有一个路由请求处理程序,它接受一个应该与数据结构中的键匹配的请求参数...当找到该键的相应对象时,请求者可以访问该对象。
问题是,只有当即将获得访问权限的用户点击通过邀请通过电子邮件发送给他们的生成链接时才会真正触发请求处理程序 - 没有什么能阻止随机用户做出幸运猜测唯一键可能是什么,并在实际未被邀请时获得对象的访问权。
这是我的代码:
app.get('/:creator', function (req, res) {
var path = req.params.creator.toLowerCase();
for(booth in boothList) {
var boothID = boothList[booth].creator.toLowerCase();
if (path == boothID) {
res.sendFile(__dirname+'/public/index.html');
}
}
});
同样,情况如下:
假设第一个用户使用唯一名称“我”创建一个展位...他们向链接http://www.myappsite.com/Me
的某个人发送邀请电子邮件,被邀请的人可以点击链接并加入展位,因为他们应该能够......问题是,不请自来的用户可以手动输入他们的网址栏http://www.myappsite.com/Me
并加入展位,就好像他们被邀请一样,即使他们不是。
我如何确保不会发生这种情况?
答案 0 :(得分:2)
您始终要依赖于链接本身的大小。更大和随机创建的名称更难以猜测,并通过使用蛮力作为攻击向量找到。如果你让你的用户选择他们自己的名字,他们可能会选择简短的名字,这些名字很容易通过简单的字典攻击来猜测。除非你开始使用其他数据来验证传入的请求(比如ip地址等),否则你无法做很多魔术。
您可以增加生成的链接的大小,并使其更难猜测。例如,用户为其键选择名称foo
,但您可以生成类似https://example.com/SRJsWVTxIxYAcPErxwqG7h/foo
的内容。假设随机字符串是由加密安全的RNG生成的,那么您几乎可以肯定某人使用暴力并获得有效密钥的可能性相对较低。
当然,系统上越来越多的有效密钥也会增加攻击者只能通过发送随机字符串来猜测密钥的机会。您可以使用Wikipedia
获取有关生日问题的技术说明还有很多其他方法可以保护您的系统免受猜测,但如果您只想分享电子邮件而又不希望用户同意使用某种密码来保护链接,那么链接扩展是最简单的解决方案。
但是阅读其他人对这件事的看法会很高兴。