【问题标题】:Blocking Users From finding Links阻止用户查找链接
【发布时间】:2012-06-29 12:29:20
【问题描述】:

我有一个视频要存储在我的服务器上。

我不希望人们在找到链接后能够链接到该视频(查看源代码)。

处理这种情况的最佳方法是什么?

谢谢, 丹尼

【问题讨论】:

  • 简单:不要将它存储在您的服务器上并发布它!
  • 我想说:你不应该阻止用户这样做。但是如果你真的需要,那么技术上的可能性是很有趣的。无论如何,我相信没有 100% 可靠的方法。也可能是这样,但成本很高,而且在大多数情况下会让用户生气

标签: php html hyperlink html5-video


【解决方案1】:

不要将其存储在您的网络根目录中。将其保存在您的 Web 根目录之外,并通过 PHP 文件引用它。该文件将对用户进行身份验证,以验证您是否希望他们能够观看视频并允许他们观看。否则它将阻止视频加载或加载错误消息。

HTML:

<a href="video.php">Watch the video</a>

示例 PHP (video.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;
?>

【讨论】:

  • 嗯,所以用户必须进行身份验证...你如何防止用户共享链接+他的凭据?
  • 您可以尝试进行 IP 检查等。但最重要的是,没有 100% 万无一失的方法可以阻止某人查看您不想访问的视频。如果它在 Internet 上,那么最终每个人都可以使用,只要他们愿意努力获得它。
  • 上述代码也不允许超过 2gb 的文件或处理渐进式加载。正确答案是:Q:Blocking Users From finding LinksA: You cant
  • 谢谢,非常好的想法...!
【解决方案2】:

您可能没有正确表达您的问题,但我认为您正在寻找的是防止热链接,请将其添加到您的 .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 中的令牌是否正确。

【讨论】:

  • 那行不通,因为我可以将该标题添加到wget 并毫无问题地下载文件。
  • @Arsen7,你甚至不需要wget。无论您做什么,如果您不使用一次性链接,您的链接将被共享并且会以您不希望的方式使用。
【解决方案3】:

另一种方法是加密链接,如果您不想(或不能)使用身份验证,John 在他的回答中建议。如果您的链接每小时都会更改一次,那么共享将很困难。

如果您使用当前小时(和当天)的 md5 哈希值,则任何发现的链接在大约两个小时后都将无法使用。为什么是两个?因为你应该处理12:59:59生成链接的情况,所以当客户端的浏览器尝试访问资源时,链接是无效的。为防止出现这种情况,您应该检查 previous 小时是否与 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 不匹配,则服务器将时间减一,因此它尝试编码 2012-06-29T14:4_:__ - 如果也不匹配,则返回错误代码。

因此,您的链接只能工作约 20 分钟。您可以决定什么时间范围适合您的需求。但请记住 - 获得该链接的任何人都可以在此期间使用它。还要小心生成该散列的内容 - 如果这只是时间,您可能会冒着该方案被猜测的风险。使用一些随机的 salt,但请记住,对于 生成 URL 的页面和 检查 URL 的页面,它必须相同。

【讨论】:

  • 是什么阻止了某人使用 curl 获取所有参数、会话、cookie、哈希、设置用户代理和推荐人。需要下载... zip
  • 如果链接仅在某个时间范围内有效,则不需要任何会话参数。此方法只需要服务器上的时间。但是,如果我下载资源并自己发布...没有人可以阻止我:) 我也认为在大多数情况下,这些阻止共享技术是不好的。我的意思是,对可用性不利。
猜你喜欢
  • 2021-11-17
  • 1970-01-01
  • 1970-01-01
  • 2017-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-08
  • 1970-01-01
相关资源
最近更新 更多