配置Referer黑白名单来避免非法流量盗用

当网站图片、视频等资源被其他网站非法盗用时,会产生额外的公网流出流量费用。通过为OSS Bucket配置Referer防盗链,可建立访问白名单或黑名单机制,有效控制资源访问来源,防止资源盗用,降低不必要的流量成本。

工作原理

当浏览器向OSS请求文件时,HTTP请求的Referer标头会标识发起请求的源页面URL。OSS通过校验Referer值来判断请求来源的合法性,基于预设规则允许或拒绝访问。

配置防盗链后,OSS将按照以下优先级顺序执行访问控制判断:

  1. Referer检查

    • OSS首先判断请求的Referer字段是否为空。

    • 如果为空

      • 如果配置了允许Referer,请求将通过

      • 如果配置了不允许Referer,则会进入一个特殊判断:只有当白名单也为空时,请求才会被允许;否则,请求将被拒绝

  2. 黑名单检查

    • 对于Referer不为空的请求,OSS会检查黑名单。

    • 如果请求的Referer匹配到黑名单中的任何一项,请求将立即被拒绝,后续的白名单检查不再进行。

  3. 白名单检查

    • 如果请求的Referer不为空,且没有命中黑名单,OSS会最后检查白名单。

    • 如果请求的Referer能匹配到白名单中的某一项,请求将通过

    • 如果遍历完整个白名单都无法匹配,请求将被拒绝

仅允许受信任的网站访问

通过白名单机制仅允许受信任的网站访问OSS资源,同时支持用户直接通过浏览器访问资源,并确保OSS控制台功能正常工作。

步骤一:获取请求的Referer

配置防盗链规则前,需准确获取访问OSS资源的请求来源Referer,确保规则配置的准确性。

  • 通过OSS实时日志查询

    1. 登录OSS管理控制台

    2. 在左侧导航栏,单击Bucket 列表,然后单击目标Bucket名称。

    3. 在左侧导航栏,选择日志管理 > 实时查询

    4. 在日志记录中查找referer字段,该字段即为请求的Referer值。若该字段显示为-,表示这是空Referer请求。

  • 通过浏览器开发者工具查看

    1. 使用Chrome等现代浏览器访问引用了OSS资源的网页。

    2. F12键打开开发者工具,切换到网络(Network)面板。

    3. 刷新页面,找到对OSS资源的请求记录。

    4. 选中该请求,在右侧的标头(Headers)区域中查找Referer字段的值。

步骤二:配置防盗链规则

  1. 登录OSS管理控制台

  2. 在左侧导航栏,单击Bucket 列表,然后单击目标Bucket名称。

  3. 在左侧导航栏,选择数据安全 > 防盗链

  4. 打开防盗链开关,并按以下说明配置:

    • 白名单 Referer:输入允许访问的域名,每个域名占一行。由于用户可能通过HTTPHTTPS协议访问网站,建议同时添加两种协议版本。同时添加OSS控制台域名以确保管理功能正常使用。

      https://www.aliyun.com
      http://www.aliyun.com
      *.console.aliyun.com

      Referer规则支持通配符星号(*)和问号(?)。例如*.aliyun.com可匹配所有aliyun.com的子域名。

    • 黑名单 Referer:保持为空。当黑白名单同时存在时,黑名单具有更高优先级。

    • 空 Referer:选择允许。此配置确保用户可直接在浏览器地址栏输入文件URL进行访问,或从某些不发送Referer的客户端(如桌面应用)正常访问资源。

    • 截断 QueryString:选择允许(默认)。OSS在匹配Referer时将忽略URL中的查询字符串(即?之后的部分),提高匹配的灵活性。

  5. 单击保存

步骤三:验证配置是否生效

使用curl命令模拟不同来源的请求,验证防盗链配置是否按预期工作。

  • 模拟白名单内的Referer访问(预期成功)

    curl -e "http://www.aliyun.com" http://your-bucket-name.oss-cn-hangzhou.aliyuncs.com/demo.txt

    预期结果:成功返回demo.txt文件的内容。

  • 模拟白名单外的Referer访问(预期被拒绝)

    curl -e "http://www.other-site.com" http://your-bucket-name.oss-cn-hangzhou.aliyuncs.com/demo.txt

    预期结果:返回包含AccessDeniedYou are denied by bucket referer policy.的错误信息。

  • 模拟空Referer访问(预期成功)

    curl http://your-bucket-name.oss-cn-hangzhou.aliyuncs.com/demo.txt

    预期结果:成功返回文件内容,因为配置允许空Referer。

禁止特定恶意网站盗用

适用于需要允许大部分来源访问,但明确禁止某些恶意网站盗用资源的场景。通过黑名单机制精准拦截恶意来源,同时保持对其他合法来源的开放访问。

步骤一:获取恶意网站的Referer

配置防盗链规则前,需准确识别恶意网站的Referer值。建议通过OSS实时日志查询分析异常流量,识别盗用资源的来源。

  1. 登录OSS管理控制台

  2. 在左侧导航栏,单击Bucket 列表,然后单击目标Bucket名称。

  3. 在左侧导航栏,选择日志管理 > 实时查询

  4. 筛选异常流量记录,查看referer字段,识别恶意网站域名pattern。

步骤二:配置防盗链规则

  1. 登录OSS管理控制台

  2. 在左侧导航栏,单击Bucket 列表,然后单击目标Bucket名称。

  3. 在左侧导航栏,选择数据安全 > 防盗链

  4. 打开防盗链开关,并按以下说明配置:

    • 白名单 Referer:输入通配符*表示允许所有来源访问。

      *
    • 黑名单 Referer:输入需要禁止的恶意网站域名,每行一个。

      *bad-site.com
      http://malicious-site.net
      https://malicious-site.net

      使用通配符可有效禁止整个域名及其子域名的访问。

    • 空 Referer:选择允许。确保直接访问和来自不发送Referer的正常客户端能正常访问。

    • 截断 QueryString:选择允许(默认)。OSS在匹配Referer时将忽略URL中的查询字符串(即?之后的部分),提高匹配的灵活性。

  5. 单击保存

步骤三:验证配置是否生效

  • 模拟正常网站的请求(预期成功)

    curl -e "http://www.normal-site.com" http://your-bucket-name.oss-cn-hangzhou.aliyuncs.com/demo.txt

    预期结果:成功返回文件内容。

  • 模拟黑名单内网站的请求(预期被拒绝)

    curl -e "http://bad-site.com" http://your-bucket-name.oss-cn-hangzhou.aliyuncs.com/demo.txt

    预期结果:返回AccessDenied错误信息。

  • 模拟空Referer访问(预期成功)

    curl http://your-bucket-name.oss-cn-hangzhou.aliyuncs.com/demo.txt

    预期结果:成功返回文件内容。

支持微信小程序访问

OSS资源需要在微信小程序中使用时,需要针对微信小程序特定的Referer格式进行配置。微信小程序发起的请求Referer固定为https://servicewechat.com/{appid}/{version}/page-frame.html格式。

步骤一:了解微信小程序Referer格式

微信小程序的Referer格式固定且规律,无需特别获取,可直接使用通配符配置。如需确认具体格式,可通过以下方式验证:

  1. 在小程序中访问OSS资源

  2. 通过OSS实时日志查询确认Referer格式

  3. 在日志中查看referer字段,应显示类似https://servicewechat.com/wx1234567890abcdef/1/page-frame.html的格式

步骤二:配置防盗链规则

  1. 登录OSS管理控制台

  2. 在左侧导航栏,单击Bucket 列表,然后单击目标Bucket名称。

  3. 在左侧导航栏,选择数据安全 > 防盗链

  4. 打开防盗链开关,并按以下说明配置:

    • 白名单 Referer:输入微信小程序的通配符规则和OSS控制台域名。

      *servicewechat.com
      *.console.aliyun.com

      使用通配符可兼容所有微信小程序的appid和版本号,简化配置管理。同时添加控制台域名确保管理功能正常。

    • 黑名单 Referer:保持为空。

    • 空 Referer:选择允许。某些情况下小程序可能不发送Referer,允许空Referer可确保兼容性。

    • 截断 QueryString:选择允许(默认)。OSS在匹配Referer时将忽略URL中的查询字符串(即?之后的部分),提高匹配的灵活性。

  5. 单击保存

步骤三:验证配置是否生效

  • 模拟微信小程序的请求(预期成功)

    curl -e "https://servicewechat.com/wx1234567890abcdef/1/page-frame.html" http://your-bucket-name.oss-cn-hangzhou.aliyuncs.com/demo.txt

    预期结果:成功返回文件内容。

  • 模拟其他来源的请求(预期被拒绝)

    curl -e "http://www.other-site.com" http://your-bucket-name.oss-cn-hangzhou.aliyuncs.com/demo.txt

    预期结果:返回AccessDenied错误信息。

  • 模拟空Referer访问(预期成功)

    curl http://your-bucket-name.oss-cn-hangzhou.aliyuncs.com/demo.txt

    预期结果:成功返回文件内容。

允许OSS控制台预览和下载

设置防盗链后,为了允许通过OSS控制台下载、预览OSS文件,您需要在白名单Referer中添加一条*.console.aliyun.com,以确保来自OSS控制台的请求不会被Referer防盗链策略所阻止。

步骤一:配置防盗链规则

  1. 登录OSS管理控制台

  2. 在左侧导航栏,单击Bucket 列表,然后单击目标Bucket名称。

  3. 在左侧导航栏,选择数据安全 > 防盗链

  4. 打开防盗链开关,并按以下说明配置:

    • 白名单 Referer:OSS控制台域名。

      *.console.aliyun.com

      使用通配符*.console.aliyun.com可兼容所有OSS控制台的子域名,确保在不同区域或版本的控制台中都能正常预览。

    • 黑名单 Referer:保持为空。

    • 空 Referer:选择允许。确保直接访问和控制台预览功能都能正常工作。

    • 截断 QueryString:选择允许(默认)。OSS在匹配Referer时将忽略URL中的查询字符串(即?之后的部分),提高匹配的灵活性。

  5. 单击保存

步骤二:验证配置是否生效

  • 模拟控制台访问(预期成功)

    curl -e "https://oss.console.aliyun.com" http://your-bucket-name.oss-cn-hangzhou.aliyuncs.com/demo.txt

    预期结果:成功返回文件内容。

  • 验证控制台预览和下载(预期成功)

    1. 登录OSS控制台

    2. 导航到目标Bucket

    3. 尝试预览和下载文件

禁止通过URL直接访问

适用于需要强制所有访问都必须来自指定网站页面的场景,通过禁止空Referer有效阻止用户直接通过URL访问资源,增强资源访问控制的严格性。

注意事项

  • 此配置会阻止所有直接访问方式,包括从书签、邮件链接等途径的访问

  • 某些浏览器插件或下载工具可能无法正常工作

  • 视频播放等媒体应用可能受到影响,因为媒体请求通常不包含Referer

步骤一:确定网站的Referer

确定业务网站的所有可能域名和协议组合,确保配置覆盖所有合法访问场景:

  1. 通过浏览器开发者工具确认网站访问OSS资源时的实际Referer

  2. 考虑所有可能的域名变体(www前缀、不带www、不同子域名)

  3. 确认HTTPHTTPS协议的支持情况

步骤二:配置防盗链规则

  1. 登录OSS管理控制台

  2. 在左侧导航栏,单击Bucket 列表,然后单击目标Bucket名称。

  3. 在左侧导航栏,选择数据安全 > 防盗链

  4. 打开防盗链开关,并按以下说明配置:

    • 白名单 Referer:包含业务网站的域名和OSS控制台域名。

      https://www.example.com
      http://www.example.com
      *.console.aliyun.com

      根据实际情况添加所有需要支持的域名和协议组合。添加控制台域名确保管理功能正常。

    • 黑名单 Referer:保持为空。

    • 空 Referer:选择不允许。这是关键配置,不允许空Referer可有效阻止通过地址栏直接访问资源。

    • 截断 QueryString:选择允许(默认)。OSS在匹配Referer时将忽略URL中的查询字符串(即?之后的部分),提高匹配的灵活性。

  5. 单击保存

步骤三:验证配置是否生效

  • 模拟网站页面的请求(预期成功)

    curl -e "http://www.example.com" http://your-bucket-name.oss-cn-hangzhou.aliyuncs.com/demo.txt

    预期结果:成功返回文件内容。

  • 模拟直接访问(预期被拒绝)

    curl http://your-bucket-name.oss-cn-hangzhou.aliyuncs.com/demo.txt

    预期结果:返回AccessDenied错误信息,说明直接访问被成功阻止。

  • 模拟其他网站的请求(预期被拒绝)

    curl -e "http://www.other-site.com" http://your-bucket-name.oss-cn-hangzhou.aliyuncs.com/demo.txt

    预期结果:返回AccessDenied错误信息。

应用于生产

  • CDN缓存绕过风险:当OSS资源配置了CDN加速时,盗链请求可能直接命中CDN边缘节点缓存并获得服务,从而绕过OSS的防盗链验证。为确保防护体系完整有效,必须在CDN层面配置相同的Referer防盗链规则,实现多层防护。

  • 浏览器Referrer-Policy策略影响:现代浏览器支持Referrer-Policy标头,允许网站控制跨域请求中发送Referer的详细程度。某些策略(如no-referrer)会导致浏览器不发送Referer信息,这类请求将被OSS视为"空Referer"处理,需要在配置时予以考虑。

  • 视频播放兼容性:使用浏览器原生video标签播放在线视频文件时,浏览器通常发起两种请求:带Referer的初始页面加载请求和用于获取媒体数据的空Referer请求。为确保视频播放功能正常,必须允许空Referer访问

Referer配置规范

在配置白名单Referer或黑名单Referer时,需要遵循以下规范:

规范

说明

匹配Referer时,不忽略URLScheme

配置为http://www.aliyun.com,可匹配http://www.aliyun.com/123http://www.aliyun.com.cn等以http://www.aliyun.com为前缀的地址,但不能匹配https://www.aliyun.com/123https://www.aliyun.com.cnwww.aliyun.com

Referer支持通配符星号(*)表示使用星号代替0个或多个字符

  • 配置为*,可匹配所有域名和IP地址。

  • 配置为*www.example.com,可匹配http://www.example.comhttps://www.example.comwww.example.com

  • 配置为*.example.com,可匹配http://help.example.comhttps://help.example.comhttp://www.example.comhttps://www.example.com

Referer支持通配符问号(?)表示使用问号代替一个字符

配置为http://www.aliyun?.com,可匹配http://www.aliyunc.com

Referer支持带端口的域名或IP地址

配置为http://www.example.com:808010.10.10.10:8080

QueryString解析规则

如果设置不允许截断QueryString,OSS将按照以下规则解析QueryString:

规则

说明

不解码QueryString

在请求URLhttp://www.example.com/?job_id=task$01时,如果白名单Referer或者黑名单Referer设置为http://www.example.com/?job_id=task%2401,则判断结果为请求URL不匹配白名单Referer或者黑名单Referer。

忽略QueryString中的参数大小写

在请求URLhttp://www.examplecom/?ACTION=NOP时,如果白名单Referer或者黑名单Referer设置为http://www.example.com/?action=nop,则判断结果为请求URL匹配白名单Referer或者黑名单Referer。

不解析QueryString中的参数

在请求URLhttp://example.com/?b=c&a=b时,如果白名单Referer或者黑名单Referer设置为http://example.com/?a=b&b=c,则判断结果为请求URL不匹配白名单Referer或者黑名单Referer。

配额与限制

  • 触发条件:仅当通过匿名访问签名URL方式访问Object时,OSS才执行防盗链验证。使用AccessKey等签名方式的API调用(即请求包含Authorization标头)不受防盗链规则限制。

  • 名单大小限制:Referer白名单和黑名单的总数据大小不能超过20 KB。超出此限制时,保存配置会返回InlineDataTooLarge错误。

  • 格式规范:支持通配符星号(*)和问号(?)进行模式匹配。匹配时包含协议名称,支持带端口号的域名或IP地址格式。

  • 生效范围:防盗链规则在Bucket级别生效,无法为Bucket内的特定文件或目录单独配置不同规则。

常见问题

配置防盗链后为何未生效?

请按以下顺序排查:

  • 浏览器环境检查:某些特定浏览器环境(如微信小程序、iframe等)可能修改或设定特定的Referer值。通过OSS实时日志或浏览器开发者工具查询请求的实际Referer值,然后重新配置防盗链规则。

  • Referer格式规范:确认填写的Referer是否规范。来自浏览器的请求通常带有http://或https://协议前缀,如果配置时遗漏协议部分,则无法正确匹配请求。请按照OSSReferer配置规范填写。

  • CDN缓存绕过:如果使用CDN加速OSS且未在CDN配置防盗链,可能导致通过CDN访问时绕过验证。例如,首次CDN请求带正确Referer并缓存文件后,后续即使请求不带Referer,CDN也会响应缓存文件。请在CDN上配置与OSS一致的防盗链规则。

微信小程序中访问OSS资源提示拒绝访问如何解决?

微信小程序发起的请求具有固定的Referer格式,通常为https://servicewechat.com/开头。在防盗链白名单中添加*servicewechat.com规则即可兼容所有小程序的访问需求。

浏览器地址栏直接访问文件提示拒绝访问如何解决?

直接在浏览器地址栏访问属于空Referer请求。如果防盗链配置为不允许空Referer,此类访问会被拒绝。若需支持直接访问,请将防盗链配置中的空 Referer选项修改为允许

保存配置时出现InlineDataTooLarge错误如何处理?

此错误表示配置的Referer名单(白名单和黑名单合计)总大小超过了20 KB限制。建议使用通配符合并多条相似规则,或删除不必要的规则条目以减小配置大小。