是否可以防止从网站下载视频

时间:2009-11-24 13:51:04

标签: php

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

虽然用户可以使用某些硬件设备录制视频,但无法使用某些链接下载视频 - 与谷歌视频完全相同。

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

10 个答案:

答案 0 :(得分:59)

是。永远不要向任何人展示它。一旦你这样做,所有的赌注都会被取消(对于不那么偏执的回答,见最后一段)。

这是版权保护的常见问题:您无法以任何方式区分合法用户和对手(因为他们甚至可能是同一个人)。

编辑:“我的用户可以观看视频。但他们一定无法下载该视频” 让我们试着拆解它:

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

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

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

然而,如果您不关心确定的用户绕过您的保护,并且如果它足以保护视频免受90%的用户影响,我相信你提到的Real格式有一些标志“不允许保存”。这将禁用播放器中的“另存为”选项(即上面的“或将其保存到磁盘”选项);对于大多数用户来说,这将是一个非常重要的障碍。任何更多可能会给您的用户带来不便和愤怒,同时不会提供更多的保护。

答案 1 :(得分:13)

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

答案 2 :(得分:6)

如果用户可以“观看”视频,他们总能找到将其保存到磁盘的方法。你可以在你的视频上为版权信息添加水印,但我担心这是关于它的。

答案 3 :(得分:5)

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

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

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

或者使用混淆的html / javascript让用户难以进行View-> Source。但是,一个充分确定的用户可能会对其进行反混淆,并且您无法禁用View-> Source,因为您不拥有该用户的PC。

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

我不主张上述任何一种做法!

底线:你必须将这些位发送到用户的电脑上,一旦你这样做,就会失去对它们的所有控制权。

答案 4 :(得分:5)

@Fero

而不是将您的视频放入网站,在家用电脑中安装远程桌面

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

让用户通过它观看您的电影

您也可以逐个监控它们,而不会睡觉。

可能就是这样!

答案 5 :(得分:3)

要提前,没有什么是防弹的。对于所开发的每一项保护措施,有人找到了打败它的方法。但是,您可以采取一些措施来阻止(或至少减慢)临时用户。

Real Networks平台提供了很多保护内容的选项,其中最安全的通常是实时或按需流式传输。

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

答案 6 :(得分:3)

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

答案 7 :(得分:1)

Fero,这是许多大型娱乐公司每天都面临的主题。 “但我怎么能阻止人们复制我的东西”?

你可能很难,但是当你看到困难的人时,除非你提供他们所见过的最重要的信息,否则人们不太愿意使用你的系统。如果login barrier是一个问题,想象一下强迫人们使用Real Player。

尝试让您的视频更有名和相关性比在 重要之前尝试加密更好。

答案 8 :(得分:0)

如果您使用的是html5视频,则可以保护视频免遭下载。

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

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

答案 9 :(得分:0)

   //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;
    ?>