这似乎很容易,但是我不知道自己缺少什么。
我有一个从我的网站获取的带有js脚本的公共存储桶。我注意到我没有将obj is None
标头发送到S3,这不是必需的,并且在没有任何CORS配置的情况下一切正常。
更重要的是,即使在我手动将Origin标头添加到该GET调用并通过以下方式明确禁止GET和我的域之后,也是如此:
Origin
我仍然可以获取内容。这是怎么回事?
答案 0 :(得分:1)
相同来源策略是浏览器强制实施的一项功能,该功能可防止在一个网站上运行的JavaScript从另一个网站读取数据。 (这会阻止使用JavaScript的随机网站使用您的浏览器来跳过公司防火墙并访问您的Intranet或使用Cookie读取GMail)。
CORS允许网站放松相同起源策略,以允许其他网站以这种方式读取数据。
CORS不是身份验证/授权。您的公开桶是公开。
您没有使用JavaScript从存储桶中读取数据,而是直接从存储桶中加载JS。
答案 1 :(得分:1)
好吧,在与Quentin交谈之后,我想我知道我在误解CORS应该如何工作。 在Java世界中,通常会在Origin不匹配时拒绝请求。这是mentioned所在的另一个线程。 如果以Spring为例(在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);
}
您可以找到代码here。
但是令我惊讶的是,这与其他堆栈和服务器端技术并不常见。另一种常见的方法是将其具有的所有CORS配置发送给浏览器,然后由其决定。
S3更加棘手:仅当存储桶CORS规则与启用了CORS的请求匹配时才发送CORS响应标头(一个请求,即Origin标头)。否则,将没有CORS响应标头。
答案 2 :(得分:0)
让我们解决这个问题,并尝试了解CORS的基本原理。
当您从另一个来源请求受保护的资源时,跨源请求:对资源的请求(例如 原点之外的图片或字体)称为跨原点 请求。
CORS会很有帮助。
跨域请求共享:在源之外对受受保护资源的请求(例如图像,字体或XHR请求)被称为跨域请求。
CORS是第一道防线。当客户端(例如,浏览器)和服务器都支持CORS时,客户端将仅允许从特定来源到服务器的请求,如服务器指示的那样。
默认情况下,浏览器应按照构建浏览器的准则实施同源策略安全机制。几乎所有现代浏览器都实施同源策略,该策略指示浏览器在源相同的情况下允许对服务器的请求。
同源策略是浏览器的安全性机制,您可以详细了解here。正是由于浏览器的这一特性,当指定来源和来源来源不同时,浏览器会阻止所有请求。 (服务器甚至都没有意识到这种情况,哇!)
对于更简单的用例,当资产(js,CSS,图像,字体),XHR资源可以以相同来源访问时,则无需担心CORS。
如果资产托管在另一个来源上,或者XHR资源托管在具有与源不同的域的服务器上,则浏览器默认不会拒绝跨域请求。只有使用适当的CORS请求和响应标头,浏览器才可以发出跨域请求。
让我们看一下请求和响应头。
要设置CORS,需要Origin
和Access-Control-Allow-Origin
标头。浏览器将自动向每个请求添加Origin
标头,因此开发人员只需配置Access-Control-Allow-Origin
响应标头。
为保护仅来自特定域的资源访问,S3提供了一个配置CORS规则的选项。如果Access-Control-Allow-Origin
标头的值为*
,则所有跨域请求都被允许,否则,请定义一个用逗号分隔的域列表。
在使用CORS时,需要注意几件事。
Origin
头发送到服务器。浏览器仅在随后的资源请求(样式表,js文件,字体)和XHR请求(按来源)上发送Origin
标头。
Origin
头。此外,如果您想限制GET访问,请在私有存储桶上使用S3预签名URL。