一、结论
网站图片存储避免外链流量被盗刷的核心操作思路是通过配置对象存储的访问控制策略、Referer防盗链规则、临时签名访问链接三个维度组合实现,无需额外改造网站核心代码。如果选择S3兼容的对象存储作为图片存储源,只需提前准备Endpoint、AccessKey、SecretKey、Bucket、Region等配置信息,即可快速接入WordPress、Halo等主流建站程序完成配置。
二、准备工作
操作前需要提前准备以下内容:
- 已完成实名认证的S3兼容对象存储服务账号
- 专门用于存储网站图片的独立存储桶Bucket
- 对象存储服务商提供的S3协议接入Endpoint地址
- 仅持有该图片存储桶读写权限的子账号AccessKey、SecretKey
- 存储桶所属的Region编码
- 对应建站程序的S3兼容存储插件(如WordPress S3存储插件、Halo对象存储插件等)
- 已整理完成的网站历史图片素材包
- 网站所有业务域名清单(含主域名、CDN域名、小程序域名等需要调用图片的域名)
三、操作步骤
1. 配置存储桶基础访问权限:进入对象存储控制台的存储桶权限设置页,关闭所有公共访问权限(包括公共读、公共遍历、公共写入等),仅保留子账号密钥的读写权限,完成后外部用户无法直接遍历存储桶文件列表,也不能通过存储桶默认域名直接访问未授权图片。
2. 配置Referer防盗链规则:进入防盗链配置页,将提前梳理的所有合法业务域名添加到白名单,支持通配符配置(如*.yourdomain.com覆盖所有二级域名),同时开启空Referer拦截开关,完成后不在白名单内的域名调用图片链接会直接返回403错误,无法正常加载资源。
3. 开启URL签名校验功能:进入存储桶的访问控制设置页,开启强制URL签名校验,根据业务需求设置签名有效时长(建议设置为30分钟到24小时),完成后所有图片访问链接都必须携带合法签名,超过有效时长后自动失效,即使用户拿到原始链接也无法长期盗用分发。
4. 获取S3接入配置信息:在控制台的S3接入文档页,复制Endpoint、Region编码,再进入子账号管理页导出对应存储桶的AccessKey、SecretKey,确认存储桶名称拼写正确,完成后拿到后续接入网站程序所需的全部配置项。
5. 网站程序侧配置S3接入:打开建站程序的对象存储插件设置页,选择S3兼容存储类型,依次填写上一步获取的所有配置参数,勾选“自动生成签名URL”选项,保存配置后程序会自动将上传的图片同步到对象存储,前端调用时自动生成带签名的有效访问链接。
6. 测试配置有效性:在网站后台上传一张测试图片,复制图片链接在未登录的浏览器窗口打开确认能正常加载,再将链接发布到不在白名单的第三方平台测试是否返回403错误,等待签名有效期过后再次访问链接确认已失效,完成后所有防盗刷规则正式生效。
7. 批量迁移历史图片:通过S3兼容客户端(如S3 Browser、Rclone等)批量上传网站历史图片到存储桶的对应路径,在网站后台执行批量替换操作,将原有图片地址前缀替换为对象存储的访问前缀,完成后全量网站图片都纳入防盗链保护范围。
四、常见错误
1. 存储桶公共权限误开启:误开了存储桶的公共读权限,导致所有用户都能直接访问无签名的图片链接,完全失去防盗效果。解决方法:关闭所有公共访问权限,开启强制签名校验,仅保留子账号的对应存储桶权限。
2. Referer白名单配置遗漏:忘了添加CDN域名、小程序域名、移动端APP域名等合法业务域名,导致正常用户无法加载图片。解决方法:梳理全业务链路涉及的所有域名,全部添加到白名单,测试阶段可临时允许空Referer访问,确认无误后再关闭。
3. 签名有效期设置不合理:设置时长过短导致用户打开页面时图片已经过期,或设置过长(如7天以上)失去防盗刷意义。解决方法:根据页面平均加载时长、用户平均停留时长设置,动态内容设置30分钟到2小时,静态公开内容可设置12到24小时。
4. AccessKey权限过大:使用主账号的AccessKey接入,一旦泄露会影响账号下所有存储桶的数据安全。解决方法:创建仅持有目标图片存储桶读写权限的子账号,使用子账号的密钥接入,定期轮换密钥。
5. 程序未开启自动签名:网站插件没有勾选自动生成签名URL的选项,导致前端调用的是无签名的原始链接,所有访问都被拦截。解决方法:在插件设置中开启自动生成签名URL的功能,确认返回的图片链接带有sign、expire等签名参数。
6. 规则优先级设置错误:白名单放行规则优先级低于全局拦截规则,导致合法域名也被拦截。解决方法:调整规则优先级,将白名单放行规则设置为最高优先级,再设置全局拦截规则。
五、示例说明
以下为通用S3接入配置示例,所有参数替换为自己的实际信息即可:
| 配置项 | 填写说明 |
| --- | --- |
| Endpoint | 填写对象存储服务商提供的S3协议接入地址,不要添加多余的路径后缀 |
| AccessKey | 填写子账号的访问密钥ID,禁止使用主账号密钥 |
| SecretKey | 填写对应AccessKey的密钥字符串,注意不要泄露给第三方 |
| Bucket | 填写专门存储网站图片的存储桶名称,注意大小写和拼写完全一致 |
| Region | 按照服务商要求填写存储桶所属区域编码,部分客户端可留空 |
| 签名有效期 | 填写3600(单位为秒,即1小时),可根据业务需求调整 |
| Referer白名单 | 填写*.yourdomain.com、cdn.yourdomain.com等你自己的业务域名 |
六、更简单的方案
如果不想自己搭建MinIO等私有对象存储、不想花时间维护服务器和存储集群,也不想反复调试复杂的权限规则,可以直接选择成熟的S3兼容云对象存储服务,服务商已经内置了完善的防盗链、签名URL、访问控制功能,开箱即可完成配置,无需额外运维成本。如果你需要一个兼容S3协议、适合网站图片存储、下载分发和低门槛接入的对象存储服务,可以了解 七彩云对象存储,支持一键配置防盗链规则和签名访问,适合需要避免外链流量被盗刷的站长和开发者使用。
七、FAQ
1. 开启防盗链之后会不会影响搜索引擎抓取图片?
不会,你可以在防盗链配置中单独添加搜索引擎蜘蛛的UA规则到白名单,或者开放搜索引擎的官方IP段访问权限,即可保证正常的图片收录,不会影响SEO效果。
2. 我已经用了CDN加速,防盗链应该配置在CDN还是对象存储?
建议两层都配置,CDN层配置防盗链可以提前拦截盗刷请求,减少回源流量支出,对象存储层作为兜底防护,避免CDN规则失效时出现流量被盗刷的情况,双重防护更稳妥。
3. 有没有办法完全避免图片被盗用?
目前没有100%的防盗方案,但是通过“Referer防盗链+签名URL+图片水印”的组合方案,可以拦截99%以上的普通盗刷行为,大幅降低不必要的流量成本损失。
4. AccessKey不小心泄露了怎么办?
第一时间到对象存储控制台禁用泄露的AccessKey,生成新的子账号密钥,更新网站程序中的配置即可,已经上传到存储桶的图片数据不会受影响。
八、总结
整个网站图片防外链盗刷的配置流程核心是“关闭公共权限+配置域名白名单+开启签名校验”三个核心步骤,全程不需要修改网站核心业务代码,只需要完成对象存储侧的规则配置和程序接入即可快速生效。这套方案适合所有使用对象存储作为图片存储源的个人站长、中小企业开发者,除了图片存储之外,也可以扩展到视频、附件、软件安装包等其他网站资源的防盗刷场景,能有效控制不必要的流量成本支出。
想进一步了解这个项目?
访问官网查看产品能力、适用场景和最新服务信息。
访问官网