一、为什么传统防盗链手段不够用?
valid_referers
指令实现:location ~* \.(gif|jpg)$ {
valid_referers none blocked *.ruandao.com.cn;
if ($invalid_referer) {
return 403;
}
}
http://
)二、secure_link模块:安全防护新思路
ngx_http_secure_link_module
模块(0.7.18+)提供了基于加密签名和时效验证的解决方案location /images/ {
# 启用安全链接验证
secure_link $arg_token,$arg_exp;
secure_link_md5 "$secure_link_expires$uri test#token";
# 验证结果
if ($secure_link = "") {
return 403; #无效令牌
}
if ($secure_link = "0") {
return 410; #已过期
}
# 关闭目录列表功能
autoindex off;
# 缓存头设置
expires 30d;
add_header Cache-Control "public";
}
三、安全链接生成
/*** 生成安全链接
* @param baseUrl 基础URL.如<a href="https://ruandao.com.cn">https://ruandao.com.cn</a>,不能包含路径。
* @param path 路径.如/images/logo.png
* @param key 加密密钥。需要与Nginx的key一致
* @param expires 有效时长,单位为秒
* @return 完整的安全链接URL
*/
public static String generate( String baseUrl, String path, String key, long expires) {
try {
// 过期时间戳
long expiry = Instant.now().getEpochSecond() + expires;
// 构建签名字符串(格式必须与Nginx配置一致)
String signData = expiry + path + " " + key;
// 计算 MD5
byte[] raw = MessageDigest.getInstance("MD5").digest(signData.getBytes(StandardCharsets.UTF_8));
// BASE64编码并做URL安全处理
String token = Base64.getUrlEncoder().withoutPadding().encodeToString(raw);
return baseUrl + path + "?token=" + token + "&exp=" + expiry;
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException("安全链接生成失败",e);
}
}
四、实际应用场景
1. 下载加速服务
为付费用户生成30分钟有效的高清资源下载链接,过期自动失效
2. 视频点播保护
对HLS视频流m3u8文件和ts分片进行签名验证,防止非法抓取
3. 敏感文档访问
对财务报告、合同文档等敏感资源设置精确到秒的访问窗口
五、与传统方案对比
防护维度 | Referer方案 | secure_link |
---|---|---|
结语
secure_link模块为Nginx提供了企业级的资源保护能力,通过密码学签名和时效控制的双重保障,彻底解决了传统防盗链方案的短板。无论是防止热门资源被盗用,还是保护核心业务接口,secure_link都能提供可靠的安全保障。

优网科技秉承"专业团队、品质服务" 的经营理念,诚信务实的服务了近万家客户,成为众多世界500强、集团和上市公司的长期合作伙伴!
优网科技成立于2001年,擅长网站建设、网站与各类业务系统深度整合,致力于提供完善的企业互联网解决方案。优网科技提供PC端网站建设(品牌展示型、官方门户型、营销商务型、电子商务型、信息门户型、微信小程序定制开发、移动端应用(手机站、APP开发)、微信定制开发(微信官网、微信商城、企业微信)等一系列互联网应用服务。