
本文介绍如何在不依赖复杂drm系统的情况下,利用hls或dash的clear key方案对mp4视频进行服务端加密,并结合php动态授权机制,确保视频仅能在指定html5播放器(如video.js)中正常播放,有效防止直接url访问和下载。
本文介绍如何在不依赖复杂drm系统的情况下,利用hls或dash的clear key方案对mp4视频进行服务端加密,并结合php动态授权机制,确保视频仅能在指定html5播放器(如video.js)中正常播放,有效防止直接url访问和下载。
在Web视频分发场景中,单纯通过PHP输出原始MP4文件(如您当前的fopen+Range请求处理逻辑)虽支持流式播放,但存在明显安全隐患:只要用户获取到PHP脚本的URL(例如 video.php?id=123),即可直接在浏览器中打开、另存为或用下载工具抓取完整视频。真正的保护目标不是“完全不可破解”——这在客户端渲染场景下本质上无法实现——而是显著提高盗链与批量下载门槛,使普通用户无法一键获取可播放的原始文件。
推荐采用基于HTTP Live Streaming(HLS)或Dynamic Adaptive Streaming over HTTP(DASH)的Clear Key加密方案,它兼顾安全性、兼容性与开发成本:
✅ 优势明确:
- 服务端使用AES-128对视频切片(.ts 或 .mp4 分段)加密;
- 解密密钥(Key)以明文JSON形式由后端API返回(非硬编码在前端),配合短期Token或Referer/UA校验;
- 播放器(如video.js + videojs-contrib-hls 或 dashjs)自动处理密钥获取、解密与拼接,用户无感知;
- 支持断点续播、自适应码率,且无需浏览器插件或特殊证书。
? 实施关键步骤:
-
预处理视频(部署时一次性)
使用ffmpeg生成HLS切片并加密:# 生成加密密钥(保存为 key.key) openssl rand -hex 16 > key.key
生成密钥URI(如 /keys/video_abc.key)及m3u8索引
ffmpeg -i input.mp4 \ -c:v h264 -c:a aac \ -f hls \ -hls_time 10 \ -hls_key_info_file key_info.txt \ # 内容:key.key\nhttps://yoursite.com/keys/video_abc.key\n1234567890ABCDEF -hls_playlist_type vod \ output.m3u8
2. **PHP密钥分发接口(带访问控制)**
```php
<?php // keys.php?k=video_abc
require 'auth_check.php'; // 验证session、Referer、时间戳或JWT Token
$keyId = $_GET['k'] ?? '';
if (!preg_match('/^[a-zA-Z0-9_]+$/', $keyId)) {
http_response_code(400);
exit;
}
$keyPath = "/path/to/keys/{$keyId}.key";
if (file_exists($keyPath) && time() - filemtime($keyPath) < 3600) { // 1小时有效期
header('Content-Type: application/octet-stream');
header('Cache-Control: no-cache, no-store, must-revalidate');
readfile($keyPath);
} else {
http_response_code(404);
}
?>
-
前端播放器集成(video.js + HLS)
<video id="my-video" class="video-js vjs-default-skin" controls><source src="https://yoursite.com/hls/output.m3u8" type="application/x-mpegURL"></source></video><script> const player = videojs('my-video', { html5: { hls: { enableLowInitialPlaylist: true, overrideNative: true // 强制使用JS解析(兼容性更好) } } }); </script>
⚠️ 重要注意事项:
- Clear Key 不提供强DRM级保护,密钥仍可能被开发者工具捕获,但已能有效阻止右键另存、wget/curl批量下载等低阶盗取;
- 务必对keys.php启用严格访问控制:校验Referer(限定您的域名)、验证登录态Session、添加短期Token签名、限制IP频次;
- 禁止将.m3u8或密钥URL暴露在公开HTML源码中,建议通过AJAX动态注入播放地址;
- 对于高价值内容,应升级至商业DRM方案(如Shaka Packager + Widevine/PlayReady),但需终端设备支持且增加部署复杂度。
总结而言,放弃“阻止所有访问”的幻想,转向“提升获取成本”的务实策略——通过HLS/DASH Clear Key + PHP动态授权,您能在数小时内构建起远超原始MP4直链的安全防线,同时保持video.js等主流播放器的无缝兼容性。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











