我可以防止未经授权的用户访问文件而不将文件存储在文档根目录之外吗?

时间:2018-10-25 01:56:10

标签: php .htaccess security authentication wamp

我有一个有趣的难题……我正在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),该脚本将使用$_GET['file']从URL提取请求的文件,它将使用$_SESSION变量对用户进行身份验证,然后使用用户header('Location: ' . $file)将经过身份验证的用户发送到实际文件。再一次,我在实现这一点后很快意识到它将循环...

任何帮助将不胜感激。谢谢!

这就是为什么它们不能超出文档根目录的原因...

@IdontDownVote,非常复杂,但是我将尝试使用一个简短的版本...我认为这最适合与doc根目录之外的文件配合使用,但存在一个严重问题。当我使用PHP脚本访问文件时,可以在Chrome浏览器中查看视频,播放,暂停,倒带等全部内容。唯一的(大)问题是当我使用此方法时,无法投射视频。当我直接访问.mp4文件时,它为我提供了下载或投射的选项,但是使用PHP脚本时,只有下载选项可用。相信我,我已经尝试了一切,包括与两名Google开发人员进行讨论。我在这里没有高兴地在Stack Overflow上发布了关于此问题的信息...

Why can't I cast an MP4 file served by PHP from outside of the document root?

我不确定为什么这会被否决,这让我很头疼,我只是在寻找建议...

1 个答案:

答案 0 :(得分:1)

首先要通过PHP在文档根目录之外提供文件时对它进行测试吗?

  

当我直接访问.mp4文件时,它为我提供了下载或投射的选项,但使用了PHP脚本

如果可以的话,您可以简单地阻止对除一个PHP文件之外的所有文件的访问,并使用该文件将其抛出(您也可以允许访问*.php

#.htaccess
Order Deny,Allow
Deny from all

<Files index.php>
Allow from all
</Files>

这将仅允许在htacccese所在的任何文件夹(和子文件夹)中访问index.php。如果您要使用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服务器(旧版,普通版和开发版)。无论如何,您基本上只需要保留其用户/密码列表,然后在创建/删除用户或更改其密码时更新文件。

也许会起作用(老实说,我不知道...大声笑)。

值得一试。