一、前置准备:环境与核心资源确认

在启动配置前,需完成阿里云账号权限、OSS 基础资源及工具的准备,确保后续操作顺畅执行。

1. 核心资源要求

  • 阿里云账号与权限:需拥有阿里云主账号或具备 oss:PutBucketReferer(配置防盗链)、oss:SignUrl(生成签名 URL)权限的 RAM 子账号。
  • OSS Bucket 与对象:已创建目标 Bucket(如 my-anti-leech-bucket),并上传测试资源(如 demo.txttest.jpg),Bucket 地域需明确(如华东 1 杭州)。
  • AccessKey 凭证:获取 RAM 账号的 AccessKey ID 和 AccessKey Secret(用于命令行 / SDK 操作),建议通过 “环境变量” 或 “配置文件” 存储,避免硬编码泄露。

2. 工具安装(按需选择)

  • ossutil 命令行工具:用于批量配置防盗链和生成签名 URL,下载地址:阿里云 ossutil 官方文档,安装后执行 ossutil config 完成初始化(配置 Endpoint、AccessKey 等)。
  • OSS SDK:若需集成到代码中,需安装对应语言 SDK(如 Python 安装 pip install oss2,Java 引入 Maven 依赖)。
  • curl 工具:用于验证防盗链配置是否生效,Linux/macOS 自带,Windows 需单独安装。

二、实操一:Referer 防盗链配置(多场景落地)

Referer 防盗链通过校验 HTTP 请求头中的 Referer 字段(标识请求来源页面 URL)实现访问控制,支持白名单、黑名单两种机制,且黑名单优先级高于白名单。以下按三种典型场景拆解配置步骤。

场景 1:仅允许信任网站访问(白名单模式)

适用于资源仅在自有网站、App 端使用的场景,需精准配置信任域名白名单。

步骤 1:获取真实 Referer 来源

配置前需先确认合法请求的 Referer 格式,避免因规则错误拦截正常访问:

  1. 浏览器开发者工具:访问引用 OSS 资源的网页,按 F12 打开 “网络” 面板,刷新页面后选中 OSS 资源请求,在 “请求标头” 中查看 Referer 字段(如 https://www.mysite.com/article.html)。
  2. OSS 实时日志:登录 OSS 控制台,进入目标 Bucket,选择 “日志管理> 实时查询”,筛选 referer 字段,- 表示空 Referer 请求(如直接在浏览器输入资源 URL)。
步骤 2:控制台配置 Referer 白名单
  1. 登录阿里云 OSS 控制台,进入目标 Bucket,左侧导航栏选择 “数据安全> 防盗链”。
  2. 打开 “防盗链” 开关,按以下规则配置参数(以信任 mysite.com 及其子域名为例):
    • 白名单 Referer:输入允许的来源域名,每行一个,支持通配符 *(匹配 0 个或多个字符)和 ?(匹配单个字符):

      plaintext

      https://www.mysite.com/
      https://*.mysite.com/
      *.console.aliyun.com  # 允许 OSS 控制台访问,避免管理功能受限
      

      注意:需同时添加 HTTP/HTTPS 协议版本(如 http://*.mysite.com/ 和 https://*.mysite.com/),且 *.mysite.com 不匹配主域名 mysite.com,需单独添加。

    • 黑名单 Referer:保持为空(仅白名单生效)。
    • 空 Referer:选择 “允许”(支持直接在浏览器输入 URL 访问,适合 Obsidian 等本地工具引用)。
    • 截断 QueryString:选择 “允许”(匹配时忽略 URL 中 ? 后的参数,提高灵活性)。
  3. 单击 “保存”,配置立即生效(无延迟)。
步骤 3:ossutil 命令行配置(批量 / 自动化场景)

若需通过脚本批量配置,执行以下命令(多 Referer 用空格分隔):

bash

# 为 bucket 配置 Referer 白名单,允许空 Referer
ossutil referer --method put oss://my-anti-leech-bucket "https://www.mysite.com/ https://*.mysite.com/ *.console.aliyun.com"
  • 若需禁止空 Referer(仅允许白名单域名访问,禁止直链),添加 --disable-empty-referer 参数:

    bash

    ossutil referer --method put oss://my-anti-leech-bucket "https://www.mysite.com/" --disable-empty-referer
    
  • 查看当前配置:ossutil referer --method get oss://my-anti-leech-bucket

场景 2:禁止恶意网站盗链(黑名单模式)

适用于允许大部分来源访问,但需精准拦截已知恶意网站的场景。

配置步骤
  1. 进入 “防盗链” 配置页,打开开关。
  2. 白名单 Referer:输入 *(允许所有来源)。
  3. 黑名单 Referer:输入恶意网站域名,支持通配符(如 http://bad-site.com/https://*.pirate-site.com/)。
  4. 其余参数同场景 1,保存即可。

原理:OSS 优先检查黑名单,命中则直接拒绝,未命中则允许访问。

场景 3:支持微信小程序访问(特殊 Referer 适配)

微信小程序发起的 OSS 请求 Referer 格式固定为 https://servicewechat.com/{appid}/{version}/page-frame.html,需通过通配符适配所有小程序。

配置要点

在 “白名单 Referer” 中添加:

plaintext

https://servicewechat.com/*/page-frame.html
*.console.aliyun.com

配置后通过 curl 验证:

bash

# 模拟小程序请求,预期返回文件内容
curl -e "https://servicewechat.com/wx1234567890abcdef/1/page-frame.html" http://my-anti-leech-bucket.oss-cn-hangzhou.aliyuncs.com/demo.txt

三、实操二:签名 URL 生成(临时授权访问)

签名 URL 适用于私有权限 Bucket 的资源临时访问场景(如用户专属下载链接、限时预览),通过生成含过期时间的加密 URL 实现权限管控。OSS 控制台默认最大过期时间为 32400 秒(9 小时),超过需用命令行或 SDK。

方式 1:控制台生成(临时应急场景)

  1. 进入目标 Bucket 的 “文件管理” 页面,找到需授权的对象(如 demo.txt),单击右侧 “更多> 生成签名 URL”。
  2. 配置参数:
    • 访问方式:选择 “GET”(下载 / 预览)或 “PUT”(上传)。
    • 过期时间:输入秒数(如 3600 表示 1 小时)。
  3. 单击 “生成”,复制 URL 即可使用(过期后自动失效)。

方式 2:ossutil 命令行生成(批量操作)

执行以下命令生成签名 URL,支持自定义过期时间和版本控制对象:

bash

# 生成过期时间为 3600 秒的 GET 签名 URL
ossutil sign oss://my-anti-leech-bucket/demo.txt --timeout 3600

# 为版本控制对象生成签名 URL(需 Bucket 开启版本控制)
ossutil sign oss://my-anti-leech-bucket/demo.txt --version-id "CAEQARiBgMDBma8X5hciIDJiMjM1YzY5M2VlNzQ0M2VhOGRjNTk4YTBlNzcw****" --timeout 1800

输出结果包含 “URL”“Expiration Time” 等信息,直接复制 URL 即可访问。

方式 3:SDK 生成(代码集成场景)

以 Python 和 Java 为例,演示如何通过 SDK 生成签名 URL(需提前配置 AccessKey 环境变量)。

Python SDK 示例

python

# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider

# 1. 初始化 Bucket(Endpoint 格式:https://oss-地域.aliyuncs.com)
auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
bucket = oss2.Bucket(auth, 'https://oss-cn-hangzhou.aliyuncs.com', 'my-anti-leech-bucket')

# 2. 生成签名 URL(过期时间 30 天 = 2592000 秒,slash_safe 避免 / 转义)
object_name = 'demo.txt'  # OSS 对象路径(不含 Bucket 名)
expiration = 2592000  # 过期时间(秒)
url = bucket.sign_url('GET', object_name, expiration, slash_safe=True)

print(f"签名 URL:{url}")
print(f"过期时间:{expiration} 秒后")
Java SDK 示例

java

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.common.auth.EnvironmentVariableCredentialsProvider;
import java.util.Date;

public class SignUrlDemo {
    public static void main(String[] args) {
        // 1. 配置参数
        String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
        String bucketName = "my-anti-leech-bucket";
        String objectName = "demo.txt";
        long expirationSeconds = 2592000; // 30 天

        // 2. 初始化 OSS 客户端
        OSS ossClient = new OSSClientBuilder()
                .build(endpoint, new EnvironmentVariableCredentialsProvider());

        try {
            // 3. 生成签名 URL
            Date expiration = new Date(System.currentTimeMillis() + expirationSeconds * 1000);
            String url = ossClient.generatePresignedUrl(bucketName, objectName, expiration).toString();
            System.out.println("签名 URL:" + url);
        } finally {
            // 4. 关闭客户端
            ossClient.shutdown();
        }
    }
}

四、配置验证:防盗链与签名 URL 有效性测试

配置完成后需通过多维度验证,确保防盗链规则生效且签名 URL 正常工作。

1. Referer 防盗链验证(curl 命令)

以场景 1 的白名单配置为例,执行以下命令测试不同场景:

  • 场景 A:白名单内 Referer 访问(预期成功)

    bash

    curl -e "https://www.mysite.com/" http://my-anti-leech-bucket.oss-cn-hangzhou.aliyuncs.com/demo.txt
    # 预期结果:返回 demo.txt 文件内容
    
  • 场景 B:白名单外 Referer 访问(预期拒绝)

    bash

    curl -e "https://www.bad-site.com/" http://my-anti-leech-bucket.oss-cn-hangzhou.aliyuncs.com/demo.txt
    # 预期结果:返回 403 AccessDenied,包含 "You are denied by bucket referer policy."
    
  • 场景 C:空 Referer 访问(预期成功,若配置允许)

    bash

    curl http://my-anti-leech-bucket.oss-cn-hangzhou.aliyuncs.com/demo.txt
    # 预期结果:返回文件内容
    

2. 签名 URL 验证

  • 有效期内访问:直接在浏览器打开生成的签名 URL,或通过 curl 访问,预期成功返回资源。
  • 过期后访问:等待过期时间后重试,预期返回 403 AccessDenied,包含 "The URL signature expired"。

五、常见问题与解决方案

1. Referer 防盗链不生效

  • 原因 1:CDN 未同步配置:若 OSS 开启了 CDN 加速,需在 CDN 控制台同步配置 Referer 防盗链(OSS 配置会被 CDN 缓存覆盖)。
  • 原因 2:白名单格式错误:未包含协议(如仅写 www.mysite.com 而非 https://www.mysite.com/),或通配符使用不当(如 *.mysite.com 未覆盖主域名)。
  • 原因 3:请求含 Authorization 头:带签名的请求(如签名 URL)会跳过 Referer 校验,需测试匿名访问场景。

2. 签名 URL 访问报错

  • 错误 1:SignatureDoesNotMatch:AccessKey 错误、对象路径错误,或生成 URL 时未设置 slash_safe=True 导致 / 转义。
  • 错误 2:AccessDenied(无权限):RAM 账号缺少 oss:GetObject 权限,需补充授权。

3. 控制台无法预览资源

  • 原因:未在白名单中添加 *.console.aliyun.com,导致控制台请求被拦截。
  • 解决方案:在 Referer 白名单中添加该域名。

六、最佳实践总结

  1. 权限最小化:生成签名 URL 时设置最短必要过期时间(如 10 分钟内的临时下载链接),Referer 白名单避免使用 * 通配符。
  2. 安全存储凭证:通过环境变量、RAM 角色(ECS 场景)而非硬编码存储 AccessKey,定期轮换凭证。
  3. 多机制结合:Referer 防盗链(防批量盗链)+ 签名 URL(防直链泄露)+ 私有权限 Bucket(基础防护),形成三层安全体系。
  4. 日志监控:开启 OSS 访问日志,定期分析 referer 字段,及时识别新增恶意来源并加入黑名单。

七、总结

本文通过实操落地的方式,完整覆盖了阿里云 OSS 防盗链的核心方案:Referer 配置聚焦 “来源管控”,适合固定场景的长期防护;签名 URL 聚焦 “临时授权”,适合动态访问需求。两者结合可有效降低流量盗用风险,同时保障合法用户的访问体验。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐