这似乎是很容易的,但我不知道我错过了什么。 我有一个js脚本,我从我的网站获取一个公共桶。 我注意到,我不送Origin
头S3,它不是必需的,一切正常,没有任何CORS配置。
更重要的是,即使我手动添加Origin标作为要打电话,明令禁止的GET,并通过我的域名:
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>http://www.nonexistingdomain.com</AllowedOrigin>
<AllowedMethod>POST</AllowedMethod>
<AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>
我仍然可以获取内容。 这里发生了什么?
同源策略是防止在一个网站上运行从不同的网站中读取数据JavaScript的浏览器执行功能。 (这将停止使用JavaScript使用浏览器来跳过您的企业防火墙和访问您的Intranet或与您的cookies读取您的Gmail随机网站)。
CORS允许一个网站放宽同源策略,以允许其他网站从中读取数据的方式。
CORS不认证/授权。 你公开的桶是公开的 。
你是不是使用JavaScript来读取你的水桶数据 ,你直接从铲斗装载的JS。
好吧,昆汀谈话之后,我想我明白我在哪里曲解CORS应该如何工作。 在Java世界中,这是一个非常普遍的做法实际上拒绝原点时不匹配的请求。 这里是它的另一个线程中提到 。 如果我们把春天为例(这是在Java世界中的事实上的标准),这里是当加入CORS过滤器会发生什么:
String allowOrigin = checkOrigin(config, requestOrigin);
...
if (allowOrigin == null) {
logger.debug("Reject: '" + requestOrigin + "' origin is not allowed");
rejectRequest(response);
return false;
}
哪里:
/**
* Invoked when one of the CORS checks failed.
*/
protected void rejectRequest(ServerHttpResponse response) {
response.setStatusCode(HttpStatus.FORBIDDEN);
}
你可以找到的代码在这里 。
但让我吃惊,它不与其他堆栈和服务器端技术,比如常见的做法。 另一种常见的做法是送他们有什么CORS配置浏览器,离开的决定吧。
S3是更加棘手:它仅当铲斗CORS规则匹配启用CORS请求(qith Origin标头的请求)发送CORS响应标头。 否则,就不会有CORS响应头。
让我们分析一下该问题并试图了解CORS的基础。
什么是跨来源请求和CORS?
跨源请求:一种用于资源(如图像或字体)请求的来源的外称为跨来源请求。
CORS是有帮助的,当你请求从其他产地受保护的资源。
跨源请求共享:一种用于在受保护的资源(如图像或字体或XHR请求)请求的来源的外称为跨来源请求。
为什么我们需要CORS当资源可以通过使用认证/授权令牌进行保护?
CORS是防守的第一道防线。 当两个客户端(例如,浏览器)和服务器CORS感知,客户端将允许来自特定的起源按照指示通过服务器的服务器只请求。
默认情况下,浏览器都应该执行同源策略的安全机制,按照打造的浏览器的准则。 几乎所有的现代浏览器执行该指示浏览器,使请求到服务器如果起点是一样的同源策略。
同源策略是浏览器的安全机制,你可以阅读更多关于它在这里 。 这是因为浏览器,但浏览器时指定来源和源来源不同的所有请求此功能。 (服务器甚至不知道这种情况的发生,哇!)
对于比较简单的使用情况,当资产(JS,CSS,图片,字体),XHR资源具有相同起源访问,也没有必要担心CORS。
如果资产上的另一个来源或XHR资源托管托管在与源,然后浏览器不会否认默认请求跨域不同的域服务器。 只有具有相应的CORS请求和响应头,浏览器都允许做跨域请求。
让我们来看看在请求和响应头。
请求头
响应头
- 访问控制允许来源
- 访问控制允许的凭据
- 访问控制展露报头
- 访问控制 - 最大 - 年龄
- 访问控制允许的方法访问控制允许报头
对于建立CORS的Origin
,以及Access-Control-Allow-Origin
需要头。 浏览器会自动添加Origin
头球每个请求,所以开发人员需要只配置Access-Control-Allow-Origin
响应头。
为了保护访问只从特定域资源,S3提供了配置CORS规则的选项。 如果价值Access-Control-Allow-Origin
标题是*
所有的跨域请求是允许的,否则定义一个逗号分隔的域列表。
有一对夫妇,你需要知道使用CORS时的事情。
- 这是防守的第一级受保护的资源,而不是最终的防御。
- 你仍然需要实现合适的身份验证和授权,以在服务器上执行CRUD操作的资源。
- 执行同源策略是建立在浏览器和不是强制性的准则。
- 只有当客户接受头CORS标头是有用的。 只有现代浏览器接受CORS标头。 如果你不使用的浏览器,使资源请求,然后CROS不适用。
- 如果你在浏览器的地址栏中键入链接时,CORS规则并不适用于因为浏览器不会在发送
Origin
头到服务器。 该Origin
头是由浏览器只对后续资源请求(样式表,js文件,字体)和XHR请求被发送起源。 - 如果通过直接输入在地址栏中的链接访问的资源文件,浏览器不发送
Origin
头这一要求。
另外,如果你想限制可以访问使用S3上的私人桶前签署的URL。