如何限制Azure Blob资源仅允许特定Referer域名访问
Azure Blob 存储防盗链配置指南(仅自有域名可访问资源)
Referer白名单方案可以拦截90%以上的普通直链盗链、社交平台直接分享链接访问的场景,配置成本最低;如果需要防恶意伪造Referer的爬取,再叠加SAS签名方案即可。
前置注意事项
不要把Blob容器设为全公共匿名访问,同时要在存储账户防火墙中配置为仅允许你绑定的CDN服务实例访问,禁止公网直接直连Blob原始存储端点,否则盗链者绕开CDN直接访问源站地址,所有防盗链规则都会失效。
方案一:Azure CDN 规则引擎配置(推荐,适配你当前CDN使用场景)
你当前已经把Blob作为CDN源站使用,直接在CDN层做Referer拦截是最简便、生效最快的方案:
- 登录Azure门户,进入你绑定Blob存储作为源站的CDN配置页面
- 找到规则配置入口:微软标准版CDN叫「标准规则集」,Akamai/Verizon版CDN叫「规则引擎」,新建一条优先级最高(序号最小)的规则
- 配置请求匹配条件:
- 第一个条件选
Referer字段,匹配逻辑设为「不包含以下值」,值列表填入你的业务域名,必须带协议前缀,比如https://www.yourdomain.com、https://yourdomain.com,本地调试需要的话可以额外加http://localhost - 第二个条件选
Referer字段,匹配逻辑设为「为空」,用来拦截直接在地址栏输入资源链接、部分无Referer跳转的访问场景 - 两个条件的匹配逻辑设为「满足任意一个即触发操作」
- 第一个条件选
- 配置触发后的执行动作:选择「拒绝请求」,返回403状态码即可,不需要额外返回内容
- 保存规则,等待CDN全网节点生效,一般最长等待10分钟即可
方案二:无CDN场景下的原生配置(不推荐,灵活性差)
如果你没有在Blob前面套CDN,直接暴露Blob端点对外提供服务,需要两步配置才能实现基础拦截:
- 进入存储账户的「CORS 资源共享」配置页,针对Blob服务新增跨域规则:
- 允许的源:仅填写你的业务域名,禁止填
*通配符 - 允许的方法:仅勾选GET、HEAD(只读资源不需要其他方法权限)
- 允许的请求标头、暴露的响应标头可填
*,缓存有效期按需设置为3600秒即可
- 允许的源:仅填写你的业务域名,禁止填
- 注意:单独配置CORS只能拦截浏览器的跨域调用,无法拦截直接地址访问,你需要额外在存储账户前绑定Azure Front Door服务,通过Front Door的规则集做Referer白名单判断,逻辑和上文CDN规则配置一致。
增强安全方案:SAS令牌动态签名(防Referer伪造)
Referer字段本身可以被恶意工具伪造,如果你的资源敏感度较高,建议叠加SAS签名鉴权:
- 将Blob容器的访问级别改为「私有(无匿名访问)」,彻底禁止公网无权限访问源站
- 业务服务端在渲染页面时,动态生成带时效的SAS签名拼接在资源URL后,签名仅授予读权限、设置较短的有效期(比如2小时),可按需限制可访问的IP范围
- 就算资源链接被泄露,签名过期后URL会自动失效,无法继续访问
配置后有效性验证
配置完成后必须做以下校验,避免规则误拦截自身业务:
- 正常访问你的业务站点,打开F12开发者工具看图片、音频等Blob资源的请求状态,返回200即为正常
- 直接把资源链接复制到浏览器地址栏打开,返回403即为拦截生效
- 用命令行模拟空Referer请求测试:
curl -I 你的资源URL,确认返回403 - 模拟其他域名Referer请求测试:
curl -I -e "https://third-party.com" 你的资源URL,确认返回403
内容的提问来源于stack exchange,提问作者Pawel
相关产品推荐
相关产品推荐

