繁体   English   中英

防止直接URL访问文件

[英]Prevent direct url access to files

背景资料:

我正在建立一个网站,通过订阅服务提供图像和视频内容。 也就是说,只要用户成功登录,用户就应该只能访问图像和视频内容。 (注意:登录系统使用MySQL DB的组合 - 存储用户名和密码 - 和php创建新的用户会话/身份验证等)

问题:

如何阻止用户(登录或不登录)直接访问图像和视频文件? 例如,未登录的用户可以直接访问该文件,如下所示:www.domain.com/testvideo.mp4 - 这将在浏览器中呈现视频内容,供他们观看或与他人共享。 (注意:我仍然需要能够通过HTML,CSS,PHP等在现场使用/显示图像和视频文件)

我已经尝试了几个成功阻止直接访问的.htaccess解决方案(包括:RewriteCond / RewriteRule和.htpassword)但是已经阻止了通过HTML,CSS,PHP等在现场使用文件的能力。

我认为这一定是一个非常普遍的问题,如果是这样,解决问题的最佳方法是什么?

这是一个非常常见的问题,有一个很常见的解决方案。 为了强制访问控制,您必须在提供文件之前调用PHP脚本并验证凭据。 然后,如果凭据有效,请提供实际文件。

您可能想要使用readfile东西直接从PHP脚本提供文件。 这将破坏您的服务器性能并破坏客户端的下载恢复。

幸运的是,当您可以将实际文件服务交还给Web服务器时,有一个解决方案。

其工作原理如下:

  1. Web服务器接收对/file.mp4的请求。
  2. 根据您设置的重写规则,它会将其指向您的PHP脚本/serve.php
  3. 您的脚本会验证凭据,例如来自会话或Cookie的内容。
  4. 如果凭据有效,则脚本会发出特制的标头。 它告诉Web服务器实际提供静态文件。 如果没有,您也可以输出403 HTTP代码。

示例脚本可以是:

$file = '/tmp/file.mp4'; // it is in your best interest to make this file  inaccessible for a direct download
header('X-Sendfile: ' . $file);
header('Content-Type: ' . contentType($file));
header('Content-Disposition: inline;');

为了使其工作,您必须在Apache上安装mod_xsendfile( https://tn123.org/mod_xsendfile/ ),这可能已经是您的主机的情况。 您还需要删除一些行来配置它并设置正确的重写。

您可以通过发布“mod_xsendfile php”来解决Google上的大量问题,这可能也会有很大帮助。

希望有道理!

只要您的文件是公开可用的,您就无法避免这种情况。

最常见的方法是不直接提供文件,而是通过php提供服务,以便在提供文件之前检查用户访问权限。 然后文件可以驻留在服务器上的任何位置,其中Web服务器用户(www,apache等)可以访问但访问者没有访问。

查看关于readfileheader的php手册中的示例,了解如何通过php提供文件。 你也会在SO上找到很多例子。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM