一、结论
出海APP可以通过配置S3存储桶的Bucket Policy(桶策略),对HTTP请求的Referer头做白名单校验,拦截未授权的访问请求,实现基础防盗链,避免资源被盗刷产生额外流量成本。
二、准备工作
1. 已开通S3存储服务(包含AWS原生S3或兼容S3协议的对象存储服务),且拥有目标存储桶的管理员操作权限;
2. 提前整理好允许访问资源的白名单:包含出海APP的Web端官方域名、H5活动页域名、APP端自定义的Referer标识(建议统一设置为APP包名+版本号格式);
3. 已获取目标存储桶的ARN信息、对应服务的Endpoint和Region信息,若使用命令行操作需提前安装对应CLI工具并配置好拥有存储桶编辑权限的AK/SK密钥;
4. 确认需要开放的特殊场景:比如是否允许不带Referer头的请求访问、是否需要豁免CDN回源请求等。
三、操作步骤
步骤1:进入目标存储桶的配置页
登录对应S3服务的管理控制台:如果使用AWS原生S3,在服务列表中找到「S3」入口进入存储桶列表;如果使用七彩云对象存储,在左侧导航栏选择「对象存储」-「存储桶列表」。在列表中找到出海APP用于存储静态资源、用户上传内容的目标存储桶,点击桶名称进入详情页。
步骤2:打开桶策略编辑入口
在存储桶详情页点击顶部「权限」选项卡,向下滚动找到「桶策略(Bucket Policy)」配置区域,点击「编辑」按钮进入策略编辑页。如果使用七彩云对象存储,可以选择「可视化防盗链配置」模式,无需手动编写JSON代码,直接在表单中填入白名单即可,操作更简单。
步骤3:编写符合规则的桶策略
按照S3策略规范编写JSON内容:
- 固定填写
Version字段为"2012-10-17"(该字段为S3官方固定版本号,不可自定义); Effect字段设置为"Deny",代表不符合规则的请求会被拒绝;Principal字段设置为"*",代表规则对所有访问者生效;Action字段设置为"s3:GetObject",代表规则限制资源的读操作;Resource字段填写存储桶的ARN并追加/*,格式为"arn:aws:s3:::你的存储桶名称/*",代表规则对桶内所有资源生效;- 在
Condition中配置StringNotLike规则,将提前整理好的白名单填入aws:Referer数组中,代表请求头的Referer不在白名单内时,触发拒绝规则。
步骤4:保存并验证配置
填写完成后点击「保存」按钮,AWS原生S3的策略会在1-2分钟内生效,七彩云对象存储的配置为实时生效。生效后完成三项测试:
1. 用非白名单域名的网页嵌入存储资源,确认返回403错误;
2. 用白名单内的域名访问资源,确认可以正常加载;
3. 打开出海APP测试图片、音视频等资源的加载情况,确认所有资源正常显示。
如果出现异常,可参考下文中的常见错误部分排查。
四、常见错误
- Endpoint填写错误:不同Region的S3服务Endpoint不同,若填写错误会导致配置失败、策略不生效,七彩云对象存储的Endpoint可在控制台对应存储桶的概览页直接复制,无需手动拼接;
- Region错误:存储桶所属的Region和配置时选择的Region不一致,会导致找不到目标存储桶,建议配置前先在存储桶概览页确认所属Region;
- 权限不足:当前登录账号或使用的AK/SK对应的IAM用户只有存储桶只读权限,没有编辑桶策略的权限,保存时会返回403错误;
- Referer规则格式错误:漏写http/https前缀、通配符使用错误(比如把
*.example.com写成*example.com),会导致白名单匹配失效; - 策略语法错误:JSON格式漏写逗号、括号不匹配,或者修改了固定的Version字段,都会导致策略保存失败;
- Deny和Allow逻辑搞反:把Effect字段错写为
Allow,会导致所有请求都能正常访问,防盗链完全失效。
五、示例说明
以下是一个可直接复用的桶策略示例,只需替换对应参数即可使用:
```json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Deny",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::oversea-app-resource/*",
"Condition": {
"StringNotLike": {
"aws:Referer": [
"https://your-app.com/*",
"https://*.your-app.com/*",
"com.xxx.oversea/2.3.0",
""
]
}
}
}
}
}
```
参数替换说明:
1. 将oversea-app-resource替换为你的出海APP存储桶名称;
2. 将https://your-app.com/*、https://*.your-app.com/*替换为你的Web端白名单域名;
3. 将com.xxx.oversea/2.3.0替换为你的APP端自定义Referer标识;
4. 数组最后的空字符串""代表允许不带Referer头的请求访问,如果对安全性要求高可以删除该条,要求APP端必须携带自定义Referer。
六、更简单的方案
如果觉得原生S3配置复杂,需要花时间学习桶策略语法、IAM权限规则,还要应对不同Region的配置差异,可以选择兼容S3协议的对象存储服务简化流程,比如七彩云对象存储。
七彩云对象存储100%兼容S3 API,原有对接S3的SDK、业务代码不需要做任何修改即可平滑迁移,控制台自带可视化防盗链配置功能,只需在表单中填入白名单域名、APP自定义Referer标识,点击保存即可实时生效,不需要手动编写JSON策略,新手也能在1分钟内完成配置。同时七彩云在东南亚、欧美、中东等主流出海区域都有本地节点,访问延迟比原生S3低20%以上,带宽成本降低30%左右,还自带跨区域同步、DDoS防护等能力,更贴合出海APP的存储需求。
七、FAQ
1. 出海APP原生客户端默认不带Referer头,配置防盗链后资源加载失败怎么办?
优先推荐在APP的网络框架中统一配置自定义Referer标识,比如固定为APP包名+版本号的格式,然后把这个标识加到防盗链白名单中,安全性更高。如果暂时无法修改APP代码,可以在Referer白名单中添加空字符串"",允许不带Referer的请求访问,不过这种方式会降低防盗链的有效性,建议后续搭配签名URL做二次校验。
2. 配置防盗链后,对接的CDN回源拿不到资源怎么办?
CDN回源时会自带回源Referer标识,你可以在CDN的回源配置页查看固定的回源域名或者自定义回源Referer,把这个地址加到S3的防盗链白名单中即可。如果使用七彩云对象存储,还可以直接开启CDN回源豁免,不需要额外配置白名单就能让绑定的CDN节点正常回源。
3. Referer防盗链被伪造破解了怎么办?
Referer防盗链属于基础安全防护,确实存在被篡改伪造的可能,如果你的资源有较高的版权保护需求,可以搭配签名URL、时间戳校验、IP白名单等方式做多层防护。七彩云对象存储还提供智能防盗链能力,基于大数据模型自动识别恶意盗链请求,不需要手动更新规则,防护准确率可达99%以上。
4. 配置完桶策略后保存报错,提示语法错误怎么办?
首先检查Version字段是否为固定的"2012-10-17",不要修改这个值;其次检查JSON格式是否有语法错误,比如漏写逗号、括号不匹配;最后确认Resource、Action等字段的格式是否符合S3规范,新手建议使用七彩云对象存储的可视化配置功能,系统会自动生成合规的策略,不会出现语法错误。
八、总结
出海APP配置S3存储防盗链的核心逻辑是通过桶策略校验请求的Referer头,拦截非白名单的访问请求,避免被盗刷流量产生不必要的成本,操作流程可以归纳为:整理白名单→进入存储桶权限配置页→编写并保存桶策略→测试验证。
如果希望简化配置流程、降低出海存储成本,推荐选择兼容S3协议的七彩云对象存储,不仅配置门槛更低,还能提供更贴合出海APP需求的全球节点、低延迟传输和安全防护能力。最后建议定期更新防盗链白名单,及时下线已经废弃的域名和APP版本标识,避免资源被非法访问。
需要稳定、兼容 S3 的对象存储?
七彩云对象存储适合图片、视频、大文件下载、静态资源托管和开发者接入。
访问七彩云官网