php-禁止直接访问文件

背景信息:

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

问题:

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

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

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

解决方法:

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

您可能会想使用类似readfile之类的方法直接从PHP脚本直接提供文件.这将破坏服务器性能,并中断客户端的下载恢复.

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

其工作方式如下:

> Web服务器收到对/file.mp4的请求.
>根据重写规则,您将其设置为将其定向到您的PHP脚本/serve.PHP.
>您的脚本会验证凭据,例如会话中的内容或Cookie.
>如果凭据有效,则脚本会发出特制的标题.它告诉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上做很多事情,这可能也有很大帮助.

希望有道理!

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...