我正在尝试为在网站内播放的视频应用一些保护,使其不被播放器本身以外的其他任何内容下载。
我想出了以下解决方案:
在视图文件中
@php
$token = uniqid ();
Session::put('videoToken',$token);
@endphp
<video id="my-video" class="video-js" controls preload="auto" width="800" height="450"
poster="{{$post->thumbnails}}" data-setup="{}">
<source src="{{route('videoView',['id'=> $post->id]}}?token=$token" type='video/mp4'>
<p class="vjs-no-js">
To view this video please enable JavaScript, and consider upgrading to a web browser that
<a href="http://videojs.com/html5-video-support/" target="_blank">supports HTML5 video</a>
</p>
</video>
videoView路线: -
Route::get('/video/{id}',function(Request $request){
if ($request->token == Session::get('videoToken'))
{
$post = Post::find($id);
return response()->download($post->path, 'vid.mp4');
}
else{
die();
}
})->name('videoView');
对于上述编码,我将确保仅在验证“$ token”时生成视频文件。如何添加额外的图层以验证请求是否来自播放器所在的网页,以便尝试使用网址http://mywebsite.com/video/5?token=54syrerrerw3rre下载视频的任何人都无法使用。
答案 0 :(得分:1)
据我所知,这是不可能的,因为在HTTP协议中,每个请求都独立于其他请求。但我有一种方法来检查请求是否来自源域。尝试这样做,如果它来自同一个域true
,它将返回false
。
function requestIsFromSameSourceDomain(){
if ((isset($_SERVER['HTTP_REFERER']) && !empty($_SERVER['HTTP_REFERER']))) {
if (strtolower(parse_url($_SERVER['HTTP_REFERER'], PHP_URL_HOST)) != strtolower($_SERVER['HTTP_HOST'])) {
return false;
}else{
return true;
}
}
}
根据 Funk Forty Niner 的评论:在使用上述方法之前,请先查看How reliable is HTTP_REFERER?