如何仅允许特定网站访问S3存储桶内的图片资源
S3存储桶防盗链配置失效排查及修复方案
核心实现逻辑
通过校验请求的Referer请求头实现访问控制,仅白名单内的站点可以正常拉取图片资源,无有效Referer的直接访问请求会被拦截返回403,完全匹配「禁止直接下载、允许站点预览」的需求。
1. 存储桶策略修正
直接替换原有策略为下方模板,替换占位符后即可生效:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowGetFromWhitelistedSite", "Effect": "Allow", "Principal": "*", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::你的存储桶名称/*", "Condition": { "StringLike": { "aws:Referer": [ "https://你的域名.com/*", "https://www.你的域名.com/*", "http://你的域名.com/*", "http://www.你的域名.com/*" ] } } }, { "Sid": "DenyAllNonWhitelistedAccess", "Effect": "Deny", "Principal": "*", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::你的存储桶名称/*", "Condition": { "StringNotLike": { "aws:Referer": [ "https://你的域名.com/*", "https://www.你的域名.com/*", "http://你的域名.com/*", "http://www.你的域名.com/*" ] } } } ] }
策略常见错误点:
- 遗漏路径通配符
/*,仅配置根域名会导致子路径下的页面请求被拦截 - 未同时配置http/https、带www/不带www版本的域名,和实际请求Referer不匹配
- Deny规则优先级高于Allow,必须保证两条规则的白名单完全一致
2. CORS配置校验
如果站点跨域加载图片异常,需要配置对应CORS规则,参考模板如下:
[ { "AllowedHeaders": ["*"], "AllowedMethods": ["GET"], "AllowedOrigins": [ "https://你的域名.com", "https://www.你的域名.com" ], "ExposeHeaders": [], "MaxAgeSeconds": 3000 } ]
3. 配置失效常见排查点
- 打开浏览器F12网络面板,确认站点图片请求的
Referer头值和白名单配置完全匹配 - 已接入CloudFront或其他CDN的场景,必须配置CDN透传
Referer请求头到S3源站,否则S3无法拿到Referer会统一拦截请求 - 确保存储桶「阻止公共访问」的4项配置全部开启,否则自定义策略可能被公共权限覆盖
- 检查是否存在其他高优先级的IAM权限、桶策略绕过了Referer校验规则,比如给全局用户开了无限制的GetObject权限
- 如果使用CloudFront OAC/OAI访问S3,需要确保OAC/OAI的访问权限和当前Referer策略不冲突
内容的提问来源于stack exchange,提问作者cgrant
相关产品推荐
相关产品推荐

