controlslist="nodownload"仅在chrome/edge有效且需配合controls属性,firefox/safari支持弱;禁用右键无法阻止下载,真正防护需后端token校验或drm。

controlslist="nodownload" 能隐藏原生控制栏里的下载按钮,但仅对 Chrome/Edge 有效,Firefox 完全不支持,且无法阻止右键“另存为”或 DevTools 中手动恢复属性——它只是个 UI 提示,不是安全机制。
controlslist 属性怎么写才生效
这个属性只在 controls 存在时起作用,必须同时出现:
-
<video controls controlslist="nodownload"></video>✅ 正确 -
<video controlslist="nodownload"></video>❌ 不生效(缺controls) -
<video controls controlslist="nodownload nofullscreen"></video>✅ 多值用空格分隔 -
<video controls controlslist="nodownload, nofullscreen"></video>❌ 逗号会使其完全失效
常见可选值:nodownload、nofullscreen、noremoteplayback。注意 Safari 对 nodownload 支持极弱,即使写了也可能仍显示下载项。
为什么 oncontextmenu="return false" 还是能右键保存
禁用右键菜单只能屏蔽 contextmenu 事件触发的默认菜单,但以下情况仍可下载:
如果你了解HTML,CSS和JavaScript,您已经拥有所需的工具开发Android应用程序。本动手本书展示了如何使用这些开源web标准设计和建造,可适应任何Android设备的应用程序 - 无需使用Java。您将学习如何创建一个在您选择的平台的Android友好的网络应用程序,然后转换与自由PhoneGap框架到一个原生的Android应用程序。了解为什么设备无关的移动应用是未来的潮流,并开始构建应用程序,提供更
- Chrome 浏览器中,长按视频区域(移动端)或点击播放器右下角“…”按钮(桌面端),会唤起独立的原生控件菜单,不受
oncontextmenu影响 - 用户打开 DevTools → Network → Filter “media”,直接找到
.mp4或.ts请求,右键 Copy link 就能下载 -
oncontextmenu绑定在<video></video>上时,若父容器有pointer-events: none或覆盖蒙层,事件可能根本不会触发
真正起效的做法是:把 oncontextmenu="return false" 放在 或包裹 <video></video> 的最外层 <div> 上,并确保没有 CSS 阻断事件冒泡。
<h3>比 controlslist 更难绕过的做法:移除 controls + Blob URL</h3>
<p>当你要提高普通用户的操作门槛,而不是追求绝对安全,可以放弃原生控件,改用 JavaScript 控制流:</p>
<ul>
<li>设置 <code>controls="false",彻底隐藏所有原生按钮(包括下载入口)
URL.createObjectURL(new Blob([arrayBuffer], {type: 'video/mp4'})) 动态生成 src,让视频地址不暴露在 HTML 源码里MediaSource API 分块加载并解密,使网络面板中看到的是加密分片而非完整文件src 是 blob: 开头的内存地址,不可直接保存)注意:Blob URL 不能跨页面复用,页面刷新即失效;且 iOS Safari 对 MediaSource 支持有限,需 fallback 到 HLS。
真正难防的从来不是按钮或右键,而是网络请求本身。只要视频资源走 HTTP 明文传输,就一定能在 Network 面板里被定位到——所以关键决策点不在前端加多少层遮挡,而在于后端是否启用 Token 时效校验、分片加密或 DRM 接入。










