节点快速路由处理程序 -- 判断用户是点击链接发出请求还是手动输入 URL 栏?



我有路由请求处理程序,它采用一个请求参数,该参数应与数据结构中的键匹配...找到与该键对应的对象时,请求者将获得对该对象的访问权限。

问题在于,只有当即将获得访问权限的用户单击通过邀请通过电子邮件发送给他们的生成链接时,才应该真正触发请求处理程序 - 没有什么可以阻止随机用户对唯一键做出幸运的猜测,并在他们实际上没有被邀请时获得对对象的访问权限。

这是我的代码:

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');
}
}
});

同样,情况是这样的:

假设第一个用户创建了一个具有唯一名称"Me"的展位......他们向带有链接http://www.myappsite.com/Me的人发送邀请电子邮件,该受邀者可以单击链接并加入展位,因为他们应该能够......问题在于,未受邀的用户只需手动输入他们的 URL 栏http://www.myappsite.com/Me并加入展位,就好像他们没有被邀请一样。

我怎样才能确保这种情况不会发生?

您将始终取决于链接本身的大小。较大且随机创建的名称更难猜测和查找,仅通过使用暴力作为攻击媒介。如果你让你的用户选择他们自己的名字,他们可能会选择简短而简单的名称,同样的名字很容易通过简单的字典攻击来猜到。你不能对此做很多魔术,除非你开始使用其他数据来验证传入的请求(如IP地址等)。

您可以增加生成的链接的大小,使其更难猜测。例如,用户为其密钥选择名称foo,但您可以生成类似于https://example.com/SRJsWVTxIxYAcPErxwqG7h/foo的内容。假设随机字符串是由加密安全的 RNG 生成的,那么您几乎可以肯定有人使用蛮力并获得有效密钥的机会相对较低。

当然,系统上有效密钥数量的增加也会增加攻击者仅通过发送随机字符串来猜测密钥的机会。您可以使用维基百科阅读有关生日问题的技术内容

还有很多其他方法可以保护您的系统免受猜测,但是如果您只想共享电子邮件并且不希望用户同意某种密码来保护链接,那么链接扩展是最简单的解决方案。

但是阅读其他人对此事的意见会很好。

最新更新