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

2022-08-30 12:16:42

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

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

如何允许登录用户查看索引.html文件(或“静态文件”下的任何文件),但将文件限制为其他所有人?

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

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

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

然后在授权中.php...

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

这个授权.php文件被严重简化,但你明白了。

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

Order Deny,Allow
Deny from all
Allow from 000.000.000.000

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


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

这些解决方案中哪一个听起来更好,为什么?或者,您能想到一个完全不同的解决方案,比这两个都更好吗?


答案 1

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

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

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

我已经在几个大型安全网站上使用了这个设置,它就像一个魅力。

编辑:我目前正在构建的系统使用此方法加载Javascript,图像和视频,但是CSS我们不是很担心保护。


答案 2

X-发送文件

有一个用于Apache(和其他HTTP服务器)的模块,它允许您告诉HTTP服务器提供您在php代码的标头中指定的文件:因此您的php脚本应如下所示:

// 1) Check access rights code
// 2) If OK, tell Apache to serve the file
header("X-Sendfile: $filename");

2.可能出现的问题:

  1. 您需要访问重写规则(.htaccess 启用或直接访问配置文件)
  2. 您需要mod_xsendfile模块添加到已安装的Apache中

这是另一个线程中的一个很好的答案:https://stackoverflow.com/a/3731639/2088061


推荐