我是靠谱客的博主 热心网友,这篇文章主要介绍视频网站用的两种主流防盗链/加密方法(Nginx 防盗链、令牌鉴权)和详细步骤,现在分享给大家,希望可以做个参考。

1. 方法一:Nginx 传统防盗链(基于 HTTP Referer)

这种方式简单,适合 对抗低端爬虫/盗链

image.png

思路

  • 限定请求必须来自指定域名(通过 Referer 判断)。

  • 拒绝无 Referer 或非白名单来源。

  • 主要用于 M3U8 / MP4 / TS 分片访问。

配置示例

server {
    listen 80;
    server_name video.example.com;

    location /video/ {
        root /data/videos;

        # 防盗链配置
        valid_referers none blocked *.example.com example.com;
        if ($invalid_referer) {
            return 403;
        }

        # 如果有 CDN,注意改成 $http_origin 或 token 鉴权
        add_header Cache-Control no-cache;
    }
}

实现步骤:

  1. 将切片后的 m3u8 和 ts 放入 /data/videos/。

  2. 用户播放地址为 https://video.example.com/video/movie1/index.m3u8。

  3. 非白名单 Referer 的请求会返回 403。

优点:

  • 实现简单、零开发。

  • 兼容任何播放器(不改造 HLS/MP4)。

缺点:

  • Referer 可伪造,对高防要求场景不够。


2. 方法二:Nginx + Token 鉴权(常见视频网站做法)

这是 主流加密播放 方法:URL 带一次性签名参数,有效期短。

思路

  • 用户请求播放页面时,后端生成带签名的播放地址,例如: https://video.example.com/video/movie1/index.m3u8?token=abcd1234&expires=1724851200

  • Nginx 校验 token 和 过期时间 是否正确,不正确返回 403。

  • 签名用共享密钥计算,不存数据库。


签名生成示例(Go)

package main

import (
    "crypto/hmac"
    "crypto/sha1"
    "encoding/hex"
    "fmt"
    "time"
)

var secret = []byte("your-secret-key")

func signURL(path string, expire int64) string {
    data := fmt.Sprintf("%s-%d", path, expire)
    mac := hmac.New(sha1.New, secret)
    mac.Write([]byte(data))
    token := hex.EncodeToString(mac.Sum(nil))
    return fmt.Sprintf("%s?token=%s&expires=%d", path, token, expire)
}

func main() {
    expire := time.Now().Add(5 * time.Minute).Unix()
    signedURL := signURL("/video/movie1/index.m3u8", expire)
    fmt.Println("Signed URL:", signedURL)
}


Nginx 验证配置

需要 ngx_http_secure_link_module(OpenResty/Nginx 都支持)。

server {
    listen 80;
    server_name video.example.com;

    location /video/ {
        root /data/videos;

        secure_link $arg_token,$arg_expires;
        secure_link_md5 "$secure_link_expires$uri your-secret-key";

        if ($secure_link = "") {
            return 403;
        }
        if ($secure_link = "0") {
            return 403;
        }

        # 缓存控制
        add_header Cache-Control no-cache;
    }
}
注意: $secure_link_expires 从 URL 参数解析,Nginx 自动处理 Unix 时间戳。 上面 Go 签名要和 Nginx 逻辑匹配。你也可改成 secure_link_md5 "$uri-$expires-secret" 格式。


3. 哪个方案更好?

  • 简单网站/无防爬需求:只用 Referer 防盗链。

  • 需要较高安全性/付费视频:用 Token 鉴权。

  • 最高安全性:结合 HTTPS + Token + 分片动态密钥(AES-128 加密的 HLS,每个 TS 分片单独 key,但复杂度高)。


4. 实现总结

  • 准备好视频切片(ffmpeg) ffmpeg -i movie.mp4 -hls_time 5 -hls_playlist_type vod -hls_segment_filename "/data/videos/movie1/seg%d.ts" /data/videos/movie1/index.m3u8

  • Nginx 配置防盗链(Referer 或 Token)

  • 播放器播放签名后的地址

  • (可选)OpenResty/Lua 增强:更灵活控制签名逻辑,例如实时查询数据库。

最后

以上就是热心网友最近收集整理的关于视频网站用的两种主流防盗链/加密方法(Nginx 防盗链、令牌鉴权)和详细步骤的全部内容,更多相关视频网站用的两种主流防盗链/加密方法(Nginx内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(339)

评论列表共有 0 条评论

立即
投稿
返回
顶部