php - 我可以防止未经授权的用户访问文件而不将文件存储在文档根目录之外吗?
问题描述
我有一个有趣的困境......我在 WAMP 服务器上托管了几个 .mp4 文件。我很清楚将文件存储在文档根目录之外并在检索文件内容之前使用 PHP 脚本对用户进行身份验证的方法。但是,这些 .mp4 文件必须位于文档根目录中。有什么方法可以对尝试直接访问这些文件之一的用户进行身份验证?我尝试了一个 .htaccess 重写,它接受一个以“.mp4”结尾的请求 URL,并重定向到一个 PHP 脚本,将请求的文件作为参数传递,但当然这只是循环。
这是 .htaccess 文件中的重写规则...
RewriteEngine on
RewriteRule ^(.*).mp4$ /media/auth.php?file=$1.mp4
这个想法是,用户将尝试访问http://www.example.com/media/myVideo.mp4,此请求将被路由到 PHP 脚本(auth.php),该脚本将从 URL 中获取请求的文件使用$_GET['file']
,它将使用$_SESSION
变量对用户进行身份验证,然后用户 aheader('Location: ' . $file)
将经过身份验证的用户发送到实际文件。再一次,我在实现这个之后很快意识到它只会循环......
任何帮助将不胜感激。谢谢!
这就是为什么它们不能位于文档根目录之外的原因......
@IdontDownVote,非常复杂,但我会尝试一个简短的版本......我的这个大多数情况下都可以很好地处理文档根目录之外的文件,但有一个严重的问题。当我使用 PHP 脚本访问文件时,我可以在 Chrome 浏览器中查看视频,播放、暂停、倒带,整个过程。唯一(大)问题是当我使用这种方法时,我无法投射视频。当我直接访问 .mp4 文件时,我可以选择下载或投射,但使用 PHP 脚本时,只有下载选项可用。相信我,我已经尝试了所有方法,包括与两位 Google 开发人员讨论。我在 Stack Overflow 上发布了关于这个问题的帖子,但并不高兴......
为什么我不能从文档根目录之外投射由 PHP 提供的 MP4 文件?
我不知道为什么这会被否决,这让我很头疼,我只是在寻求建议......
解决方案
首先,您在通过文档根目录之外的 PHP 提供文件时是否对其进行了测试?
当我直接访问 .mp4 文件时,我可以选择下载或投射,但使用 PHP 脚本
如果可以的话,您可以简单地阻止对除一个 PHP 文件之外的所有文件的访问,并使用它来分发(您也可以允许访问*.php
..
#.htaccess
Order Deny,Allow
Deny from all
<Files index.php>
Allow from all
</Files>
这将只允许index.php
在 htacccese 放入的任何文件夹(和子文件夹)中访问。如果您在 PHP 中有一个现有的登录系统并且您想为您的用户使用,这可能会更好。
如果你不能,那么我唯一能做的就是尝试使用 BasicAuth 和 Htaccess,如下所示:
#.htaccess
Order Deny,Allow
Deny from all
AuthType Basic
AuthName "Admin Only"
AuthUserFile /pathto/.htpasswrd
require valid-user
Allow from all
然后在一个名为 .htpasswrd 的文件中放一些这样的东西:
admin:$apr1$o48wfurr$5WaWCjD85kBu/ydGKsQeq/
您可以使用类似的东西来散列密码。
http://www.htaccesstools.com/htpasswd-generator/
然后,当您向 Chrome 提供 url 时,您必须包含user:pass@
绕过登录的部分。
http://user:pass@somedomain/path/to/video.mp4
如果您不想将此绑定到现有登录名,则必须创建一些系统以将 htpasswrd 文件中的密码与用户的密码同步。这真的不应该太难。我做了一个将我们的站点用户帐户同步到 sFTP 服务器,由于安全性,这真的很痛苦,我们有 3 个 sFTP 服务器(旧版、普通和开发)。无论如何,您基本上只需要保留他们的用户/密码列表,然后在创建/删除用户或更改他们的密码时更新文件。
也许它会起作用(老实说,我不知道......哈哈)。
值得一试。
推荐阅读
- tensorflow - Tensorflow 对象检测 API 的 Faster RCNN 配置中的 depth_multiplier 和 skip_last_stride
- flutter - Flutter 中两次 PUSH 事件是正常的吗?
- tensorflow - 无法序列化 tensorflow.GraphDef 类型的协议缓冲区,因为序列化大小 3459900923 字节将大于限制(2147483647 字节)
- python - 确定 dtypes 对象应该是 Int 还是 float
- android - 迁移到 Androidx 后无法解析符号 R
- android - 智能手表加速度计精度问题
- javascript - 在 javascript 或 typescript 中生成唯一的随机数
- tensorflow - 将 keras 模型转换为 tfjs 时出错:重复的权重名称变量
- laravel - 如何定义这个 hasManyThrough 关系?
- nginx - 为什么 nginx 将资产重定向到主页?