是否可以保护网站上的视频不被下载?
虽然用户可以使用某些硬件设备录制视频,但无法使用某些链接下载视频 - 与谷歌视频完全相同。
例如,如果我的系统中有Real One Player,我可以选择下载视频;这应该受到限制。
答案 0 :(得分:59)
是。永远不要向任何人展示它。一旦你这样做,所有的赌注都会被取消(对于不那么偏执的回答,见最后一段)。
这是版权保护的常见问题:您无法以任何方式区分合法用户和对手(因为他们甚至可能是同一个人)。
编辑:“我的用户可以观看视频。但他们一定无法下载该视频” 让我们试着拆解它:
您可以在标有*的每个点截取(和/或修改)您的视频(尽管副本的质量可能会降低,尤其是在捕获模拟输出时)。除非你能以某种方式消除每一个(祝你最后一个好运),你所能做的就是让数据捕获/转换变得更加复杂。围绕这些“弱点”构建了一个完整的行业(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)
你可能很难,但是当你看到困难的人时,除非你提供他们所见过的最重要的信息,否则人们不太愿意使用你的系统。如果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;
?>