まあ、100%保護することはできませんが、難しくすることはできます。私が説明しているこれらのメソッドは、PluralSightとBestDotNetTrainingで保護メソッドを研究しているときに直面しました。それにもかかわらず、これらの方法のいずれでも、私が欲しいものをダウンロードするのを妨げることはありませんでしたが、ダウンローダーを保護してそれらの保護に合格するのに苦労しました。
コンテキストメニューを無効にする他の方法に加えて。ユーザーは引き続きInternetDownload Managerなどのサードパーティツールや他の同様のソフトウェアを使用してビデオをダウンロードできます。ここで説明する保護方法は、これらのサードパーティソフトウェアを軽減することです。
これらの方法のすべての要件は、誰かがあなたのビデオをダウンロードしていることを識別したときにユーザーをブロックすることです。この方法では、ユーザーがWebサイトへのアクセスを禁止する前にのみ、1つまたは2つのビデオしかダウンロードできません。
免責事項
誰かがこれらの方法を悪用したり、他の人や私が例として挙げたウェブサイトに害を及ぼすためにそれを使用した場合、私は一切の責任を負いません。知識を共有して、知的製品を保護するのに役立ちます。
有効期限付きのリンクを生成する
この要件は、ユーザーごとにダウンロードリンクを作成することです。Azure BlobストレージまたはAmazon S3で簡単に処理できること。動画の長さの有効期限の2倍のタイムスタンプを持つダウンロードリンクを作成できます。次に、そのビデオリンクと要求された時間をキャプチャする必要があります。これは次のメソッドに必要です。このメソッドの難点は、ユーザーが再生ボタンをクリックしたときにダウンロードリンクが生成されることです。
再生ボタンイベントでは、サーバーにリクエストを送信し、リンクを取得してソースを更新します。
ビデオリクエストレートを絞る
次に、ユーザーが2番目のビデオを要求する速度を監視します。ユーザーがダウンロードリンクを要求する速度が速すぎる場合は、すぐにブロックします。動画を閲覧しているだけのユーザーを誤ってブロックする可能性があるため、このしきい値を大きくしすぎることはできません。
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
ブラウザエージェントを確認する
Webページを提供し、ビデオリンクを提供するとき、または進行状況の更新要求を受け入れるときは、ブラウザーエージェントを確認できます。異なる場合は、ユーザーを禁止します。
一部の古いブラウザはこの情報を渡さないことに注意してください。そのため、動画リクエストとウェブページリクエストの両方にブラウザエージェントがない場合は、これを無視してください。しかし、1つの要求にそれがあり、別の要求にはない場合は、ユーザーを禁止する必要があります。
これを回避するには、ユーザーは、ダウンロードリンクのキャプチャに使用しているヘッドレスブラウザと同じように、ブラウザエージェントヘッダーを手動で設定できます。
リファラーヘッダーを確認する
リファラーがホストURLまたはビデオを提供しているページURL以外の場合、ダウンロードリンクを別のタブまたは別のアプリケーションに配置するため、ユーザーを禁止できます。進行状況の更新要求に対してもそれを行うことができます。
このための要件は、ビデオとそのビデオを表示するページのマッピングを持つことです。規約やパターンを作成して、URLがどうあるべきかを理解することができます。デザイン次第です。
それを回避するために、ユーザーはビデオをダウンロードするときに、ダウンロードページURLに等しいリファラーヘッダーを手動で設定できます。
リクエスト間の時間を計算する
リクエストの数が多く、リクエスト間の時間が同じである場合は、ユーザーをブロックする必要があります。ビデオリンク生成リクエスト間の時間をキャプチャするには、これを配置する必要があります。それらが同じで(プラス/マイナスのしきい値)、それが何度も発生する場合は、ユーザーを禁止できます。ウェブサイトや動画をクロールするボットがある場合、通常、リクエストとリクエストの間のスリープ時間は同じです。たとえば、各リクエストを受け取った場合、たとえば1.3(プラス/分、ある程度の偏差)分ごと。次に、アラームを発生させます。このため、いくつかの統計計算を使用して、要求間の偏差を知ることができます。
これを回避するために、ユーザーは要求の間にランダムなスリープ時間を置くことができます。
サンプルコード
途中で実行しているレポPluralSight-Downloaderがあります。私はこのリポジトリを5年ほど前に作成しました。学習目的と個人的な使用のみを目的として作成したため、これまでのところレポは更新されておらず、更新したり操作しやすくしたりすることはありません。これは、それを行う方法の単なる例です。