HTML5 비디오를 다운로드하지 못하게합니까 (오른쪽 클릭 저장)?


171

클라이언트가 비디오를 다운로드하지 못하도록 브라우저의 오른쪽 클릭 메뉴에서 "다른 이름으로 비디오 저장 ..."을 비활성화하려면 어떻게해야합니까?

클라이언트가 파일 경로에 직접 액세스하지 못하게하는보다 완벽한 솔루션이 있습니까?


3
이 질문 은 HTML5 비디오에 대해 "오른쪽 클릭 비활성화"방법을 절대적으로 요구 하기 때문에이 질문에 투표 했습니다. 일반 이미지에서 마우스 오른쪽 버튼을 클릭하여 비활성화하는 것과 비슷한 지 또는 적용 가능한 다른 오버레이 트릭 등이 있는지 확실하지 않습니다.

3
마우스 오른쪽 버튼을 클릭하지 않아도 브라우저 메뉴 ( File→Save As) 에서 저장할 수 있습니다 . 어떻게 든 그것을 막을 수 있더라도 파일의 URL을 찾기 위해 소스있습니다 . 조금 불분명하더라도 캐시에서 찢어 질 수 있습니다. 스트림을 복잡하게 만들 수 있더라도 스니퍼 또는 무언가로 네트워크 트래픽을 캡처 할 수 있습니다. 사실, 사용자에게 보내면 저장할 수 있습니다. 그 주위에 방법이 없습니다. 물어봐야 할 질문은 왜 그렇게 멈춰야 하는가입니다. 정말 필요한가요? 노력하고 사용자에게 친숙하지 않은 가치가 있습니까?
Synetech

TxRegex가 빠른 기본 솔루션으로 가장 잘 대답하는 것을 좋아합니다.
jsherk

여기서는 놀랍게 보이지만 "다운로드"라는 용어를 오버로드하고 있습니다. 물론 비디오를 다운로드 하고 싶을 것입니다.
Johan Boulé

답변:


226

당신은 할 수 없습니다 . 이는 브라우저가 디자인 한 것이기 때문입니다 . 컨텐츠 제공 . 그러나 다운로드하기가 더 어려워 질 수 있습니다 .

우선 , "오른쪽 클릭" 이라는 이벤트를 비활성화 할 있습니다. 그러면 마우스 오른쪽 버튼을 클릭하고 다른 이름으로 저장을 클릭하여 일반 스키드가 비디오를 찢어 버리는 것을 방지 할 수 있습니다. 그러나 그들은 JS를 비활성화 하고이 문제를 해결하거나 브라우저의 디버거를 통해 비디오 소스를 찾을 수 있습니다. 게다가 이것은 나쁜 UX입니다. 상황에 맞는 메뉴에는 다른 이름으로 저장보다 합법적 인 것들이 많이 있습니다.contextmenu

사용자 정의 비디오 플레이어 라이브러리를 사용할 수도 있습니다. 대부분은 원하는대로 상황에 맞는 메뉴를 사용자 정의하는 비디오 플레이어를 구현합니다. 따라서 기본 브라우저 컨텍스트 메뉴가 표시되지 않습니다. 다른 이름으로 저장과 비슷한 메뉴 항목을 제공하는 경우 해당 기능을 비활성화 할 수 있습니다. 그러나 이것은 JS 해결 방법입니다. 약점은 이전 옵션과 유사합니다.

또 다른 방법은 HTTP Live Streaming을 사용하여 비디오를 제공하는 것입니다 . 그것이 본질적으로하는 일은 비디오를 덩어리로 자르고 차례로 제공하는 것입니다. 이것이 대부분의 스트리밍 사이트가 비디오를 제공하는 방법입니다. 따라서 다른 이름으로 저장을 관리하더라도 전체 비디오가 아닌 청크 만 저장합니다. 모든 청크를 수집하고 일부 전용 소프트웨어를 사용하여 스티치하는 데 약간의 노력이 필요합니다.

또 다른 기술은에 페인트 <video>하는 것<canvas> 입니다. 이 기법에서는 약간의 JavaScript를 사용하여 페이지에 표시되는 <canvas>요소는 hidden에서 프레임을 렌더링 하는 요소 <video>입니다. 그리고이이기 때문에 <canvas>상황에 맞는 메뉴는 <img>의 메뉴가 아닌의 메뉴를 사용합니다 <video>. 다른 이름으로 비디오 저장 대신 다른 이름으로 이미지 저장을 얻게됩니다.

CSRF 토큰 을 유리하게 사용할 수도 있습니다 . 서버에서 서버로 토큰을 보내도록해야합니다. 그런 다음 해당 토큰을 사용하여 비디오를 가져옵니다. 서버는 비디오를 제공하기 전에 유효한 토큰인지 확인하거나 HTTP 401을 얻습니다 . 아이디어는 비디오 URL을 직접 방문하지 않고 페이지에서 온 경우에만 얻을 수있는 토큰을 가져서 만 비디오를 얻을 수 있다는 것입니다.

하루가 끝나면 YouTube 또는 Vimeo와 같은 타사 비디오 사이트에 비디오를 업로드합니다. 그들은 훌륭한 비디오 관리 도구를 가지고 있으며, 장치 재생을 최적화하며, 노력을 기울이지 않고도 비디오가 찢어지지 않도록 노력합니다.


1
자세한 답변에 감사드립니다. 오른쪽 클릭 메뉴에서 다른 이름으로 저장 옵션을 비활성화 할 수 있습니까? 그것은 가장 기본적인 지식 사례를 다룰 것입니다
python

2
브라우저에 따라 다릅니다. 비디오가 완전히로드 된 경우 "저장"을 누르면 다시 다운로드하는 대신 캐시에서 비디오를 선택하기 만하는 시간 (특히 Firefox 및 크롬)을 보았습니다. 다시?), 따라서 두 번째 요청이 없습니다. 위의 방법은 링크를 재사용 할 때만 적용 할 수 있습니다.
Joseph

1
글쎄, 비디오 태그를 div로 오버레이하는 것에 관한 기사를 찾았습니다. 내 답변을 업데이트
조셉

2
감사. 나는 craftymind.com/factory/html5video/CanvasVideo.html을 읽었 습니다 . 아이디어는 당신의 대답과 거의 같습니다.
Trung

1
@Cupidvogel "일회용 URL"은 서버 생성 토큰을 허용하는 서버 엔드 포인트입니다. 토큰은 페이지 생성시 생성되어 db에 저장됩니다. 그것은 또한 페이지와 함께 제공되는 src<video>. 페이지가로드 될 때까지 db에는 토큰이 있고 페이지에는 토큰이 있습니다. <video>로드가 시작 되면 (엔드 포인트에 액세스) 서버는 토큰이 db에 있는지 확인한 후 삭제하고 파일을 스트리밍합니다. 두 번째 액세스의 결과로 토큰이 없으면 파일을 스트리밍하지 마십시오.
요셉

118

이것은 html5 비디오에서 마우스 오른쪽 버튼 클릭 "저장"옵션을 간단히 제거하려는 사람들을위한 간단한 솔루션입니다.

$(document).ready(function(){
   $('#videoElementID').bind('contextmenu',function() { return false; });
});

환상적입니다! 평범한 사람들이 비디오를 다운로드하는 것을 막는 데 큰 도움이됩니다!
Etienne Noël

2
그러나 브라우저에서 JavaScript가 비활성화 된 경우에는 도움이되지 않습니다.
mvark

2
감사합니다.이 솔루션은 모든 방문자의 90 %에게 충분합니다.
Kai Noack

2
블리. Firebug에서 요소를 검사하고 src속성을 확인한 후 다른 탭에서 열거 나 wget다운로드하십시오!
SexyBeast

11
이것의 주된 목표는 "정상적인"사용자들이 비디오를 다운로드하는 것을 피하는 것입니다. 이 상황을 해결하기위한 좋은 솔루션입니다.
Unapedra

37

간단한 대답,

당신은 할 수 없습니다

그들이 당신의 비디오를보고 있다면, 그들은 이미 가지고 있습니다

속도를 늦출 수는 있지만 멈출 수는 없습니다.


그런데이 답변은 HTML5 비디오, 플래시 비디오 또는 향후 상상할 수있는 모든 기술에 적용됩니다. 간단합니다 : 작동 방식입니다.
구스타보 로드리게스

YouTube는 어떻습니까? YouTube에서는 비디오 파일을 쉽게 찾을 수 없습니다. 나는 당신이 옳다는 것을 의미합니다.하지만 우리 서버에서 간단한 mp4를 호스팅하고 html5 플레이어를 사용하는 것보다 youtube 또는 유사한 비디오 호스팅에서 mp4 소스를 쉽게 숨길 수 있습니다.
dlopezgonzalez

2
그것은 두 질문에 대한 답이 아닙니다.
Tzshand

1
사람들은 전체 화면과 오디오를 녹음하고 모든 해결 방법을 속일 수 있으므로 속도가 느려질 수 있습니다.
Kintsukuroi

1
@IlanSchemoul 재미있는. 공유해 주셔서 감사합니다 :)
Starx

33

예, 세 단계로 수행 할 수 있습니다.


  1. 보호하려는 파일을 코드가 실행중인 디렉토리의 서브 디렉토리에 두십시오.

    www.foo.com/player.html
    www.foo.com/videos/video.mp4

  2. ".htaccess"라는 하위 디렉토리에 파일을 저장하고 아래 행을 추가하십시오.

    www.foo.com/videos/.htaccess

    #Contents of .htaccess
    
    RewriteEngine on
    RewriteCond %{HTTP_REFERER} !^http://foo.com/.*$ [NC]
    RewriteCond %{HTTP_REFERER} !^http://www.foo.com/.*$ [NC]
    RewriteRule .(mp4|mp3|avi)$ - [F]
    

이제 소스 링크는 쓸모 가 없지만 파일을 다운로드하려는 모든 사용자에게 직접 파일을 제공 할 수 없도록해야합니다.

  1. 보다 완벽한 솔루션을 얻으 려면 이제 플래시 플레이어 (또는 html 캔버스)를 사용하여 비디오를 제공하고 비디오에 직접 연결하지 마십시오. 마우스 오른쪽 버튼 클릭 메뉴를 제거하려면 HTML에 추가하십시오.

    <body oncontextmenu="return false;">


결과:

www.foo.com/player.html 은 비디오를 올바르게 재생 하지만 www.foo.com/videos/video.mp4를 방문하는 경우 :

오류 코드 403 : FORBIDDEN


이것은 직접 다운로드, cURL, 핫 링크에 사용할 수 있습니다.

이것은 두 가지 질문에 대한 완전한 대답이며 질문에 대한 대답은 아닙니다. "사용자가 이미 다운로드 한 비디오를 다운로드하지 못하게 할 수 있습니까?"


1
훌륭한 답변이지만 .htaccess콘텐츠 에서 삭제해야한다는 내용이 있습니다.
MAZux

2
여전히 사람을 다운로드 할 수있는 HTTP Referer를 위조 할 수 있습니다. 그러나 이것은 매우 영리한 솔루션입니다. 파일에 일회성 코드를 사용 하여이 클럽을 만들면 좋습니다.
Shiroy

여전히 IDM이 다운로드 할 수있는 것 같습니다!
페르시아만

@PersianMan 올바른-첫 답변을 읽어 보시기 바랍니다
Tzshand

1
브라우저에서 자바 스크립트를 비활성화하면이 트릭이 작동하지 않습니다. 그런 다음 마우스 오른쪽 버튼을 클릭하면 활성화됩니다. 이를 피하려면 jquery를 사용하여 비디오 요소를 동적으로 가져오고로드해야합니다.
Anindya Sankar Dasgupta

23

내가 일반적으로 사용하는 가장 좋은 방법은 매우 간단합니다. 전체 페이지에서 컨텍스트 메뉴를 완전히 비활성화합니다. 순수한 html + javascript :

 <body oncontextmenu="return false;">

그게 다야! 마우스 오른쪽 버튼을 클릭하면 항상 소스를 볼 수 있기 때문에 그렇게합니다.
"브라우저보기 소스를 직접 사용할 수 있습니다"라고 말하지만 사실은 비디오 다운로드를 중단 할 없다는 사실에서 시작 html5합니다.


나는 solución이 "일반적인"사용자를 방해하지 않아야하고, 오른쪽 클릭을 비활성화하면 사용자가 일부 텍스트를 복사하여 붙여 넣거나, 관심있는 단어를 검색하지 못하도록해야합니다 (예 : 비디오 제목 제외). 모든 사용자가 아마 그렇게 할 것이다 그러나 그것은 그들 중 일부에 대한 억세스 할수 할 수있다
존 Balvin 아리아

14

클라이언트 측 개발자로서 BLOB URL을 사용하는 것이 좋습니다. Blob URL은 이진 객체를 나타내는 클라이언트 측 URL입니다.

<video id="id" width="320" height="240"  type='video/mp4' controls  > </video>

HTML에서 비디오를 src비워 두고 JS에서 AJAX를 사용하여 비디오 파일을 가져옵니다. 응답 유형이 blob 인지 확인하십시오.

window.onload = function() {
    var xhr = new XMLHttpRequest();
    xhr.open('GET', 'mov_bbb.mp4', true);
    xhr.responseType = 'blob'; //important
    xhr.onload = function(e) {
        if (this.status == 200) {
            console.log("loaded");
            var blob = this.response;
            var video = document.getElementById('id');
            video.oncanplaythrough = function() {
                console.log("Can play through video without stopping");
                URL.revokeObjectURL(this.src);
            };
            video.src = URL.createObjectURL(blob);
            video.load();
        }
    };
    xhr.send();
}

참고 :이 방법은 큰 파일에는 권장되지 않습니다

편집하다

  • 직접 다운로드를 피하기 위해 교차 출처 차단 사용

  • 동영상이 API로 제공되는 경우 'GET'대신 다른 방법 (PUT / POST)을 사용하십시오.


3
YouTube는 이제 Blob을 사용합니다.
C0nw0nk

1
여기서 무슨 일이 일어나고 있는지 더 명확하게 설명하고 서버 설정 방법을 설명해 주시겠습니까?
Anthony

1
@nerdofcode 사용자가 비디오를 전달하려고 할 때 어떻게 작동합니까? 모든 비디오가 다운로드 될 때까지 기다려야합니까?
John Balvin Arias 2018 년

1
트윗 담아 가기 나는 이것을 100 % 테스트하지는 않았지만 빠른 버퍼 만 필요하다고 말할 것이다. 비록 이것에 대해서는 인용하지 말아라 ...
NerdOfCode

1
페이지를 검사하면 네트워크 탭에서 새 탭에서 열 수있는 비디오에 대한 요청을받습니다.
시몬

10

PHP는 키가 임의 문자열이고 값이 파일 이름 인 세션과 함께 html5 비디오 태그를 보냅니다.

ini_set('session.use_cookies',1);
session_start();
$ogv=uniqid(); 
$_SESSION[$ogv]='myVideo.ogv';
$webm=uniqid(); 
$_SESSION[$webm]='myVideo.webm';
echo '<video autoplay="autoplay">'
    .'<source src="video.php?video='.$ogv.' type="video/ogg">'
    .'<source src="video.php?video='.$webm.' type="video/webm">'
    .'</video>'; 

이제 PHP는 비디오를 보내도록 요청받습니다. PHP는 파일 이름을 복구합니다. 세션을 삭제하고 비디오를 즉시 보냅니다. 또한 모든 '캐시 없음'및 MIME 유형 헤더가 있어야합니다.

ini_set('session.use_cookies',1);
session_start();
$file='myhiddenvideos/'.$_SESSION[$_GET['video']];
$_SESSION=array();
$params = session_get_cookie_params();
setcookie(session_name(),'', time()-42000,$params["path"],$params["domain"],
                                         $params["secure"], $params["httponly"]);
if(!file_exists($file) or $file==='' or !is_readable($file)){
  header('HTTP/1.1 404 File not found',true);
  exit;
  }
readfile($file);
exit:

이제 사용자가 새 탭에서 URL을 복사하거나 상황에 맞는 메뉴를 사용하면 운이 없습니다.


나는 해결책을 좋아한다-그것은 OPs 질문을 해결한다. 불행하게도 Chrome에서 소스 코드를 확인하고 링크를 마우스 오른쪽 버튼으로 클릭하면 문제가 발생합니다. 사용자는 html 파일을 다운로드하게되며이 파일은 실제로 비디오 파일입니다.
user1252280

5

적어도 기술에 정통하지 않은 사람들이 마우스 오른쪽 단추 클릭 상황에 맞는 메뉴를 사용하여 비디오를 다운로드하지 못하게 할 수 있습니다. oncontextmenu 속성을 사용하여 모든 요소에 대한 컨텍스트 메뉴를 비활성화 할 수 있습니다.

oncontextmenu="return false;"

이것은 body 요소 (전체 페이지) 또는 비디오 태그 내에서 사용하는 단일 비디오에 대해서만 작동합니다.

<video oncontextmenu="return false;" controls>...</video>

5

우리는 만료 URL과 함께 AWS CloudFront를 사용했습니다. 비디오가로드되지만 사용자가 마우스 오른쪽 단추를 클릭하고 처음에받은 비디오 URL로 저장을 선택하면 시간이 만료됩니다. CloudFront Origin Access Identity를 검색하십시오.

비디오 URL을 생성하려면 AWS CLI에서 생성 할 수있는 키 페어가 필요합니다. 참고로 이것은 내 코드는 아니지만 훌륭하게 작동합니다!

$resource = 'http://cdn.yourwebsite.com/videos/yourvideourl.mp4';
$timeout = 4;

//This comes from key pair you generated for cloudfront
$keyPairId = "AKAJSDHFKASWERASDF";

$expires = time() + $timeout; //Time out in seconds
$json = '{"Statement":[{"Resource":"'.$resource.'","Condition" {"DateLessThan":{"AWS:EpochTime":'.$expires.'}}}]}';     

//Read Cloudfront Private Key Pair
$fp=fopen("/absolute/path/to/your/cloudfront_privatekey.pem","r"); 
$priv_key=fread($fp,8192); 
fclose($fp); 

//Create the private key
$key = openssl_get_privatekey($priv_key);
if(!$key)
{
    echo "<p>Failed to load private key!</p>";
    return;
}

//Sign the policy with the private key
if(!openssl_sign($json, $signed_policy, $key, OPENSSL_ALGO_SHA1))
{
    echo '<p>Failed to sign policy: '.openssl_error_string().'</p>';
    return;
}

//Create url safe signed policy
$base64_signed_policy = base64_encode($signed_policy);
$signature = str_replace(array('+','=','/'), array('-','_','~'), $base64_signed_policy);

//Construct the URL
$url = $resource.'?Expires='.$expires.'&Signature='.$signature.'&Key-Pair-Id='.$keyPairId;

return '<div class="videowrapper" ><video autoplay controls style="width:100%!important;height:auto!important;"><source src="'.$url.'" type="video/mp4">Your browser does not support the video tag.</video></div>';

1
과소 평가 된 의견. 하지만 요즘에는 docs.aws.amazon.com/sdk-for-php/v3/developer-guide/…를 사용하는 것이 좋습니다 .
Zmart

토큰이 만료되면 비디오를 탐색 할 수 없습니까? 동영상 URL에 다시 연락하는 것 같습니다.
Chud37

4

다음과 같이 상황에 맞는 메뉴를 숨겨서 그렇게 쉽게 만들 수는 없습니다.

<video oncontextmenu="return false;"  controls>
  <source src="https://yoursite.com/yourvideo.mp4" >
</video>

3

+1 단순하고 크로스 브라우저 방식 : CSS z-index 및 불투명도로 비디오 위에 투명한 그림을 넣을 수도 있습니다. 따라서 사용자는 상황에 맞는 메뉴에서 "비디오 저장"대신 "다른 이름으로 사진 저장"을 볼 수 있습니다.


2
왜 pic 그것은로드하는 데 시간이 걸리므로 div 태그 만 넣으면 다시로드 등의 크롬 메뉴가 나타납니다.
Waqas Tahir

확실하지는 않지만 파일> SaveAs를 통해 비디오를 다운로드 할 수 있습니다
Arun Kumar

3

그만큼

<body oncontextmenu="return false;"> 

더 이상 작동하지 않습니다. 2018 년 6 월 현재 Chrome 및 Opera에는 타임 라인에 바로 다운로드 할 수있는 하위 메뉴가 있으므로 사용자가 해당 비디오를 다운로드하기 위해 마우스 오른쪽 버튼을 클릭 할 필요가 없습니다. 흥미롭게도 Firefox와 Edge에는 이것이 없습니다 ...


2

Vimeo와 같은 서비스 사용 : 로그인 Vimeo > Goto Video > Settings > Privacy > Mark as Secured및 임베드 도메인을 선택하십시오. 퍼가기 도메인이 설정되면 지정된 도메인에서 연결하지 않으면 비디오를 퍼가거나 브라우저에서 비디오를 표시 할 수 없습니다. 따라서 iframe에 Vimeo 플레이어를로드하는 서버에 보안 된 페이지가있는 경우 주변을 둘러보기가 매우 어렵습니다.


2

우선 , 비디오 다운로드를 완전히 막을 수는 없다는 것을 깨달으 십시오 . 더 어렵게 만드는 것 입니다. 즉, 비디오 소스를 숨 깁니다.

웹 브라우저는 비디오를 일시적으로 버퍼에 다운로드하므로 다운로드를 막을 수 있으면 비디오를 볼 수도 없습니다.

또한 전 세계 전체 인구의 1 % 미만이 소스 코드를 이해하여 소스 코드를 이해하는 것이 가능하다는 것을 알고 있어야합니다. 그것은 당신이뿐만 아니라 소스를 숨길해야 의미하지 않는다 - 당신이해야한다 .

당신은해야 하지 해제 마우스 오른쪽 버튼으로 클릭, 그리고 더 적은 당신이 말하는 메시지를 표시해야합니다 "You cannot save this video for copyright reasons. Sorry about that.". 이 답변 에서 제안한대로 .

이것은 사용자에게 매우 성 가시고 혼란 스러울 수 있습니다 . 그 외에도; 그들은 자신의 브라우저에서 자바 스크립트를 사용하지 않으면 그들은 것입니다 마우스 오른쪽 버튼으로 클릭 할 수 있어야하고, 어쨌든 저장합니다.

사용할 수있는 CSS 트릭은 다음과 같습니다.

video {
    pointer-events: none;
}

브라우저에서 CSS를 끌 수 없으므로 실제로 마우스 오른쪽 버튼을 비활성화하지 않고 비디오를 보호하십시오. 그러나 한 가지 문제는 controls활성화 할 수 없다는 것 false입니다. 즉,로 설정해야합니다 . 고유 한 재생 / 일시 정지 기능을 삽입하거나 video태그 와 분리 된 버튼이있는 API를 사용하는 경우 이는 가능한 옵션입니다.

controls 또한 다운로드 버튼이 있으므로 사용하는 것도 좋지 않습니다.

다음은 JSFiddle 예제입니다.


JavaScript를 사용하여 마우스 오른쪽 버튼을 클릭하지 않으려면 비디오 소스도 JavaScript로 저장하십시오. 이렇게하면 사용자가 JavaScript를 비활성화하면 (오른쪽 클릭 허용) 비디오가로드되지 않습니다 (비디오 소스를 조금 더 잘 숨 깁니다).

에서 TxRegex 답변 :

<video oncontextmenu="return false;" controls>
    <source type="video/mp4" id="video">
</video>

이제 JavaScript를 통해 비디오를 추가하십시오 :

document.getElementById("video").src = "https://www.w3schools.com/html/mov_bbb.mp4";

기능적인 JSFiddle


오른쪽 클릭을 방지하는 또 다른 방법은 embed태그 를 사용하는 것 입니다. 그러나 이것은 비디오를 실행하기위한 컨트롤을 제공하지 않으므로 JavaScript로 삽입해야합니다.

<embed src="https://www.w3schools.com/html/mov_bbb.mp4"></embed>

1
JavaScript를 통해 src URL을 추가하는 것은별로 유용하지 않습니다. 스크립트를 설정 한 후 DOM을 검사하면 URL이 잘 보입니다.
시몬

@Simone 동의하지만 html 소스에 직접 표시하는 것보다 낫습니다. 오른쪽 클릭하면 즉시 볼 수 있습니다. 당신은 항상 URL을 분할하거나 암호화 할 수 있습니다. 그러나 추가 처리라는 것을 기억하십시오
Simon

"CSS는 브라우저에서 해제 할 수 없습니다"- 기술적으로는 사용하지 않도록 특정 CSS 규칙 웹 브라우저 개발자 도구에서 CSS를 수정할 수 있습니다, 더 기술에 정통한 사람이 제거 할 수 있도록pointer-events: none;
필 Gibbins

2

글쎄, 당신은 그것을 100 % 보호 할 수는 없지만 더 어렵게 만들 수 있습니다. 내가 설명하는이 방법들은 PluralSightBestDotNetTraining 에서 보호 방법을 연구하는 동안 직면했습니다 . 그럼에도 불구하고,이 방법들 중 어느 것도 내가 원하는 것을 다운로드하는 것을 막지 못했지만, 다운로더를 보호하기 위해 큐레이터를 다루는 데 어려움을 겪었습니다.

상황에 맞는 메뉴를 비활성화하는 다른 언급 된 방법 외에도. 사용자는 여전히 InternetDownload 관리자 또는 기타 유사한 소프트웨어와 같은 타사 도구를 사용하여 비디오를 다운로드 할 수 있습니다. 여기서 설명하는 보호 방법은 타사 소프트웨어를 완화하는 것입니다.

이러한 모든 방법의 요구 사항은 누군가가 비디오를 다운로드하고 있음을 식별 할 때 사용자를 차단하는 것입니다. 이러한 방식으로 웹 사이트에 대한 액세스를 금지하기 전에 하나 또는 두 개의 비디오 만 다운로드 할 수 있습니다.

부인 성명

누군가가 이러한 방법을 악용하거나 다른 사람이나 예를 들어 언급 한 웹 사이트에 해를 입히는 데 책임을지지 않습니다. 지적 제품을 보호 할 수 있도록 지식을 공유하기위한 것입니다.

만료 된 링크를 생성

이를 위해서는 사용자 당 다운로드 링크를 작성해야합니다. azure blob storage 또는 amazon s3으로 쉽게 처리 할 수 ​​있습니다. 비디오 길이 만료 타임 스탬프의 두 배로 다운로드 링크를 만들 수 있습니다. 그런 다음 해당 비디오 링크와 요청 된 시간을 캡처해야합니다. 이것은 다음 방법에 필요합니다. 이 방법은 사용자가 재생 버튼을 클릭 할 때 다운로드 링크를 생성하는 것입니다.

재생 버튼 이벤트시 서버에 요청을 보내고 링크를 가져 와서 소스를 업데이트하십시오.

비디오 요청 속도 조절

그런 다음 두 번째 비디오에 대한 사용자 요청 속도를 모니터링합니다. 사용자가 다운로드 링크를 너무 빨리 요청하면 즉시 차단합니다. 비디오를 탐색하거나 훑어 보는 사용자를 실수로 차단할 수 있기 때문에이 임계 값을 너무 크게 설정할 수 없습니다.

HTTP 범위 활성화

videojs 와 같은 js 라이브러리를 사용 하여 비디오를 재생하고 헤더에 AcceptRange를 반환해야합니다. Azure Blob Storage는 기본적으로이를 지원합니다. 이런 식으로 브라우저는 청크별로 비디오 청크를 다운로드하기 시작합니다. 일반적으로 32 바이트 x 32 바이트입니다. 그런 다음 videojs timeupdate변경 사항 을 듣고 비디오를 시청 한 비율에 대해 서버를 업데이트해야합니다. 동영상 시청 비율은 동영상 게재 비율을 초과 할 수 없습니다. 비율 변경없이 동영상 콘텐츠를 제공하는 경우 사용자를 차단할 수 있습니다. 그들이 다운로드하고 있기 때문에.

사용자가 비디오를 앞뒤로 건너 뛸 수 있으므로이를 구현할 때 이에주의해야합니다.

이것이 BestDotnetTraining이 timeupdate

myPlayer.ready(function () {
    //var player = this;
    this.src({
        type: "video/mp4",
        src: videoURL
    });
    if (videoId) {
        myPlayer.play();
        this.on('timeupdate', function () {
            var currentPercent = parseInt(100 * myPlayer.currentTime() / myPlayer.duration());//calcualte as percentage
            if (currentPercent % 5 == 0) {
                //send percentage to server 
                SaveVideoDurationWatched(currentPercent, videoId);
            }
        });
    }

});

어쨌든 사용자는 스트리밍을 통해 파일을 다운로드하는 일부 다운로드 방법을 사용하여이 문제를 해결할 수 있습니다. 거의 C #은 즉시 사용 가능하며 nodejs의 경우 request모듈 을 사용할 수 있습니다 . 그런 다음 stopWatch를 시작하고 수신 된 패키지를 듣고 수신 된 총 바이트를 총 크기와 비교해야합니다. 이 방법으로 백분율과 백분율을 얻는 데 소요 된 시간을 계산할 수 있습니다. 그런 다음 Thread.Sleep()또는 이와 유사한 것을 사용하여 비디오를 정상적으로 볼 때 기다려야하는 양을 스레드를 지연시킵니다. 또한 휴면 전에 사용자는 서버를 호출하고 수신 비율을 업데이트 할 수 있습니다. 서버는 사용자가 실제로 비디오를보고 있다고 생각합니다.

계산은 다음과 같습니다. 예를 들어 지금까지 1 %를 받았다고 계산하면 다운로드 스레드를 잠자기 위해 대기해야하는 양을 계산할 수 있습니다. 이런 식으로 실제 길이보다 빨리 비디오를 다운로드 할 수 없습니다. 동영상이 24 분인 경우 다운로드하는 데 24 분이 걸립니다. (그리고 첫 번째 방법에 넣은 임계 값)

original video length 24 minute
24 min *60000 = 1,440,000 miliseconds 
1,440,000 % 100 = 14,400 milisecond is needed to download one percent

브라우저 에이전트를 확인하십시오

웹 페이지를 제공하고 비디오 링크를 제공하거나 진행 업데이트 요청을 수락하면 브라우저 에이전트를 볼 수 있습니다. 다른 경우 사용자를 금지하십시오.

일부 구형 브라우저는이 정보를 전달하지 않습니다. 따라서 비디오 요청과 웹 페이지 요청 모두에 브라우저 에이전트가없는 경우이를 무시해야합니다. 그러나 한 요청에는 요청이 있고 다른 요청에는 그렇지 않은 경우 사용자를 금지해야합니다.

이 문제를 해결하기 위해 사용자는 다운로드 링크를 캡처하는 데 사용하는 헤드리스 브라우저와 동일한 브라우저 에이전트 헤더를 수동으로 설정할 수 있습니다.

참조 헤더를 확인하십시오

리퍼러가 비디오를 제공하는 호스트 URL 또는 페이지 URL 이외의 것이면 사용자가 다운로드 링크를 다른 탭이나 다른 응용 프로그램에 넣기 때문에 사용자를 차단할 수 있습니다. 진행 업데이트 요청에 대해서도 그렇게 할 수 있습니다.

이를 위해서는 비디오와 해당 비디오를 보여주는 페이지를 매핑해야합니다. URL이 무엇인지 이해하기 위해 몇 가지 규칙이나 패턴을 만들 수 있으며 디자인에 달려 있습니다.

이 문제를 해결하기 위해 사용자는 비디오를 다운로드 할 때 참조 페이지 헤더와 수동으로 참조 페이지 헤더를 설정할 수 있습니다.

요청 사이의 시간을 계산

요청 간 시간이 동일한 요청을 너무 많이받는 경우 사용자를 차단해야합니다. 비디오 링크 생성 요청 사이의 시간을 캡처하려면이 값을 넣어야합니다. 이들이 동일하고 (임계의 플러스 / 빼기) 여러 번 이상 발생하면 사용자를 차단할 수 있습니다. 웹 사이트 나 동영상을 크롤링 할 봇이있는 경우 일반적으로 요청간에 동일한 휴면 시간을 갖기 때문입니다. 예를 들어 1.3 (플러스 / 분 약간의 편차) 분마다 각 요청을받는 경우 그런 다음 알람을 발생시킵니다. 이를 위해 통계 계산을 사용하여 요청 간의 편차를 알 수 있습니다.

이 문제를 해결하기 위해 사용자는 요청간에 임의의 휴면 시간을 둘 수 있습니다.

샘플 코드

나는 반쯤하는 reural PluralSight-Downloader 를 가지고 있습니다. 나는이 레포를 거의 5 년 전에 만들었습니다. 내가 연구 목적으로 쓰고 개인적인 용도로만 사용했기 때문에, repo는 지금까지 어떤 업데이트도받지 않았으며, 업데이트하거나 작업하기 쉽게 만들지 않을 것입니다. 그것은 어떻게 할 수 있는지에 대한 예일뿐입니다.



1

간단한 답변 : youtube처럼 링크를 암호화하십시오 . youtube / google에게 어떻게하는지 물어 보는 것보다 모르겠습니다. (만약 당신이 요점을 정확히 알고 싶을 때를 대비해서)

나는 유튜브가 그것을 할 수 있기 때문에 이것이 가능하고 다른 웹 사이트도 가능하고 브라우저에서 나온 것이 아니라는 것을 지적하고 싶습니다. 마이크로 소프트 엣지 및 인터넷 익스플로러와 같은 두 브라우저에서 테스트했기 때문에 그래서 그것을 비활성화 할 수있는 방법이 있으며 사람들이 여전히 그것을 말하고 있음을 보았습니다 ... 유튜브가 할 수있는 것보다 그들이 할 수있는 방법과 방법을 볼 수있는 유일한 방법은 누군가가 내가 지금하고있는 유튜브의 스크립트. 또한 사용자 정의 상황에 맞는 메뉴인지 확인했으며 상황에 맞는 메뉴가 inspect 요소를 넘쳐 흐르지 않았기 때문에 아닙니다. 위에있는 것처럼 보였고 결코 보지 않았으며 결코 새로운 클래스를 만들지 않습니다. 실제로 자바 스크립트로 inspect 요소에 액세스 할 수 없으므로 불가능합니다. Chrome의 상황에 맞는 메뉴가 표시되는 YouTube 동영상을 마우스 오른쪽 버튼으로 두 번 클릭하면 알 수 있습니다. 게다가 ... YouTube는 그 기능을 추가하지 않을 것입니다. 나는 연구를 진행하고 있으며 YouTube 소스를 살펴보고 있으므로 답을 찾으면 돌아올 것입니다 ... 누군가가 할 수 없다고 말하면, 그들은하지 못했습니다. 나처럼 연구를한다. YouTube 비디오를 다운로드하는 유일한 방법은 비디오 다운로드를 통해서입니다.

좋아 ... 연구를했는데 내 자바 스크립트가없는 경우를 제외하고는 비활성화 할 수 있다고 남아 있습니다 ... 내 생각에 비디오를 비활성화 할 수 있도록 비디오 링크를 암호화 할 수 있어야합니다. 브라우저에서 찾을 수 없으면 표시되지 않으며 YouTube 비디오 링크를 열면 "blob : https://www.youtube.com/e5c4808e-297e-451f-80da-3e838caa1275"인용 부호가 없으므로 암호화되어 저장되지 않습니다 ... PHP를 알아야하지만, 더 열심히 만들기 위해 선택한 답변처럼 YouTube는 암호화를 가장 어렵게 만듭니다. 사전 PHP 프로그래머이지만 모르는 경우 선택한 사람을 가져 와서 다운로드하기가 가장 어려운 답변으로 생각하는 것보다 ...하지만 PHP를 알고 있다면 비디오 링크를 무겁게 암호화하여 읽을 수 있습니다. YouTube에서 동영상을 암호화하는 방법은 매우 영리하므로 YouTube / Google에 요청하는 것보다 방법을 알고 싶다면 이미 최선의 답변을 선택했지만 도움이 되길 바랍니다 링크를 암호화하는 것이 단기적으로 가장 좋습니다.


0

웹 소켓을 통해 비디오를 스트리밍하는 것은 프레임을 스트리밍하고 캔버스에 그리는 것과 같이 실행 가능한 옵션입니다.

JavaScript를 사용하여 웹 소켓을 통한 비디오 스트리밍

클라이언트가 비디오를 획득하고 "비디오를 다른 이름으로 저장 ..."마우스 오른쪽 단추 클릭 상황에 맞는 메뉴 옵션 (과도한?!


0

내가 한 일은 다음과 같습니다.

function noRightClick() {
      alert("You cannot save this video for copyright reasons. Sorry about that.");
}
    <body oncontextmenu="noRightClick();">
    <video>
    <source src="http://calumchilds.com/videos/big_buck_bunny.mp4" type="video/mp4">
    </video>
    </body>
이것은 이미지, 텍스트 및 거의 모든 것에 대해서도 작동합니다. 그러나 바로 가기 키를 통해 "검사"및 "소스보기"도구에 계속 액세스 할 수 있습니다. (맨 위의 답변에서 알 수 있듯이 완전히 멈출 수는 없습니다.) 그러나 장애물을 막기 위해 장벽을 세우려고 시도 할 수 있습니다.


-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

"이상한 것은 원 k에 닿아있다"(사실)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.