有什么方法可以禁用跨域Ajax请求吗?
可以说有两个域: mywebsite.com 和 hackerswebsite.com 。在 mywebsite.com 上,存在一个包含具有AJAX功能的javascript的网站,该网站将数据发送到 hackerswebsite.com 。我只想防止这种情况,只允许将AJAX请求发送到mywebsite.com域。
我知道有类似“相同来源策略”的内容,但据我了解它在第二个域上有效,并且可以阻止来自其他域的连接。
确切地说,可以说我有一个网站,用户可以在其中运行自己的JavaScript。如果他们可以编写自己的脚本,则可以从DOM文档中获取任何数据,并将其异步发送到自己的服务器,该服务器将从我的域中接收数据。例如登录名。我对吗?
如果我错了,请纠正我。我只是想了解这个安全策略。
最佳答案
听起来好像您希望content security policy(CSP)限制页面可以使用和不能使用的资源和Ajax目标。
同源政策旨在防止网站读取来自第三方的凭据响应(例如,我加载evil.com
,并且该网站指示我的浏览器使用bank.com
cookie来获取我的在线银行对帐单)。 SOP并非旨在阻止用户或站点在他们喜欢的任何地方发送数据。
如果发生以下情况之一,则站点的CSP旨在将对资源的访问列入白名单:
需要明确的是,情况2的危险不是用户可以运行自己的JavaScript,而是用户可能运行其他用户的脚本。
一个示例CSP可能是:
Content-Security-Policy: default-src 'self'; frame-src 'none'; object-src 'none';
这将阻止任何加载iframe或插件的尝试,并将所有其他资源加载(包括图像,脚本,样式表和Ajax请求)限制为当前来源。如果您想允许使用插件或iframe,则可以删除其中一个或这些指令,它们将退回到
default-src
指令。您可以使用connect-src
指令来专门限制Ajax。还要注意,如果让用户运行任意脚本,即使使用非常严格的CSP来处理跨域网络请求,您仍然可能会遇到严重的问题(例如,用误导性的内容重写页面)。