好吧,您无法100%保护它,但可以使其变得更难。我要解释的这些方法是我在研究PluralSight和BestDotNetTraining中的保护方法时遇到的。但是,这些方法都没有阻止我下载我想要的内容,但是我很难安排下载器通过其保护。
除了提到的其他禁用上下文菜单的方法。用户仍然可以使用第三方工具(例如InternetDownload Manager)或其他类似软件来下载视频。我在这里解释的保护方法是缓解那些第三方软件。
所有这些方法的要求是,当您确定某人正在下载视频时阻止该用户。这样,在您禁止他们访问您的网站之前,他们只能下载一个或两个视频。
免责声明
如果有人滥用这些方法或将其用于损害他人或我作为示例提及的网站,我将不承担任何责任。这仅仅是为了共享知识,以帮助您保护自己的知识产品。
生成过期的链接
要求是为每个用户创建一个下载链接。可以通过天蓝色的blob存储或Amazon s3轻松处理这一问题。您可以使用两倍于视频时长过期时间戳的下载链接来创建一个下载链接。那么您需要捕获该视频链接和所需的时间。这是下一种方法所必需的。这种方法的不足之处在于,当用户单击播放按钮时,您正在生成下载链接。
在播放按钮事件中,您将向服务器发送请求并获取链接并更新源。
限制视频请求率
然后监视用户请求第二个视频的速度。如果用户要求下载链接的速度太快,则可以立即将其阻止。您不能将此阈值设置得太大,因为您可能会错误地阻止仅浏览或浏览视频的用户。
启用HTTP范围
使用诸如videojs之类的js库来播放视频,还需要在标头中返回一个AcceptRange。Azure blob存储支持此功能。这样,浏览器便开始逐块下载视频。通常,32字节乘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
module。那么您需要启动秒表,收听收到的包裹,并将收到的总字节与总大小进行比较。这样,您可以计算一个百分比以及获得该百分比所花费的时间。然后使用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应该是什么,这取决于您的设计。
要解决此问题,用户可以在下载视频时手动将引荐来源标头设置为等于下载页面URL。
计算两次请求之间的时间
如果收到太多请求以至于它们之间的时间相同,则应阻止该用户。您应该使用它来捕获两次视频链接生成请求之间的时间。如果它们相同(加/减某个阈值)并且发生多次,则可以禁止该用户。因为如果有一个机器人会抓取您的网站或视频,那么通常他们在两次请求之间的睡眠时间相同。因此,例如,如果您收到每个请求,则每1.3(分钟/分钟,有些偏差)。然后您发出警报。为此,您可以使用一些统计计算来了解请求之间的偏差。
要解决此问题,用户可以在请求之间放置一个随机的睡眠时间。
样例代码
我有一个回购PluralSight-Downloader正在半途完成。我在大约5年前创建了此仓库。因为我写的只是出于学习目的,并且仅供个人使用,所以到目前为止,该回购协议尚未收到任何更新,我也不会进行更新或使其易于使用。这只是如何完成的一个例子。