我有一个视频存储在我的服务器上。
我不希望人们在找到链接后能够链接到该视频(查看来源)。
处理这种情况的最佳方法是什么?
谢谢丹尼
不要将其存储在您的 Web 根目录中。将其保留在您的 Web 根目录之外,并通过 PHP 文件引用它。该文件将对用户进行身份验证,以验证您是否希望他们能够观看视频并允许他们观看视频。否则,它将阻止视频加载或加载错误消息。
.HTML:
<a href="video.php">Watch the video</a>
PHP示例(视频.php):
<?php
if (!isset($_SESSION['authenticated']))
{
exit;
}
$file = '/path/to/file/outside/www/secret.avi';
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=' . basename($file));
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Content-Length: ' . filesize($file));
ob_clean();
flush();
readfile($file);
exit;
?>
正确表达您的问题,但我认为您正在寻找的是热链接预防,将其添加到您的 .htaccess 中
RewriteEngine on
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://(www'.)?yourdomain.com/.*$ [NC]
RewriteRule '.(avi|mp4)$ - [F]
更有效的方法是使用一次性链接:
- 请求托管视频的页面。
- 生成一个随机字符串并将其存储在会话中,并将其附加到链接"video.php?id=10&token=9283y540983y45
- 使用 John Conde 的方法限制直接访问并允许通过.php文件进行访问。
- 在 PHP 文件中,通过与会话中的字符串进行比较,检查 URL 中的标记是否正确。
另一种方法是以某种方式加密链接,如果您不想(或不能)使用身份验证,这是 John 在他的答案中建议的。如果您的链接每小时都会更改一次,那么共享将很困难。
如果您使用当前小时(和日期)的 md5 哈希之类的内容,那么任何发现的链接在大约两个小时后都将无法使用。为什么是两个?因为您应该处理在 12:59:59 生成链接的情况,因此当客户端的浏览器尝试访问资源时,链接无效。为了防止这种情况,您应该检查前一小时是否与 url 匹配(如果当前小时不匹配)。
如果在 URL 中使用哈希太难,您可能需要该参数 - 并使用类似于 John 在他的答案中显示的代码。
因此,场景如下所示:
客户端提取页面。您的服务器需要在那里放置一个指向视频的链接。它检查它是否2012-06-29 14:55:30
,将该日期视为2012-06-29T14:5_:__
计算哈希,并提出如下URL:href="/videos/736453273dh367d52gs82/movie.mpg"
客户端的浏览器下载资源,因此您的服务器会收到对该 URL 的请求,其中包含这些奇怪的数字。您的服务器检查时间,发现它2012-06-29 14:55:31
。清除最后三位数字(因为我认为一个小时可能太多了),并从2012-06-29T14:5_:__
创建一个哈希。它是否与客户端提供的 URL 匹配?是的。然后提供文件。
如果 URL 不匹配,则服务器将时间减少 1,因此它会尝试对2012-06-29T14:4_:__
进行编码 - 如果也不匹配,则返回错误代码。
因此,您的链接只能工作~20分钟。您可以决定哪个时间范围适合您的需求。但请记住 - 任何获得该链接的人都可以在此期间使用它。还要小心生成该哈希值的内容 - 如果这只是时间,则可能会猜测该方案。使用一些随机盐,但请记住,生成URL的页面和检查URL的页面必须相同。