如何在Amazon S3上设置CORS以仅允许经过批准的域访问我的S3存储桶中的JS脚本?目前,我的S3存储桶上的CORS设置如下:
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>www.someapproveddomain.com</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<MaxAgeSeconds>3000</MaxAgeSeconds>
<AllowedHeader>Authorization</AllowedHeader>
</CORSRule>
</CORSConfiguration>
然而,任何域都可以访问并运行脚本hello.js
(位于S3存储桶中)demonstrated at JSFiddle。有人说我做错了吗?或者,也许我只是误解了CORS应该做什么?
答案 0 :(得分:4)
您需要使用限制访问特定HTTP引荐来源的S3 Bucket Policy来解决此问题,而不是尝试使用CORS解决此问题。记录在案here。
这是AWS提供的示例存储桶策略:
{
"Version":"2012-10-17",
"Id":"http referer policy example",
"Statement":[
{
"Sid":"Allow get requests originating from www.example.com and example.com.",
"Effect":"Allow",
"Principal":"*",
"Action":"s3:GetObject",
"Resource":"arn:aws:s3:::examplebucket/*",
"Condition":{
"StringLike":{"aws:Referer":["http://www.example.com/*","http://example.com/*"]}
}
}
]
}
请注意,攻击者非常容易使用HTTP引用来欺骗。
答案 1 :(得分:2)
我认为你误解了CORS。 (编辑:没关系!)
CORS不适用于服务器端安全性。
这里有比我能解释的更好的解释,但其中一个主要目的是阻止某人创建虚假网站(如银行门户网站)并让它向真实服务器发出请求用户的真实凭据。如果服务器和真实站点启用了CORS,则服务器将仅允许来自真实站点域的请求。
您可能希望了解的是使用 IAM策略或 S3存储桶策略。来自AWS here的优秀博客文章就是这样的。您需要将EC2实例作为一种中间人来访问S3存储桶并将文件服务器提供给客户端。
纯粹的S3可能还有另一种方法可以做到这一点,但基本上如果它可以在没有身份验证的情况下公开访问,那么有人可以在技术上欺骗标题,使其看起来像来自您的CORS定义域。