有没有办法验证 ajax 请求是从给定域发出的?

Is there a way to verify that an ajax request was made from a given domain?

对于我要问的问题,我愿意(并欢迎)替代方案 - 并且我对重新发明轮子不感兴趣,所以如果有更好的方法,我很想知道它。

我的愿望是向基于浏览器的 AJAX API 调用添加一个身份验证令牌。 API写成Node.js。

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

因此,我想将令牌与托管网站的域结合起来,以保证请求是由授权用户发出的。

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

您无法可靠地分辨出 ajax 来电的来源。请记住,当它来自浏览器时,它来自个人用户的计算机,而不是来自任何特定域。另外,任何 non-browser 客户端也可以进行 ajax 调用并发送任何 headers 它想要的东西。

从另一个浏览器,只要您的服务器不启用 cross-site 访问,浏览器就不会允许其他网站联系您的 ajax 服务器作为其 same-origin 保护的一部分,但这不是从 non-browser 客户强制执行的。

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