如何防止从我的网站下载图片和视频文件?

57

如何防止用户从我的网站下载图片和视频文件?这有可能吗? 最好的方法是什么?


你的意思是需要登录才能访问它们吗?还是防止它们被保存到浏览器之外? - jmucchiello
我不确定你的目的是什么,但如果你想展示你的艺术作品,你可以使用Flash画廊来增加难度。虽然它们可以做“打印屏幕”的事情,但仍需要时间。 - Tarik
27个回答

115

不,这是不可能的。

如果你能看到它,那么你就可以获得它。


8
为了让用户能够查看图片/视频,它们需要被下载到浏览器中,并保存在用户的计算机上。 - Edd
3
如果你将视频进行流媒体播放而不是直接托管文件,可以让用户更难以利用它们进行恶意下载。 - Chris Ballance
4
或者,你可以做一些可怕的事情,比如将图像嵌入到Flash对象中。 - Alfo

21

不要将它们发布到您的网站上。

否则就不可能实现。


13

由于浏览器需要传输内容以显示它(文本、图像、视频),所以当网站显示时,数据已经在客户端计算机上。以前的答案没有提供如何让非有经验的用户难以抓取内容的建议。以下是一些方向:

  • 总体
    • 用透明的 <DIV> 或透明图片覆盖相应内容(如本问题的某些答案中所述)
    • 在 frameset 中打开网站,这样保存可能会错过框架内容。
    • 通过 window.open() 打开网站以隐藏菜单栏。
    • 通过 JavaScript 禁用右键单击(由于对可用性的所有副作用,不建议使用)
    • 通过 JavaScript 从另一个文件加载页面的 HTML 代码(该文件可以检查特定 referer 或者是 ROT13),因此更难访问源代码。
    • 告诉浏览器所有内容都是打印时 display:none(类似于 @media print { body, div, p { display: none } }
    • 在客户端截屏之前使用 JavaScript 隐藏内容(请参见Stop User from using “Print Scrn”
    • 尝试禁用或覆盖剪贴板(请参见此文章
  • 图像
    • 不要使用 <img> 标签,而是将图像设置为 <DIV> 的背景
    • 将图像包装成 SVG 或 Flash 动画,使它们难以以可用格式访问。
    • 为图像禁用缓存(通过 <meta> 标记或在服务器传递时设置适当的标头),这样它们不会存储在浏览器缓存中(立即在客户端计算机上可用)。
  • 将图像分成几个部分,这样需要额外的工作才能重建整个图像。
  • 为图像添加onmousedown事件,例如显示版权警告。
  • 通过服务器脚本(例如PHP)传递图像,并检查Referer。
  • 视频
    • 流式传输视频,以防止通过URL简单下载。
    • 将视频封装到Flash电影中。
    • 使用支持DRM的不良格式。
  • 文本
    • 使文本不能选择(请参见如何使HTML文本不可选择
    • 除了覆盖之外,还可以将文本包装到JavaScript中(例如在ROT13之后或动态从第二个文件加载),因此文本不会直接在源代码中可用。
    • 将文本转换为图像(可能会降低显示质量),SVG或Flash
  • 再次强调,这些措施都无法阻止经验丰富的用户获取内容(例如通过截屏并选择性地对其运行OCR)。有时只需使用浏览器的开发者工具或在没有JavaScript的情况下使用网站即可。然而,它会让没有经验的用户感到困难,因此他们可能会寻找一些更容易获取的来源。

    还要记住,上述技术将影响搜索引擎读取页面内容(如果您想阻止它们,请从robots.txt开始)。

    谢谢您提供的其他补充上述列表的想法!


    11

    为了让客户端查看图片,必须先下载它们。在许多情况下,视频也是如此。您可以设置代理脚本来提供文件,但这并不能真正解决防止用户获取自己的副本的问题。有关此主题的更全面讨论,请参见问题“如何防止/使下载我的Flash视频变得困难?”


    10

    如果您正在使用PHP,最好的方法是通过.htaccess控制它,您需要将文件、图像和视频放置在一个单独的文件夹/目录中,并在该目录中创建一个新的.htaccess文件,其中包含以下内容:

    RewriteEngine On
    RewriteCond %{REQUEST_URI} \.(mp4|mp3|avi)$ [NC]
    RewriteCond %{HTTP_REFERER} !^http://sample.com/.*$ [NC]
    RewriteRule ^.* - [F,L]
    

    第一行的%{REQUEST_URI}将防止通过web浏览器或curl获取文件。第二行的%{HTTP_REFERER}将防止使用HTML标签<img><video>从除你提供的例外!之外的任何网站访问图像/视频,而不是http://sample.com/,通常应该是你自己网站的地址。

    您还可以查看我的问题和被接受的答案这里以获取更多有关浏览器端的技巧。


    我注意到现在一些网站要求 User-Agent 标头匹配特定的模式(例如,其中包含“Mozilla”)。请注意,curl 可以添加和更改标头,因此这些方法都不是绝对可靠的。 - Barry Carter

    9

    我想加上一些哲学性的评论。互联网,特别是万维网的整个目的就是分享数据。如果你不希望人们下载图片/视频/文档,请不要将其放在网上。就是这么简单。太多人认为他们可以对现有设计施加自己的规则。那些想要在网上发布内容并控制其分发的人,是希望占得便宜又吃得好。


    10
    哲学是好的,除非你花费了时间和金钱制作出一张优秀的产品照片,却发现另一个大陆上的某只老鼠盗用了你的照片,并且降低了你的价格,而他们又不提供客户支持。 - Mike O'Connor
    从事付费视频或照片网络应用的人,总是会尽力保护他们的内容。就连在 YouTube 上下载视频对于“普通”用户来说也很困难,更何况他们是做广告业务的。 - John Balvin Arias

    7
    简而言之,不行。如果某人可以在他们的浏览器中查看图像或视频,那么根据定义,他们已经下载了它。这就是Web的工作方式 - 它是基于客户端服务器的。您在浏览器中(客户端)可以查看的任何内容都已从远程网站(服务器)传输到您的计算机上。

    2
    每次有人查看您的网站时,都会创建一个“副本”,这正是在互联网上创造版权法律混乱的原因之一。 - rmeador

    6
    在标准的HTML中,我不知道有任何方法。
    您没有明确说明,但我猜测您遇到了用户深层链接到您的内容的问题。如果是这样,并且您可以使用服务器端代码,我认为以下方法可能有效:
    1. 创建一个接受数字ID的页面,将其映射到服务器文件路径,打开该文件,直接将二进制写入响应流。 2. 在页面请求时,生成一堆随机ID,将它们映射到实际的媒体URL,并在服务器端某个地方(会话?)存储该映射对象,具有有限的生命周期。 3. 使用适当的ID作为查询字符串参数,将您的媒体链接指向新的媒体页面。 4. 在每次回发时清除映射对象并生成所有新链接。
    这样做:
    1. 不能阻止人们从您的页面内下载 2. 绝对不如标准的HTML轻量级 3. 也有自己的问题。
    但这是一个可行过程的概要,可能有助于防止用户深层链接。

    5

    你可以减少可能性,但不能消除它...


    5
    许多人都说过,你无法阻止他人下载内容。你真的做不到。
    但是你可以让它更难。
    你可以使用透明的
    覆盖图像,这将防止人们右键单击它们(或者,将
    的背景设置为图像也会产生相同的效果)。
    如果你担心跨链接(即其他人链接到你的图像),你可以检查HTTP referrer并重定向来自非你所拥有的域的请求到“其他地方”。

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