一尘不染

使用PHP / Apache限制对静态文件(html,css,img等)的访问

php

假设您的服务器目录中有很多html,css,js,img等文件。通常,互联网域中的任何用户都可以通过简单地输入完整的URL来访问这些文件,例如:http : //example.com/static-
files/sub/index.html

现在,如果只希望授权用户能够加载那些文件怎么办?对于此示例,假设您的用户首先从这样的URL登录:http
//example.com/login.php

您将如何允许登录的用户查看index.html文件(或“ static-files”下的任何文件),但将文件限制为其他所有人?

到目前为止,我已经提出了两种可能的解决方案:

解决方案1
在“静态文件”下创建以下.htaccess文件:

Options +FollowSymLinks  
RewriteEngine on  
RewriteRule ^(.*)$ ../authorize.php?file=$1 [NC]

然后在authorize.php中…

if (isLoggedInUser()) readfile('static-files/'.$_REQUEST['file']);
else echo 'denied';

这个authorize.php文件已经大大简化了,但是您知道了。

解决方案2
在“静态文件”下创建以下.htaccess文件:

Order Deny,Allow
Deny from all
Allow from 000.000.000.000

然后,我的登录页面可以为每个登录用户附加.htaccess文件和IP。显然,这还需要某种清除例程,以清除旧的或不再使用的IP。


我担心随着访问的用户和文件数量的增加,我的第一个解决方案在服务器上的价格可能会非常昂贵。我认为我的第二个解决方案将便宜得多,但是由于IP欺骗等原因,其安全性也将降低。我还担心,如果同时有许多用户,将这些IP地址写入htaccess文件可能会成为应用程序的瓶颈。

以下哪种解决方案听起来更好,为什么呢?或者,您能想到一个完全不同的解决方案,比其中任何一个方案都更好吗?


阅读 563

收藏
2020-05-29

共1个答案

一尘不染

我会考虑使用PHP加载程序来处理身份验证,然后返回所需的文件。例如,<img src='picture.jpg' /> 不要做类似的事情<img src='load_image.php?image=picture.jpg' />

您的图像加载器可以验证会话,检查凭据等,然后决定是否将请求的文件返回到浏览器。这将使您可以将所有安全文件存储在Web可访问的根目录之外,因此没有人会仅WGET文件或“意外”浏览那里。

只要记住要在PHP中返回正确的标头,并在php中执行类似readfile()的操作,这会将文件内容返回给浏览器。

我已经在几个大型安全网站上使用了此设置,它的工作原理就像一个魅力。

编辑:我当前正在构建的系统使用此方法来加载Javascript,图像和视频,但是我们对安全性不是很担心。

2020-05-29