【问题标题】:Is it possible to protect from downloading a video from a site是否可以防止从网站下载视频
【发布时间】:2010-12-19 21:32:57
【问题描述】:

是否可以保护网站上的视频不被下载?

虽然用户可以使用某些硬件设备录制视频,但应该无法使用某些链接下载视频 - 就像 google 视频一样。

例如,如果我的系统中有 Real One Player,我可以选择下载视频;这应该被限制。

【问题讨论】:

  • 如果您不让用户观看,您可能会保护您的视频。
  • 当您让用户观看视频时,这意味着您将字节发送给用户。所以他们可能会一次又一次地保存和观看。您可能会采取一些技巧来隐藏或编码您的视频 url/数据,但不要忘记:您可以运行但您无法逃脱 :)
  • 他们必须下载才能观看。我认为您的意思是“他们一定不能将其保存在计算机上供以后查看”。
  • 这个问题与最初提出的问题相比有了很大的改变。我们是如何从“如何保护我的内容”到“如何下载 Google 视频”的?
  • 完全保护这些视频不被“稍后观看”的唯一方法是不让它们被观看。即使您可以设法做一些 FLV 疯狂并阻止下载,仍然有屏幕录像机。

标签: php


【解决方案1】:

是的。永远不要向任何人展示它。一旦你这样做,所有的赌注都会被取消(为了减少偏执的答案,请参阅最后一段)。

这是复制保护的常见问题:无论如何,您都无法区分合法用户和对手(因为他们甚至可能是同一个人)。

编辑:关于“我的用户可以观看视频。但他们不能下载该视频” 让我们试着拆开它:

  • 用户在播放器的“播放”按钮上单击鼠标
  • 点击通过计算机的操作系统到达您的播放器
  • 播放器通过网络向您的服务器发送“向我发送视频”请求
  • (根据定义,这要求请求通过用户计算机拥有的任何网络堆栈)
  • 如果服务器确定它是合法播放器,则开始向用户的计算机发送数据。
  • (根据定义,这也意味着用户的计算机正在“下载”数据)
  • *数据通过网络进入计算机(尽管在此阶段捕获数据对于NSA 比对用户更实用)
  • *操作系统处理较低的数据层(即“这是一个数据包,从 $yourserver 到我,应该传递给 $yourapp”)
  • *操作系统将数据传递给请求它的应用程序
  • 播放器接收数据
  • *播放器将数据转换为一系列图像(也称为视频)和音轨
  • *播放器将图像发送到操作系统的显示子系统,或将其保存到磁盘
  • *显示系统将图像转换为屏幕可以理解的格式
  • *图像通过电缆流入屏幕
  • *图像显示在屏幕上(此时它们以光的形式退出计算机)
  • 光线到达用户的眼睛

您的视频可以在标有 * 的每个点被截取(和/或修改)(尽管副本的质量可能会降低,尤其是在捕获模拟输出时)。除非您能以某种方式消除其中的每一个(最后一个祝您好运),否则您所能做的就是使数据捕获/转换更加复杂。围绕这些“弱点”建立了一个完整的行业(谷歌“流翻录”,您自己看看)。

您可以使用各种 DRM 技术使捕获复杂化,但最终,数据流必须在某处变成模拟视频和模拟音频(也称为光和声音)。

但是,如果您不在乎某个坚定的用户会绕过您的保护,并且足以保护 90% 用户的视频,我相信您提到的 Real 格式确实有一些标志“不允许保存”。这将禁用播放器中的“另存为”选项(即上面的“或将其保存到磁盘”选项);对于大多数用户来说,这将是一个足够大的障碍。任何更多的内容都可能会给 100% 的用户带来不便和愤怒,同时不会提供更多的保护。

【讨论】:

  • 微不足道,也许。很明显,不是真的。
  • @Fero:你要问的是 IMPOSSIBLE - 你可以让它变得更困难,但最终无法阻止。
  • 我喜欢这个答案中的阶段和拦截点列表。
  • 需要注意的是,虽然在后面的几个步骤中有人可以“录制”视频,但在显示后仍然无法获得准确的视频数据。换句话说,您可以在显示器前设置抓屏程序或摄像机,但根据定义,视频的质量会比您收到的实际数据更差。
  • 您知道吗? 在 Safari 中,您可以单击窗口 > 活动以显示所有在后台进行的文件传输。您可以按住 Alt 键并双击任何这些传输以将它们保存到磁盘。如果您使用任何类型的播放器请求和下载单独的文件,例如 .flv 文件,这是保存原始数据的简单方法。大多数浏览器都提供这样的功能。 ;)
【解决方案2】:

如果用户的眼睛可以看到视频,那么用户的录像设备也可以看到视频。现在没有,也永远不会有一种方法来阻止用户记录他们正在查看/收听的内容。这是一个无法解决的问题。

【讨论】:

  • 是的,这是一个有趣的问题,因为如果您不采取任何预防措施,外行只需单击“另存为”即可。如果您采取一些预防措施,精通技术的人会发现他们周围,但即使您采取了很多预防措施,外行也可以设置一个摄像机或屏幕抓取应用程序。
  • 当然,最需要注意的是,您采取的任何“预防措施”都可能激怒您的用户,他们只想观看该死的视频
  • 是的,它真的让你质疑整个过程。您希望他们看到它,但您不希望他们稍后看到它?如果是因为您的页面上到处都是大量广告,我想您可以在视频中放置广告,尽管这样会更难获得点击次数。
  • 假设我有一个课程网站,课程以视频的形式显示,您必须登录才能随时随地访问该视频。但是任何人都不应该轻易下载该视频,或者根本不允许下载(那太好了),因为您不希望他们将这些视频分发给家人、朋友等,这样他们就可以免费学习而无需支付我们的费用服务...
【解决方案3】:

如果用户可以“观看”视频,他们总能找到将视频保存到磁盘的方法。您可以在视频上为版权信息添加水印,但恐怕仅此而已。

【讨论】:

    【解决方案4】:

    无法阻止视频被下载。对于要在屏幕上显示的视频,组成视频的位必须传输到用户的电脑 - 你无法控制。

    你所能做的就是让它变得困难。

    例如,使用 css 在视频上显示透明图像,这样就很难右键单击视频并查看其属性(Flickr 处理图片)。

    或使用混淆的 html/javascript 使用户难以执行 View->Source。但是一个足够坚定的用户可以不混淆它,并且你不能禁用 View->Source 因为你不拥有用户的电脑。

    您可以更进一步,使用自定义(秘密)视频文件格式和浏览器插件,或者使用单独的 realmedia 风格的播放客户端。但是,这些可能会惹恼您的用户,并且不会阻止某人对您的协议/格式进行逆向工程并编写自己的客户端来模拟浏览器并将视频保存为标准格式。

    我不提倡做上述任何事情!

    底线:你必须将比特发送到用户的电脑,一旦你这样做了,你将失去对它们的所有控制。

    【讨论】:

      【解决方案5】:

      @Fero

      不要将您的视频放在网站上,而是在您的家用计算机中设置远程桌面

      手动为每个用户打开登录账户,并让用户登录,

      并让用户通过它观看您的电影,以及

      你也可以一一监控,不用睡觉。

      可能就是这样!

      【讨论】:

      • 两个字:抓屏器。 ;o)
      • 其实,它符合他的要求 :D 他只是不想从网站下载他的视频。
      • 哈哈,好吧。 :D 这确实不应该是一个答案。 ;)
      【解决方案6】:

      不可能以一种或另一种方式有效地阻止用户保存您的视频。绝望的人实际上可能会在播放时记录整个屏幕内容。

      【讨论】:

        【解决方案7】:

        坦率地说,没有什么是万无一失的。对于制定的每一项保护措施,都有人找到了打败它的方法。但是,您可以采取一些措施来阻止(或至少减慢)临时用户。

        Real Networks 平台提供了很多保护内容的选项,其中最安全的通常是直播或点播。

        不过,为了给您提供具体的指示,我们需要更多信息。您提到 Real One Player 提供了“保存”选项。它可以播放多种格式。您发布的是什么类型的文件(Real、WMV 等)以及当前的服务方式(链接、嵌入、流)。

        【讨论】:

          【解决方案8】:

          Fero,这是很多大型娱乐公司每天都在面对的话题。 “但是我怎样才能阻止人们复制我的东西”?

          您可以设置难度,但是当您让人们观看时,人们不太愿意使用您的系统,除非您提供他们所见过的最重要的信息。如果 login barrier 是一个问题,想象一下强迫人们使用 Real Player。

          尝试让您的视频出名并具有相关性比尝试在重要之前不惜一切代价进行加密要好。

          【讨论】:

            【解决方案9】:

            如果您使用的是 html5 视频,您可以保护视频不被下载。

            这是一个开源脚本,您可以尝试,目前无法绕过它:http://sourceforge.net/projects/defaprotecthtml5videodownload/

            它使用特殊算法的方式,它不会向您发送原始视频文件,而是发送带有规则的文件,因此它可以阻止您的视频下载

            【讨论】:

            • 建议相同。它也适用于音频。但是,如果您将视频和音频都放在页面上,则只有最后一个有效。 &其他人不会。你有同样的问题吗?
            【解决方案10】:
               //test.php
             <video controls src="your/path/1502139559.mp4"></video>
                <?php
            
                  if (session_id() == '') {
                   session_start();
                  }
                  error_reporting(0);
                  $out2 = ob_get_contents();
                  if (strpos($out2, "<video") || strpos($out2, "<audio") || strpos($out2, "<source")) {
                   ob_clean();
                   if (strpos($out2, "<safe") == false) {
                    $window = md5(time());
                    $_SESSION['window'] = $window;
            
                    ?>
                    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
                    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" >
                    <script>
                     jQuery.ajax({
                      type: "POST",
                      url: "/enable.php",
                     });
            
            
                    </script>
            
            
            
                    <?php
            
                    if (strpos($out2, "<safe") !== false) {
                     $_SESSION['safe'] = "SAFE";
                    }
            
                    function getURL($matches) {
                     global $rootURL;
                     if ($_SESSION['defat'] == "") {
                      $_SESSION['defat'] = 1;
                     } else {
                      $_SESSION['defat'] = $_SESSION['defat'] + 1;
                     }
                     $_SESSION['x' . $matches['2'] . $_SESSION['defat']] = 0;
                     $_SESSION['defa' . $matches['2'] . $_SESSION['defat']] = md5(time() . "Defa Protector");
                     $_SESSION['imdefa' . $_SESSION['defat']] = md5('Defa') . base64_encode(base64_encode($matches['2']));
                     $_SESSION['x' . $matches['2']] = 0;
                     $_SESSION['defa' . $matches['2']] = md5(time() . "Defa Protector");
                     $_SESSION['file' . $_SESSION['defat']] = md5('Defa') . base64_encode(base64_encode($matches['2']));
                     return $matches[1] . $rootURL . "defavid.php?window=" . $_SESSION['window'] . "&defat=" . $_SESSION['defat'];
            
                    }
            
                    $mes = preg_replace_callback("/(<video[^>]*src *= *[\"']?)([^\"']*)/i", getURL, $out2);
                    $mes = preg_replace_callback("/(<source[^>]*src *= *[\"']?)([^\"']*)/i", getURL, $mes);
                    $mes = preg_replace_callback("/(<audio[^>]*src *= *[\"']?)([^\"']*)/i", getURL, $mes);
                    echo $mes;
                   } else {
                    echo $out2;
                   }
                  }
            
                ?>
                //defavid.php
                <?php
            
                  ob_start();
                  if (session_id() == '') {
                   session_start();
                  }
                  $window = addslashes(strip_tags($_GET['window']));
                  $md5defa = md5('Defa');
                  $t = (int) $_GET['defat'];
                  $filedefa = str_replace($md5defa, '', $_SESSION['file' . $t]);
                  $file = str_replace("https://", "http://", base64_decode(base64_decode($filedefa)));
                  $defa = str_replace("https://", "http://", base64_decode(base64_decode($filedefa)));
                  $defaurl = get_headers($file, 1);
                  $url = $defaurl["Location"];
                  if ($url != $file && $url != "") {
                   $file = $url;
                  }
                  if (!function_exists('http_response_code')) {
            
                   function http_response_code($newcode = NULL) {
                    static $code = 200;
                    if ($newcode !== NULL) {
                     header('X-PHP-Response-Code: ' . $newcode, true, $newcode);
                     if (!headers_sent())
                      $code = $newcode;
                    }
                    return $code;
            
                   }
            
                  }
                  $header = http_response_code();
                  $header2 = getallheaders();
            
                  function isMobile() {
                   return preg_match("/(MSIE|Edge|android|avantgo|blackberry|bolt|boost|cricket|docomo|fone|hiptop|mini|mobi|palm|phone|pie|tablet|up\.browser|up\.link|webos|wos)/i", $_SERVER["HTTP_USER_AGENT"]);
            
                  }
            
                  if (isset($_SESSION['jsenable' . $window])) {
                   if ($header == 200 && $header2['Accept'] != "" && $_SESSION['x' . $defa . $t] == 0 && isMobile() || isset($_SERVER['HTTP_RANGE'])) {
            
                    $_SESSION['x' . $defa . $t] = $_SESSION['x' . $defa . $t] + 1;
                    if (isset($_SERVER['HTTP_RANGE'])) {
                     $opts['http']['header'] = "Range: " . $_SERVER['HTTP_RANGE'];
                    }
                    $opts['http']['method'] = "HEAD";
            
                    $conh = stream_context_create($opts);
            
                    $opts['http']['method'] = "GET";
            
                    $cong = stream_context_create($opts);
            
                    $out[] = file_get_contents($file, false, $conh);
            
                    $out[] = $http_response_header;
            
                    ob_end_clean();
            
                    array_map("header", $http_response_header);
            
                    readfile($file, false, $cong);
                    die();
                   }
                  }
            
                ?>
                //enable.php
            
                <?php
                if(session_id() == ''){
                     session_start(); 
                }
                $window = $_SESSION['window'];
                $_SESSION['jsenable'.$window] = TRUE;
                ?>
            

            【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-09-25
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多