php - 以性能为导向的方式来保护 PHP 级别的文件?

标签 php security apache .htaccess

我正在寻找一些关于我思考了很长时间的事情的意见。这是一个非常普遍的问题,也许还有我还没有想到的解决方案。

我有一个基于 PHP 的 CMS。
对于在 CMS 中创建的每个页面,用户可以上传 Assets (要下载的文件、图像等)

这些 Assets 存储在一个目录中,我们称它为“/myproject/assets”,基于每页(1 个子目录 = 1 个页面,例如“/myproject/assets/page19283”)

用户可以在 CMS 中“取消发布”(隐藏)页面。当某个页面被隐藏时,如果有人因为记住了 URL 或来自 Google 或其他原因而尝试访问它,他们会收到“未找到”消息。

但是, Assets 仍然可用。我也想保护它们,以便当用户取消发布页面时,他们可以相信它已经完全消失了。 (对于法院下令删除内容等司法纠纷非常重要……这样的事情可能会发生)。

最明显的方法是将所有 Assets 存储在安全目录中(= 网络服务器无法访问),并使用 PHP“前门”在检查后传递文件。当项目需要无懈可击时,这就是我目前采用的方式,但我不喜欢它,因为 PHP 解释器会为站点上的每个小图像、脚本和样式表运行。我想要一个更快的方法。

.htaccess 保护(全部拒绝或类似)并不完美,因为 CMS 应该是可移植的并且能够在共享环境中运行。我希望它甚至可以在 IIS 和其他 Web 服务器上运行。

我现在能想到的最好方法是在未发布时将特定页面的 Assets 目录移动到安全位置,并在发布时将其移回。但是,即使页面未发布,管理员用户也需要能够看到该页面,因此我必须解决必须从安全目录提供这些 Assets 这一事实。

有人能想出一种允许 Apache 直接访问文件(= 不通过 PHP 脚本传递)但仍使用 PHP 控制访问的方法吗?我不能。

我还会考虑一个可能在大多数 共享环境中运行的简单 .htaccess 解决方案。

最佳答案

任何敏感信息都应按照您的建议存放在安全区域。

如果您的网站位于/var/www/public_html

您将 Assets 放在/var/www/assets 中的网络可访问区域之外 PHP 可以要求下载,或者您可以根据需要通过 PHP 提供文件。

如果您将 HTML 保留在 CMS 数据库中,那将只留下非敏感图像和 CSS。

如果您绝对必须打开和关闭对所有 Material 的所有访问权限,我认为您最好的选择可能是符号链接(symbolic link)。将 -everything- 保存在一个不可通过网络访问的区域,并将每个 Assets 文件夹符号链接(symbolic link)到网络区域。这样,如果您需要将人员完全拒之门外,只需删除符号链接(symbolic link)而不是删除所有文件。

我不喜欢它,但这是我能想到的唯一符合您的标准的东西。

关于php - 以性能为导向的方式来保护 PHP 级别的文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1688568/

相关文章:

java - 如何在android客户端和自定义java服务器之间使用SSL套接字

php - 上传 PHP 脚本在 Ubuntu 中不起作用

php - 检查目录或后备 htaccess

php - 如何修复在 "localhost/wordpress"上建立数据库连接时出错

php - 报告去哪儿了? PHP 到 MySQL

apache - 启动 apache 时出错,httpd : Configuration error: More than one MPM loaded

c - 用CGI C程序保存文件到www目录

php - Ajax/jQuery 到 PHP 又回来了?

javascript - 了解保护 Firebase 代码

php - RIA 中 JavaScript 中基于角色的安全性