Javascript 什么';s以阻止恶意代码欺骗;“起源”;要利用CORS的头?

Javascript 什么';s以阻止恶意代码欺骗;“起源”;要利用CORS的头?,javascript,ajax,http,cors,Javascript,Ajax,Http,Cors,按照我的理解,如果在foo.com页面上运行的客户端脚本希望从bar.com请求数据,则在请求中必须指定标题来源:http://foo.com,bar必须响应访问控制允许原点:http://foo.com 有什么方法可以阻止roh.com网站的恶意代码简单地欺骗标题来源:http://foo.com是否从工具栏请求页面?浏览器可以控制设置原点标题,用户无法覆盖此值。因此,您不会看到从浏览器伪造的源文件标题。恶意用户可以手工创建一个curl请求,手动设置Origin头,但该请求可能来自浏览器外部,

按照我的理解,如果在foo.com页面上运行的客户端脚本希望从bar.com请求数据,则在请求中必须指定标题
来源:http://foo.com
,bar必须响应
访问控制允许原点:http://foo.com


有什么方法可以阻止roh.com网站的恶意代码简单地欺骗标题
来源:http://foo.com
是否从工具栏请求页面?

浏览器可以控制设置
原点
标题,用户无法覆盖此值。因此,您不会看到从浏览器伪造的
源文件
标题。恶意用户可以手工创建一个curl请求,手动设置
Origin
头,但该请求可能来自浏览器外部,并且可能没有特定于浏览器的信息(例如cookie)


记住:CORS不是安全性。不要依赖CORS来保护您的站点。如果您正在提供受保护的数据,请使用cookie或OAuth令牌或除
源文件
标题以外的其他内容来保护该数据。CORS中的
Access Control Allow Origin
标题仅指示应允许哪些来源进行跨来源请求。不要再依赖它了。

TLDR:没有什么可以阻止恶意代码欺骗源代码。当这种情况发生时,您的服务器将永远不会知道它,并将根据请求采取行动。有时候,这些请求很昂贵。所以不要用CORS代替任何类型的安全性


我最近一直在和CORS玩,我问自己同样的问题。我发现,浏览器可能足够聪明,当它看到一个伪造的CORS请求时,可以知道它,但是你的服务器没有那么聪明

我发现的第一件事是,
Origin
头是一个不能通过编程修改的HTTP。这意味着您可以使用在大约8秒钟内修改它

为了测试这一点,我设置了两个客户端域和一个服务器域。我在服务器上包括了一个CORS白名单,它允许来自客户端1但不允许来自客户端2的CORS请求。我测试了两个客户端,实际上客户端1的CORS请求成功了,而客户端2失败了

然后我伪造了客户端2的
Origin
头以匹配客户端1。服务器收到伪造的
Origin
头,并成功通过了白名单检查(如果你是一个半杯半空的家伙,则失败)。之后,服务器尽职尽责地执行任务,消耗了它设计用来消耗的所有资源(数据库调用、发送昂贵的电子邮件、发送甚至更昂贵的sms消息等)。完成后,服务器愉快地将伪造的
accesscontrolalloworigin
头发送回浏览器

我读过的文档说明,收到的
Access Control Allow Origin
值必须与请求中发送的
Origin
值完全匹配。它们确实匹配,所以当我在Chrome中看到以下消息时,我很惊讶:

XMLHttpRequest无法加载
http://server.dev/test
。这个 “访问控制允许来源”标题有一个值
http://client1.dev
这不等于提供的原点。来源<代码>http://client2.dev
因此不允许访问

我读的文档似乎不准确。Chrome的网络标签清楚地显示了请求和响应头,如
http://client1.dev
,但您可以在错误中看到,Chrome不知何故知道真正的来源是
http://client2.dev
并正确拒绝响应这一点无关紧要因为服务器已经接受了伪造的请求并花掉了我的钱。

简单总结一下:

Q:同源策略(SOP)是否仅由浏览器强制执行?
A:是。对于您在浏览器中进行的所有调用,SOP肯定由浏览器应用。服务器可能会也可能不会检查请求的来源

Q:如果请求不符合SOP,浏览器是否会阻止它?
A:不,这超出了浏览器的权限。浏览器只发送跨源请求并等待响应,以查看服务器是否通过
访问控制
-*标题发出合法呼叫信号。如果服务器不发回
Access Control Allow Origin
标题,不回显调用者的来源,或者在标题中不发回
*
,那么浏览器所做的就是避免向调用者提供响应

Q:这是否意味着我不能欺骗
Origin

A:在浏览器中并使用脚本,您不能覆盖
源代码,因为它在浏览器的控制下。但是,如果你想攻击自己,你可以使用浏览器扩展或你机器上安装的其他工具来篡改从你的浏览器发出的呼叫。您还可以使用
curl
Python
C#
等发出
HTTP
调用,并更改
Origin
头来欺骗服务器

Q:所以,如果我可以通过改变
来源来欺骗服务器,这是否意味着
CORS
不安全?
A:
CORS本身对安全性(即请求的身份验证和授权)保持沉默。由服务器来检查请求,并通过它们使用的任何机制(如cookie和标头)对请求进行身份验证/授权。话虽如此,它可以在发生XSS之类的攻击时为我们提供更多的保护:

示例: 假设您已登录到您的网站,一个恶意脚本试图向您的银行网站发送请求以查询您的余额:这是一个反射的XSS攻击。您的银行网站信任来自(此处代表)您的网站的凭据,因此请求将获得