1

我最近的任务是打开一个小型网站的子域,允许受信任的用户从本地磁盘上传和存储文件作为备份。一般来说,这个新的子域将主要用于存储静态 Office 类型的文档(例如 Microsoft/OpenOffice 文档、PDF、纯文本文件等)。

我想确保天真的用户不会无意中上传一个可能致命的文件,例如一些讨厌的 PHP 脚本。理想情况下,我想关闭 PHP 和任何其他可能存在安全风险的东西(CGI 进程、服务器端包含等)。

我只是想知道Stack Overflow社区是否可以帮助回答以下问题:关闭所有处理动态/可执行代码的文件类型/进程的最佳方法是什么,所以实际上子域只不过是一个基本的静态文件服务器?

我使用各种关键字/短语查看了 Google,但我似乎找不到一个很好的参考来使子域“安全”,因为可以从具有共享服务器权限级别的人那里完成。

该网站在典型 LAMP 架构上的 Apache 2.2 上运行,并托管在第三方共享服务器上。

可以访问:

  • .htaccess(具有典型特权/限制的目录级别)
  • php.ini.user.ini(具有典型特权/限制的目录级别)
  • 具有一些相当丰富的选项和功能的控制面板软件(cPanel X
  • 相当灵活的网络主机,具有出色的技术支持服务

无权访问:

  • 根访问(显然!)
  • httpd.conf
  • php.ini(应用服务器级别)
  • mysql.cnf

请记住,我没有资源仅投资文件服务器或将其外包给第三方服务。此外,此服务器不会用于 CDN,因此性能并不是真正的问题。

(另外,我不知道可以对客户端脚本做什么,例如 JavaScript/VBScript,但欢迎提出任何建议。)

提前致谢!

4

1 回答 1

1

简单的。不要提供对文件的直接访问。通过 PHP 脚本运行所有内容,该脚本将内容提供为application/octet-stream. 例如

<?php

$id = $_GET['id'];
$data = get_file_details_from_database($id);
if (user_is_allowed_to_access($id)) {
   header('Content-type: application/octet-stream');
   readfile($data['path_to_file_on_server']);
}

有了这个,他们上传什么样的文件都没有关系 - 它永远不会通过直接http://example.com/nastyfile.php类型的 URL 直接访问。如果您仅使用内部 ID 号而不是用户提供的文件名将文件存储在驱动器上,您将获得更高的安全性。网络服务器可能会尝试执行nastyscript.php,但如果它只是12345在驱动器上,服务器将不知道如何处理它。

于 2013-07-30T14:15:30.073 回答