防止HTML5视频被下载(右键保存)?

233

如何禁用浏览器右键菜单中的“另存为...”选项,以防止客户下载视频?

是否有更完整的解决方案可以防止客户直接访问文件路径?


4
我点赞这个问题是因为它明确提出了如何“禁用HTML5视频的右键单击”这一问题。我不确定它是否与普通图像的右键禁用类似,或者是否可以应用其他覆盖技巧等。 - user166390
13
即使您禁用了鼠标右键,他们仍然可以通过浏览器菜单(文件→另存为)保存它。即使您可以某种方式阻止此操作,他们也可以使用 view-source 找到文件的 URL。即使您可能会对其进行一些模糊处理,他们也可以从缓存中获取。即使您可能会将其复杂化(例如流式传输),他们也可以使用嗅探器或其他工具来捕获网络流量。事实是,如果您将其发送给用户,他们可以保存它。没有任何绕开这一点的方法。您需要问自己的问题是,为什么您非常需要阻止它?这真的很必要吗?这是否值得花费时间和让用户感到不友好? - Synetech
我可能会显得有些学究气,但是你过度使用了“下载”这个术语。当然,你希望允许视频被下载。 - Johan Boulé
28个回答

1
简短回答: 像YouTube一样加密链接,如果不知道如何实现,请向YouTube/Google询问他们的做法。(以防您想要直接进入重点。)
我想向任何人指出,这是可能的,因为YouTube可以做到,如果他们可以,那么任何其他网站也可以做到,而且它不是来自浏览器,因为我在一些浏览器上进行了测试,比如Microsoft Edge和Internet Explorer,所以有一种方法可以禁用它,但人们仍然说它...我尝试寻找答案,因为如果YouTube可以,那就必须有一种方法,而唯一的了解他们如何做到的方法是查看YouTube的脚本,这正是我现在正在做的。我还检查过是否是自定义上下文菜单,但它不是,因为上下文菜单溢出了检查元素,我的意思是它超过了它,并且我查看了一下,它从未创建新的类,而且实际上无法使用JavaScript访问检查元素,因此不可能。当您双击YouTube视频时,可以看到它会弹出Chrome的上下文菜单。此外...YouTube不会添加该功能。我正在研究并查看YouTube的源代码,因此如果我找到答案,我会回来的...如果有人说你不能,那么他们没有像我一样进行研究。下载YouTube视频的唯一方法是通过视频下载。
好的...我做了一些研究,我的研究表明你可以禁用它,除非没有javascript...你必须能够加密视频链接才能禁用它,因为我认为如果浏览器找不到它,任何浏览器都不会显示它,当我打开YouTube视频链接时,它显示为"blob:https://www.youtube.com/e5c4808e-297e-451f-80da-3e838caa1275",所以它正在加密以防止被保存...你需要知道php才能这样做,但是像你选择的答案一样,使它更难,YouTube将其加密得最严格,你需要成为一个高级php程序员,但如果你不知道那么就采取你选择的人作为最佳答案,让它难以下载...但如果你知道php,那么重度加密视频链接,使它只能在你的设备上阅读...我不知道他们是如何做到的,但他们做到了,有一种方法。YouTube加密视频的方式非常聪明,所以如果你想知道如何做到这一点,就问问YouTube/Google他们是如何做到的...希望这对你有所帮助,虽然你已经选择了最佳答案。因此,在简短的期限内,加密链接是最好的选择。

0

防止 HTML5 视频被下载(右键保存)

<video  type="video/mp4" width="330" height="300" controlsList="nodownload" oncontextmenu="return false;" controls></video>

0

似乎通过websocket流式传输视频是可行的选择,就像流式传输帧并在画布上绘制它们一样。

使用JavaScript进行websocket视频流传输

我认为这将提供另一种保护级别,使客户端更难获取视频,并且当然解决了您的问题,“保存视频为...”右键上下文菜单选项(过度杀伤?!)。


0

0

0

我发现一个类似问题的好答案,使用PHP代替JavaScript能更好地保护安全。

我想在用户的浏览器中使用浏览器默认播放器播放test.mp4视频文件(就好像在网页上单击了URL/test.mp4一样),但需要输入密码才能访问,密码可以由用户提供或软件内部提供。

以下是这个想法的简要概述。它始于用户访问(运行)我编写的名为secure.php的程序来播放test.mp4视频文件。

test.mp4视频文件位于子目录(“secureSubdirectory”)中,该子目录包含一个.htaccess文件,其中包含“Require all denied”。这立即阻止了通过URL的任何直接访问。

当运行secure.php时,它会提供一个密码(或向用户查询密码),然后对其进行POST请求,其中包括密码,并使用PHP命令使用盐值验证密码:

$Hash=base64_encode(hash_hmac("sha256",$Pwd,$Salt,true));
$HashesAreSame=hash_equals($Hash,$GoalHash);

然后测试test.mp4是否存在,并执行以下PHP代码,将test.mp4文件作为字节流返回给用户的浏览器:

header("Content-Type: video/mp4");
echo file_get_contents("secureSubdirectory/$path");
exit;

视频正常播放。如果我右键点击显示视频的页面并尝试保存视频,则生成的文件将只包含错误字符串,例如“错误:未找到密码”,因为 test.mp4 使用普通的 secure.php URL 进行查询,而不是通过正确的密码进行 POST 查询。
当然,您可以使用浏览器调试工具的网络选项来获取响应负载(视频字节),但如果浏览器提供了防止访问调试工具的选项,则 PHP 程序或 .htaccess 文件可以防止此操作。
我无法想象失败的情况,但如果存在一种完美的简单授权方式,我会非常感兴趣。(请注意,由于此方法依赖密码,将其与用户关联起来不是一种安全的身份验证方式,因为用户可能会意外或故意发布或共享密码。)

-1

@Clayton-Graul提供了我需要的内容,但是我需要适用于使用AngularJS的网站的CoffeeScript版本。以防你也需要,这是你需要在相关的AngularJS控制器中输入的内容:

    # This is how to we do JQuery ready() dom stuff
    $ ->
        # let's hide those annoying download video options.
        # of course anyone who knows how can still download
        # the video, but hey... more power to 'em.
        $('#my-video').bind 'contextmenu', -> 
            false

“Circle K 附近发生了奇怪的事情”(这是真的)


-1

浏览器中看到的所有内容都是下载的内容。所涉及的问题是如何在浏览器中保存该内容。为了查看内容,客户端浏览器从内容服务器下载并将其在本地提供。

一种越来越流行的解决方案是仅在浏览器中保存(短暂的)内容,并且在有限的时间内以不能直接保存的方式进行保存。 Blob 是其中一种实现,具有减少带宽和存储开销的额外好处,因为内容存储在二进制对象中。

内容的短期过期使得持久存储对于普通用户几乎不可能,因为新内容会在用户尝试保存已过期内容之前显示。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接