Ngăn video HTML5 không được tải xuống (nhấp chuột phải được lưu)?


171

Làm cách nào tôi có thể tắt "Lưu video dưới dạng ..." từ menu chuột phải của trình duyệt để ngăn khách hàng tải xuống video?

Có giải pháp nào đầy đủ hơn ngăn khách hàng truy cập trực tiếp vào đường dẫn tệp không?


3
Tôi đã bình chọn câu hỏi này vì nó chỉ hoàn toàn hỏi về cách "vô hiệu hóa nhấp chuột phải" cho video HTML5. Tôi không chắc chắn nếu nó tương tự như vô hiệu hóa nhấp chuột phải cho hình ảnh bình thường hoặc nếu có các thủ thuật lớp phủ khác, vv, có thể được áp dụng.

3
Ngay cả khi bạn tắt nhấp chuột phải, họ vẫn có thể lưu nó từ menu trình duyệt ( File→Save As). Ngay cả khi bạn bằng cách nào đó có thể chặn điều đó, họ có thể xem nguồn để tìm URL của tệp. Ngay cả khi bạn có thể che khuất điều đó một chút, họ có thể trích xuất nó từ bộ đệm. Ngay cả khi bạn có thể làm phức tạp điều đó (ví dụ: truyền phát), họ có thể nắm bắt lưu lượng mạng bằng một trình thám thính hoặc một cái gì đó. Thực tế là, nếu bạn gửi nó cho người dùng, họ có thể lưu nó. Không có cách nào xung quanh đó. Câu hỏi bạn cần đặt ra là tại sao bạn cần ngăn chặn nó quá tệ. Có thực sự thậm chí là cần thiết? Có đáng để bỏ công sức và không thân thiện với người dùng không?
Synetech

Tôi thích TxRegex trả lời tốt nhất như một giải pháp cơ bản nhanh chóng.
jsherk

Tôi sẽ xem xét phạm vi ở đây, nhưng bạn đang quá tải cụm từ "tải xuống". Tất nhiên bạn muốn cho phép video được tải xuống.
Johan Boulé

Câu trả lời:


226

Bạn không thể . Đó là bởi vì đó là những gì trình duyệt được thiết kế để làm: Phục vụ nội dung . Nhưng bạn có thể làm cho nó khó khăn hơn để tải về .

Điều đầu tiên, bạn có thể vô hiệu hóa contextmenusự kiện , còn gọi là "nhấp chuột phải". Điều đó sẽ ngăn skiddie thường xuyên của bạn trích xuất video của bạn một cách trắng trợn bằng cách nhấp chuột phải và Lưu dưới dạng. Nhưng sau đó, họ có thể vô hiệu hóa JS và khắc phục điều này hoặc tìm nguồn video thông qua trình gỡ lỗi của trình duyệt. Thêm vào đó là UX xấu. Có rất nhiều điều hợp pháp trong một menu ngữ cảnh chứ không chỉ Save As.

Bạn cũng có thể sử dụng các thư viện trình phát video tùy chỉnh. Hầu hết trong số họ thực hiện các trình phát video tùy chỉnh menu ngữ cảnh theo ý thích của bạn. Vì vậy, bạn không nhận được menu ngữ cảnh trình duyệt mặc định. Và nếu họ từng phục vụ một mục menu tương tự như Save As, bạn có thể vô hiệu hóa nó. Nhưng một lần nữa, đây là một cách giải quyết của JS. Điểm yếu tương tự như tùy chọn trước đó.

Một cách khác để làm điều đó là phân phát video bằng HTTP Live Streaming . Những gì nó về cơ bản là cắt video thành nhiều phần và lần lượt từng video. Đây là cách hầu hết các trang web phát trực tuyến phục vụ video. Vì vậy, ngay cả khi bạn quản lý để lưu dưới dạng, bạn chỉ lưu một đoạn chứ không phải toàn bộ video. Sẽ mất thêm một chút nỗ lực để thu thập tất cả các khối và khâu chúng bằng một số phần mềm chuyên dụng.

Một kỹ thuật khác là vẽ <video>trên<canvas> . Trong kỹ thuật này, với một chút JavaScript, những gì bạn nhìn thấy trên trang là một <canvas>khung hiển thị phần tử từ một ẩn <video>. Và bởi vì đó là một <canvas>, menu ngữ cảnh sẽ sử dụng <img>menu của một người, không phải là một <video>. Bạn sẽ nhận được Lưu hình ảnh thay vì Lưu video dưới dạng.

Bạn cũng có thể sử dụng mã thông báo CSRF để lợi thế của bạn. Bạn sẽ yêu cầu sever của bạn gửi mã thông báo trên trang. Sau đó, bạn sử dụng mã thông báo đó để tải video của mình. Máy chủ của bạn sẽ kiểm tra xem đó có phải là mã thông báo hợp lệ hay không trước khi phân phát video hoặc nhận HTTP 401 . Ý tưởng là bạn chỉ có thể nhận được video bằng cách có mã thông báo mà bạn chỉ có thể nhận được nếu bạn đến từ trang, không truy cập trực tiếp vào url video.

Vào cuối ngày, tôi chỉ cần tải video của mình lên một trang web video của bên thứ ba, như YouTube hoặc Vimeo. Họ có các công cụ quản lý video tốt, tối ưu hóa phát lại cho thiết bị và họ nỗ lực trong việc ngăn chặn video của họ bị rách với nỗ lực bằng không về phía bạn.


1
cảm ơn bạn đã trả lời chi tiết, ít nhất có thể vô hiệu hóa tùy chọn lưu dưới dạng từ menu chuột phải không? nó sẽ bao gồm hầu hết các trường hợp kiến ​​thức cơ bản
con trăn

2
điều đó phụ thuộc vào trình duyệt. Tôi đã thấy nhiều lần (đặc biệt là firefox và chrome) rằng nếu video được tải đầy đủ, khi bạn nhấn "lưu", họ chỉ chọn video từ bộ đệm thay vì tải xuống lại (video đã được tải xuống trong bộ đệm, tại sao tải xuống một lần nữa?), do đó không có yêu cầu thứ hai. phương pháp trên chỉ được áp dụng khi liên kết được sử dụng lại.
Joseph

1
tốt, tôi đã tìm thấy một bài viết nói về việc phủ thẻ video bằng div. đã cập nhật câu trả lời của tôi
Joseph

2
Cảm ơn. Tôi chỉ đọc craftymind.com/factory/html5video/CanvasVideo.html . Ý tưởng gần giống như câu trả lời của bạn.
Trung

1
@Coolvogel "url sử dụng một lần" là điểm cuối của máy chủ chấp nhận mã thông báo được tạo bởi máy chủ. Mã thông báo được tạo khi tạo trang và được lưu vào db. Nó cũng được vận chuyển với các trang như srccủa <video>. Vào thời điểm trang của bạn được tải, db có mã thông báo, trang có mã thông báo. Khi <video>bắt đầu tải (Truy cập điểm cuối), máy chủ sẽ kiểm tra xem mã thông báo có trong db không, xóa nó và truyền tệp. Nếu mã thông báo không có ở đó do kết quả của lần truy cập thứ hai , thì đừng truyền phát tệp.
Joseph

118

Đây là một giải pháp đơn giản cho những ai muốn xóa tùy chọn "lưu" nhấp chuột phải khỏi video html5

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

Thật là tuyệt vời! Nó làm một công việc tuyệt vời để ngăn chặn người bình thường tải xuống video!
Etienne Noël

2
Tuy nhiên, điều này không giúp ích gì nếu JavaScript bị vô hiệu hóa trong trình duyệt.
mvark

2
Cảm ơn, giải pháp này là hiệu quả cho 90% tất cả khách truy cập của chúng tôi.
Kai Noack

2
Thôi nào. Chỉ cần kiểm tra phần tử trong Fireorms, xem srcthuộc tính và mở nó trong tab khác hoặc sử dụng wgetđể tải xuống!
SexyBeast

11
Tôi nghĩ mục đích chính của việc này là để tránh người dùng "bình thường" tải xuống video. Đây là một giải pháp tốt để giải quyết tình trạng này.
Ungedra

37

Câu trả lời đơn giản

BẠN KHÔNG THỂ

Nếu họ đang xem video của bạn, họ đã có nó

Bạn có thể làm chậm chúng nhưng không thể ngăn chúng lại.


Nhân tiện, câu trả lời này áp dụng với video HTML5, video flash hoặc bất kỳ công nghệ nào bạn có thể tưởng tượng trong tương lai. Thật đơn giản: đó là cách nó hoạt động.
Gustavo Coleues

Còn youtube thì sao?, Trên youtube bạn không thể loại bỏ tệp video một cách dễ dàng. Ý tôi là ok, bạn nói đúng, chúng tôi có thể, nhưng dễ dàng ẩn nguồn mp4 trên youtube hoặc lưu trữ video tương tự hơn là lưu trữ một mp4 đơn giản trong máy chủ của chúng tôi và sử dụng trình phát html5.
dlopezgonzalez

2
Đó không phải là một câu trả lời cho một trong hai câu hỏi.
Tzshand

1
Mọi người có thể ghi lại toàn bộ màn hình và âm thanh của họ và đánh lừa tất cả các cách giải quyết, đó là lý do tại sao chúng chỉ có thể bị chậm lại.
kintsukuroi

1
@IlanSooloul Thú vị. Cảm ơn đã chia sẻ :)
Starx

33

Có, bạn có thể làm điều này trong ba bước:


  1. Đặt các tệp bạn muốn bảo vệ trong thư mục con của thư mục nơi mã của bạn đang chạy.

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

  2. Lưu một tệp trong thư mục con có tên ".htaccess" và thêm các dòng bên dưới.

    www.foo.com/ideo/.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]
    

Bây giờ liên kết nguồn là vô dụng , nhưng chúng tôi vẫn cần đảm bảo bất kỳ người dùng nào cố tải xuống tệp đều có thể được phục vụ trực tiếp tệp.

  1. Để có giải pháp hoàn chỉnh hơn , giờ hãy phân phát video bằng trình phát flash (hoặc canvas html) và không bao giờ liên kết trực tiếp với video. Để chỉ xóa menu chuột phải, hãy thêm vào HTML của bạn:

    <body oncontextmenu="return false;">


Kết quả:

www.foo.com/player.html sẽ phát video chính xác , nhưng nếu bạn truy cập www.foo.com/ideo/video.mp4:

Mã lỗi 403: FORBIDDEN


Điều này sẽ làm việc để tải trực tiếp, cURL, hotlinking, bạn đặt tên cho nó.

Đây là một câu trả lời hoàn chỉnh cho hai câu hỏi được hỏi và không phải là câu trả lời cho câu hỏi: "tôi có thể ngăn người dùng tải xuống video mà họ đã tải xuống không."


1
Câu trả lời tuyệt vời, nhưng bạn có một `mà bạn nên xóa nó khỏi .htaccessnội dung của mình
MAZux

2
Bạn vẫn có thể giả mạo Trình giới thiệu HTTP, điều này sẽ cho phép một người tải xuống. Tuy nhiên, đây là một giải pháp rất thông minh. Nếu bạn câu lạc bộ này với mã một lần trong tệp, bạn sẽ ổn thôi!
Shiroy

Dường như IDM vẫn có thể tải xuống!
Người Ba Tư

@PersianMan Đúng - Tôi khuyến khích bạn đọc câu trả lời đầu tiên
Tzshand

1
Nếu bạn tắt javascript khỏi trình duyệt, thì thủ thuật này sẽ không hoạt động, kể từ đó nhấp chuột phải được bật. Để tránh điều đó, bạn nên tìm nạp và tải phần tử video một cách linh hoạt bằng cách sử dụng jquery.
Anindya Sankar Dasgupta

23

Cách tốt nhất mà tôi thường sử dụng rất đơn giản, tôi hoàn toàn vô hiệu hóa menu ngữ cảnh trong toàn bộ trang, thuần html + javascript:

 <body oncontextmenu="return false;">

Đó là nó! Tôi làm điều đó bởi vì bạn luôn có thể nhìn thấy nguồn bằng cách nhấp chuột phải.
Ok, bạn nói: "Tôi có thể sử dụng trực tiếp nguồn xem trình duyệt" và điều đó đúng nhưng chúng tôi bắt đầu từ thực tế là bạn KHÔNG thể ngừng tải xuống html5video.


Tôi nghĩ rằng solución phải là một thứ không làm phiền người dùng "bình thường", vô hiệu hóa nhấp chuột phải sẽ ngăn người dùng sao chép và dán một số văn bản hoặc tìm kiếm một từ mà họ đang xen vào, ví dụ như không phải là tiêu đề của video, tất nhiên là không tất cả người dùng có thể sẽ làm điều đó nhưng nó có thể gây ngạc nhiên cho một số người trong số họ
John Balvin Arias

14

Là nhà phát triển phía máy khách, tôi khuyên bạn nên sử dụng URL blob, URL blob là URL phía máy khách dùng để chỉ đối tượng nhị phân

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

trong HTML để srctrống video của bạn và trong JS tìm nạp tệp video bằng AJAX, hãy đảm bảo loại phản hồi là 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();
}

Lưu ý: Phương pháp này không được khuyến nghị cho tệp lớn

BIÊN TẬP

  • Sử dụng chặn nguồn gốc chéo để tránh tải xuống trực tiếp

  • nếu video được phân phối bởi API Sử dụng phương pháp khác (PUT / POST) thay vì 'GET'


3
YouTube sử dụng Blob bây giờ quá tôi nghĩ :)?
C0nw0nk

1
Bạn có thể giải thích những gì đang diễn ra ở đây rõ ràng hơn và làm thế nào để thiết lập máy chủ cho việc này không?
Anthony

1
@nerdofcode làm thế nào để hành xử khi người dùng cố gắng chuyển tiếp video? Họ sẽ cần phải đợi cho đến khi tất cả các video tải về?
John Balvin Arias

1
@JohnBalvinArias! Tôi đã không kiểm tra 100% này, nhưng tôi sẽ nói rằng nó chỉ cần một bộ đệm nhanh chóng ... Đừng trích dẫn tôi về điều này mặc dù ...
NerdOfCode

1
Nếu tôi kiểm tra trang, trong tab Mạng, tôi nhận được yêu cầu cho video mà tôi có thể mở trong một tab mới.
Simone

10

PHP gửi thẻ video html5 cùng với một phiên trong đó khóa là một chuỗi ngẫu nhiên và giá trị là tên tệp.

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>'; 

Bây giờ PHP được yêu cầu gửi video. PHP phục hồi tên tệp; xóa phiên và gửi video ngay lập tức. Ngoài ra, tất cả các tiêu đề 'không có bộ đệm' và loại mime phải có mặt.

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:

Bây giờ nếu người dùng sao chép url trong một tab mới hoặc sử dụng menu ngữ cảnh, anh ta sẽ không gặp may.


Tôi thích giải pháp - nó giải quyết câu hỏi OP. Một điều đáng tiếc là, khi kiểm tra mã nguồn trong Chrome và nhấp chuột phải vào liên kết. Người dùng sẽ tải xuống một tệp html, trong thực tế sẽ là tệp video.
dùng1252280

5

Bạn ít nhất có thể ngăn những người không am hiểu về công nghệ sử dụng menu ngữ cảnh nhấp chuột phải để tải xuống video của bạn. Bạn có thể vô hiệu hóa menu ngữ cảnh cho bất kỳ phần tử nào bằng thuộc tính oncontextmenu.

oncontextmenu="return false;"

Điều này hoạt động cho phần tử cơ thể (toàn bộ trang) hoặc chỉ một video sử dụng nó trong thẻ video.

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

5

Chúng tôi đã kết thúc bằng AWS CloudFront với các URL hết hạn. Video sẽ tải, nhưng đến lúc người dùng nhấp chuột phải và chọn Lưu Vì url video mà họ nhận được ban đầu đã hết hạn. Thực hiện tìm kiếm Danh tính truy cập nguồn gốc CloudFront.

Sản xuất url video yêu cầu một cặp khóa có thể được tạo trong AWS CLI. FYI đây không phải là mã của tôi nhưng nó hoạt động rất tốt!

$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
Nhận xét đánh giá thấp. Tuy nhiên, tôi khuyên bạn nên sử dụng docs.aws.amazon.com/sdk-for-php/v3/developer-guide/ .
Zmart

Nếu mã thông báo hết hạn, điều đó có nghĩa là họ cũng không thể điều hướng xung quanh video? Vì điều này dường như liên hệ lại với URL video.
Chud37

4

Chúng ta có thể làm điều đó không dễ dàng bằng cách ẩn menu ngữ cảnh, như thế này:

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

3

+1 cách đơn giản và đa trình duyệt: Bạn cũng có thể đặt hình ảnh trong suốt lên video với css z-index và độ mờ. Vì vậy, người dùng sẽ thấy "lưu ảnh dưới dạng" thay vì "lưu video" trong menu ngữ cảnh.


2
Tại sao pic sẽ mất thời gian để tải vì vậy chỉ cần đặt thẻ div và họ sẽ nhận được một menu lớn của chrome như tải lại, v.v.
Waqas Tahir

Tôi không chắc nhưng vẫn có thể tải xuống video qua Tệp> SaveAs
Arun Kumar

3

Các

<body oncontextmenu="return false;"> 

công việc ngắn hạn. Chrome và Opera kể từ tháng 6 năm 2018 có một menu con trên dòng thời gian để cho phép tải thẳng, vì vậy người dùng không cần phải nhấp chuột phải để tải xuống video đó. Điều thú vị là Firefox và Edge không có ...


2

Sử dụng một dịch vụ như Vimeo: Đăng nhập Vimeo > Goto Video > Settings > Privacy > Mark as Securedvà cũng chọn các tên miền nhúng. Khi các tên miền nhúng được đặt, nó sẽ không cho phép bất kỳ ai nhúng video hoặc hiển thị nó từ trình duyệt trừ khi kết nối từ các miền được chỉ định. Vì vậy, nếu bạn có một trang được bảo mật trên máy chủ tải trình phát Vimeo trong iframe, điều này sẽ khiến việc truy cập trở nên khá khó khăn.


2

Trước hết nhận ra rằng không thể ngăn chặn hoàn toàn một video được tải xuống, tất cả những gì bạn có thể làm là làm cho nó khó khăn hơn . Tức là bạn ẩn nguồn của video.

Trình duyệt web tạm thời tải xuống video trong bộ đệm, vì vậy nếu có thể ngăn tải xuống, bạn cũng sẽ ngăn video được xem.

Bạn cũng nên biết rằng <1% tổng dân số thế giới sẽ có thể hiểu được mã nguồn khiến nó khá an toàn. Điều đó không có nghĩa là bạn cũng không nên giấu nó trong nguồn - bạn nên làm vậy .

Bạn không nên vô hiệu hóa nhấp chuột phải và thậm chí ít hơn bạn sẽ hiển thị thông báo cho biết "You cannot save this video for copyright reasons. Sorry about that.". Như đề xuất trong câu trả lời này .

Điều này có thể rất khó chịu và gây nhầm lẫn cho người dùng. Ngoài ra; nếu họ vô hiệu hóa JavaScript trên trình duyệt của họ, họ sẽ có thể nhấp chuột phải và lưu lại bằng mọi cách.

Đây là một mẹo CSS bạn có thể sử dụng:

video {
    pointer-events: none;
}

CSS không thể tắt trong trình duyệt, bảo vệ video của bạn mà không thực sự vô hiệu hóa nhấp chuột phải. Tuy nhiên, một vấn đề là controlskhông thể được kích hoạt, nói cách khác, chúng phải được đặt thành false. Nếu bạn định áp dụng chức năng Phát / Tạm dừng của riêng mình hoặc sử dụng API có các nút riêng biệt cho videothẻ thì đây là một tùy chọn khả thi.

controls cũng có một nút tải xuống vì vậy sử dụng nó cũng không phải là một ý tưởng tốt.

Dưới đây là một ví dụ về JSFiddle .


Nếu bạn định vô hiệu hóa nhấp chuột phải bằng JavaScript thì cũng lưu trữ nguồn của video bằng JavaScript. Theo cách đó, nếu người dùng vô hiệu hóa JavaScript (cho phép nhấp chuột phải) video sẽ không tải (nó cũng ẩn nguồn video tốt hơn một chút).

Từ câu trả lời của TxRegex :

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

Bây giờ thêm video qua JavaScript:

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

Chức năng JSFiddle


Một cách khác để ngăn chặn nhấp chuột phải liên quan đến việc sử dụng embedthẻ. Tuy nhiên, điều này không cung cấp các điều khiển để chạy video, vì vậy chúng sẽ cần được áp dụng trong JavaScript:

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

1
Thêm URL src qua JavaScript không hữu ích lắm. Kiểm tra DOM sẽ hiển thị URL trong tầm nhìn rõ ràng sau khi tập lệnh được đặt.
Simone

@Simone Tôi đồng ý, tuy nhiên tốt hơn là hiển thị trực tiếp trong nguồn html, nơi bất kỳ ai nhấp chuột phải đều có thể thấy nó ngay lập tức. Bạn luôn có thể tách url hoặc mã hóa nó. Nhưng hãy nhớ rằng đó là xử lý bổ sung
Simon

"CSS không thể tắt trong trình duyệt" - Về mặt kỹ thuật, bạn có thể sửa đổi CSS trong các công cụ dành cho nhà phát triển trình duyệt web để vô hiệu hóa một số quy tắc CSS, do đó, một người am hiểu công nghệ hơn có thể xóapointer-events: none;
Phil Gibbins

2

tốt, bạn không thể bảo vệ nó 100% nhưng bạn có thể làm cho nó khó hơn. những phương pháp mà tôi đang giải thích, tôi đã đối mặt với chúng trong quá trình nghiên cứu các phương pháp bảo vệ trong PluralSightBestDotNetTraining . tuy nhiên, không có phương pháp nào trong số này ngăn tôi tải xuống những gì tôi muốn, nhưng tôi đã có một thời gian khó khăn để quản lý trình tải xuống để vượt qua sự bảo vệ của họ.

Ngoài các phương pháp được đề cập khác để vô hiệu hóa menu ngữ cảnh. người dùng vẫn có thể sử dụng các công cụ của bên thứ ba như trình quản lý InternetD Download hoặc phần mềm tương tự khác để tải xuống video. phương pháp bảo vệ mà tôi giải thích ở đây là giảm thiểu các phần mềm bên thứ 3 đó.

yêu cầu của tất cả các phương pháp này là chặn người dùng khi bạn xác định ai đó đang tải xuống video của mình. bằng cách này, họ chỉ có thể tải xuống một hoặc hai video trước khi bạn cấm họ truy cập vào trang web của bạn.

từ chối trách nhiệm

Tôi sẽ không chấp nhận bất kỳ trách nhiệm nào nếu ai đó lạm dụng các phương pháp này hoặc sử dụng nó để gây hại cho người khác hoặc các trang web mà tôi đã đề cập làm ví dụ. nó chỉ để chia sẻ kiến ​​thức để giúp bạn bảo vệ sản phẩm trí tuệ của mình.

tạo liên kết với thời hạn sử dụng

yêu cầu cho việc này là tạo liên kết tải xuống cho mỗi người dùng. người ta có thể dễ dàng xử lý bằng cách lưu trữ blob azure hoặc amazon s3. bạn có thể tạo một liên kết tải xuống với hai lần dấu thời gian hết hạn của video. sau đó bạn cần phải quay liên kết video đó và thời gian được yêu cầu. điều này là cần thiết cho phương pháp tiếp theo. Điều hấp dẫn cho phương pháp này là bạn đang tạo liên kết tải xuống khi người dùng nhấp vào nút phát.

trên sự kiện nút play, bạn sẽ gửi yêu cầu đến máy chủ và nhận liên kết và cập nhật nguồn.

tăng tốc độ yêu cầu video

sau đó bạn theo dõi tốc độ yêu cầu của người dùng cho video thứ hai. nếu người dùng yêu cầu liên kết tải xuống quá nhanh, thì bạn chặn chúng ngay lập tức. bạn không thể đặt ngưỡng này quá lớn vì bạn có thể chặn nhầm người dùng chỉ duyệt hoặc lướt qua các video.

Kích hoạt phạm vi HTTP

sử dụng một số thư viện js như videojs để phát video của bạn, bạn cũng cần phải trả lại AcceptRange trong tiêu đề của mình. Azure blob lưu trữ hỗ trợ này ra khỏi hộp. bằng cách này, trình duyệt bắt đầu tải xuống đoạn video bằng đoạn. thông thường, 32byte bằng 32byte. sau đó bạn cần nghe videojs timeupdatethay đổi và cập nhật máy chủ của bạn về tỷ lệ phần trăm mà video được xem. tỷ lệ phần trăm mà video được xem không thể nhiều hơn tỷ lệ phần trăm mà video được phân phối. và nếu bạn đang phân phối nội dung video mà không nhận được bất kỳ thay đổi phần trăm nào, thì bạn có thể chặn người dùng. bởi vì chắc chắn họ đang tải xuống

thực hiện điều này là khó khăn vì người dùng có thể bỏ qua video tiến hoặc lùi vì vậy hãy có ý thức về điều này khi bạn đang thực hiện điều này.

đây là cách BestDotnetTraining xử lý 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);
            }
        });
    }

});

dù sao, người dùng có thể giải quyết vấn đề này bằng cách sử dụng một số phương pháp tải xuống để tải xuống tệp thông qua phát trực tuyến. Hầu như c # làm điều đó ra khỏi hộp và đối với nodejs, bạn có thể sử dụng requestmô-đun. sau đó bạn cần bắt đầu một đồng hồ bấm giờ, lắng nghe một gói đã nhận và so sánh tổng số byte nhận được so với tổng kích thước. bằng cách này bạn có thể tính được tỷ lệ phần trăm và thời gian sử dụng để có được tỷ lệ phần trăm đó. sau đó sử dụng Thread.Sleep()hoặc một cái gì đó tương tự để trì hoãn chuỗi số tiền mà bạn phải chờ nếu bạn xem video bình thường. Ngoài ra trước khi ngủ, người dùng có thể gọi máy chủ và cập nhật tỷ lệ phần trăm nhận được. vì vậy máy chủ nghĩ rằng người dùng thực sự đang xem video.

phép tính sẽ giống như thế này, ví dụ, nếu bạn tính rằng bạn đã nhận được 1 phần trăm cho đến nay, thì bạn có thể tính toán số tiền mà bạn nên đợi để ngủ chuỗi tải xuống. bằng cách này, bạn không thể tải xuống video nhanh hơn thời lượng thực tế. nếu một video là 24 phút. sẽ mất 24 phút để tải xuống. (cộng với ngưỡng chúng tôi đặt trong phương thức đầu tiên)

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

kiểm tra tác nhân trình duyệt

khi bạn đang phục vụ một trang web và phục vụ liên kết video hoặc chấp nhận yêu cầu cập nhật tiến độ, bạn có thể xem tác nhân trình duyệt. Nếu nó khác thì cấm người dùng.

chỉ cần lưu ý rằng một số trình duyệt cũ không vượt qua thông tin này. vì vậy bạn nên bỏ qua điều này khi không có tác nhân trình duyệt trong cả yêu cầu video và yêu cầu trang web. Nhưng nếu một yêu cầu có nó và một yêu cầu khác không có, thì bạn nên cấm người dùng.

để khắc phục điều này, người dùng có thể đặt tiêu đề tác nhân trình duyệt theo cách thủ công giống như trình duyệt không đầu mà họ đang sử dụng để chụp liên kết tải xuống.

kiểm tra tiêu đề người giới thiệu

khi người giới thiệu là một cái gì đó không phải là URL máy chủ của bạn hoặc URL trang mà bạn đang phục vụ video, bạn có thể cấm người dùng, vì họ đặt liên kết tải xuống trong một tab khác hoặc ứng dụng khác. thậm chí bạn có thể làm điều đó cho yêu cầu cập nhật tiến độ.

yêu cầu cho việc này là phải có một bản đồ video và trang hiển thị video đó. bạn có thể tạo một số quy ước hoặc mẫu để hiểu URL nên là gì, tùy thuộc vào thiết kế của bạn.

để khắc phục sự cố, người dùng có thể đặt tiêu đề giới thiệu bằng tay với URL trang tải xuống khi tải xuống video.

Tính thời gian giữa yêu cầu

nếu bạn nhận được rất nhiều yêu cầu mà thời gian giữa chúng là như nhau, thì bạn nên chặn người dùng. bạn nên đặt cái này để nắm bắt bao nhiêu thời gian giữa yêu cầu tạo liên kết video. nếu chúng giống nhau (cộng / trừ một số ngưỡng) và nó xảy ra nhiều hơn một số lần, thì bạn có thể cấm người dùng. bởi vì nếu có một bot sẽ thu thập dữ liệu trang web hoặc video của bạn, thì thông thường họ có cùng thời gian ngủ giữa yêu cầu của họ. vì vậy, nếu bạn nhận được từng yêu cầu, ví dụ, cứ sau 1,3 phút (cộng / phút một số sai lệch). sau đó bạn đưa ra một báo động. để làm điều này, bạn có thể sử dụng một số tính toán thống kê để biết độ lệch giữa các yêu cầu.

để khắc phục điều này, người dùng có thể đặt thời gian ngủ ngẫu nhiên giữa các yêu cầu.

mã mẫu

Tôi có một repo PluralSight-Downloader đang thực hiện nửa chừng. Tôi đã tạo repo này gần 5 năm trước. bởi vì tôi đã viết nó cho mục đích học tập và chỉ sử dụng cá nhân, repo không nhận được bất kỳ cập nhật nào cho đến nay và tôi sẽ không cập nhật hoặc làm cho nó dễ dàng để làm việc với. nó chỉ là một ví dụ về cách nó có thể được thực hiện.



1

Trả lời ngắn: Mã hóa liên kết như youtube, không biết làm thế nào hơn là hỏi youtube / google về cách họ làm điều đó. (Chỉ trong trường hợp bạn muốn đi thẳng vào vấn đề.)

Tôi muốn chỉ ra cho mọi người rằng điều này là có thể bởi vì youtube làm điều đó và nếu họ có thể thì bất kỳ trang web nào khác cũng không phải từ trình duyệt vì tôi đã thử nghiệm nó trên một vài trình duyệt như microsoft edge và internet explorer và Vì vậy, có một cách để vô hiệu hóa và thấy rằng mọi người vẫn nói ... Tôi cố gắng tìm câu trả lời vì nếu youtube có thể thì phải có cách và cách duy nhất để xem họ làm như thế nào nếu ai đó nhìn vào các kịch bản của youtube mà tôi đang làm bây giờ. Tôi cũng đã kiểm tra xem liệu đó có phải là một menu ngữ cảnh tùy chỉnh không và nó không phải là vì menu ngữ cảnh đang tràn qua phần tử kiểm tra và tôi có nghĩa là nó đã vượt qua nó và tôi đã xem và nó không bao giờ tạo ra một lớp mới và nó cũng không bao giờ tạo ra một lớp mới. thực sự không thể truy cập phần tử kiểm tra bằng javascript nên không thể. Bạn có thể biết khi nhấp đúp chuột phải vào video youtube, nó sẽ bật menu ngữ cảnh cho chrome. Bên cạnh đó ... youtube sẽ không thêm chức năng đó. Tôi đang nghiên cứu và tìm kiếm nguồn youtube vì vậy tôi sẽ quay lại nếu tôi tìm thấy câu trả lời ... nếu có ai nói bạn không thể hơn, thì họ cũng không t làm nghiên cứu như tôi có. Cách duy nhất để tải xuống video youtube là thông qua tải xuống video.

Được rồi ... Tôi đã nghiên cứu và nghiên cứu của tôi cho rằng bạn có thể vô hiệu hóa nó ngoại trừ không có javascript cho nó ... bạn phải có thể mã hóa các liên kết đến video để bạn có thể vô hiệu hóa nó bởi vì tôi nghĩ rằng bất kỳ trình duyệt sẽ không hiển thị nếu không tìm thấy và khi tôi mở liên kết video youtube, nó hiển thị dưới dạng "blob: https://www.youtube.com/e5c4808e-297e-451f-80da-3e838caa1275"không có dấu ngoặc kép nên nó đang mã hóa nó để nó không thể được lưu ... bạn cần biết php vì điều đó nhưng giống như câu trả lời bạn đã chọn để làm cho nó khó hơn, youtube làm cho nó khó mã hóa nặng nhất, bạn cần phải là một nâng cao lập trình viên php nhưng nếu bạn không biết điều đó hơn là lấy người bạn chọn làm câu trả lời tốt nhất khiến bạn khó tải xuống ... nhưng nếu bạn biết php hơn mã hóa nặng thì liên kết video sẽ chỉ có thể đọc được của bạn ... Tôi không biết làm thế nào để giải thích cách họ làm điều đó nhưng họ đã làm và có một cách. Cách youtube Encrypts có video khá thông minh vì vậy nếu bạn muốn biết cách hơn là chỉ hỏi youtube / google về cách họ làm điều đó ... hy vọng điều này sẽ giúp ích cho bạn mặc dù bạn đã chọn một câu trả lời tốt nhất. Vì vậy, mã hóa liên kết là tốt nhất trong ngắn hạn.


0

Có vẻ như truyền phát video qua websocket là một lựa chọn khả thi, vì trong việc truyền phát các khung và vẽ chúng trên một loại vải.

Truyền phát video qua websockets bằng JavaScript

Tôi nghĩ rằng điều đó sẽ cung cấp một mức độ bảo vệ khác khiến khách hàng gặp khó khăn hơn trong việc thu thập video và tất nhiên giải quyết vấn đề của bạn bằng tùy chọn trình đơn ngữ cảnh "Nhấp vào video dưới dạng ..." (quá mức cần thiết?!).


0

Đây là những gì tôi đã làm:

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>
Điều này cũng hoạt động cho hình ảnh, văn bản và khá nhiều thứ. Tuy nhiên, bạn vẫn có thể truy cập công cụ "Kiểm tra" và "Xem nguồn" thông qua các phím tắt. (Như câu trả lời ở trên cùng, bạn không thể dừng hoàn toàn.) Nhưng bạn có thể cố gắng đưa các rào cản lên để ngăn chặn chúng.


-1

@ Clayton-Graul có những gì tôi đang tìm kiếm, ngoại trừ tôi cần phiên bản CoffeeScript cho một trang web sử dụng AngularJS. Chỉ trong trường hợp bạn cũng cần điều đó, đây là những gì bạn đặt trong bộ điều khiển AngularJS trong câu hỏi:

    # 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

"Những điều kỳ lạ đang diễn ra tại vòng tròn k" (đó là sự thật)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.