有没有办法验证ajax请求是否来自给定的域?

时间:2015-02-23 22:35:24

标签: ajax node.js security http-headers

我是开放(和欢迎)替代我要问的东西 - 我对重新发明轮子不感兴趣,所以如果有更好的方法,我很乐意了解它。

我希望为基于浏览器的AJAX API调用添加一个auth令牌。 API是用Node.js编写的。

鉴于基于浏览器的ajax调用对全世界都是可见的,我试图提出一些方案,将此密钥暴露给恶意用户不会破坏安全性。

因此,我希望将令牌与托管站点的域结合起来,以保证请求由授权用户进行。

我担心的是,没有办法保证这一点。我想知道传入的AJAX标头是否可以以某种方式欺骗,使其看起来像是来自abc.com,而实际上它是由angry-north-korean-hackerz.net制作的。

1 个答案:

答案 0 :(得分:1)

您无法可靠地判断传入的ajax呼叫来自何处。请记住,当它来自浏览器时,它来自个人用户的计算机,而不是来自任何特定的域。此外,任何非浏览器客户端也可以进行ajax调用并发送它想要的任何标题。

在其他浏览器中,只要您的服务器不启用跨站点访问,浏览器就不允许其他网站作为其同源保护的一部分与您的ajax服务器联系,但这不是非强制执行的浏览器客户端。

如果您只想让自己的代码进行这些ajax调用,那么需要做一些工作才能起到阻止作用。我看到它完成的一种方法是在每个网页中放置一个定期更改的令牌。您通过每次ajax调用发送该令牌,并且您的服务器验证这是否是此特定时间段的合法令牌。令牌必须到期,因此流氓客户端不能只收获一个令牌并永远使用它。这不是万无一失的,因为有人可以尝试用刮刀定期收获新的代币,但大多数人会发现比它的价值更麻烦。