禁用Apache服务器子域上的可执行代码(CGI/SSI/PHP/等)


Disabling executable code (CGI/SSI/PHP/etc.) on a sub-domain of an Apache server

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

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

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

我在谷歌上使用了各种关键词/短语,但我似乎找不到让子域"安全"的好参考,因为它可以从具有共享服务器权限级别的人那里做到。

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

DO可以访问:

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

不能访问:

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

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

(此外,我不知道如何处理客户端脚本,例如JavaScript/VBScript,但欢迎提出任何建议。)

提前感谢!

简单。不要提供对文件的直接访问。通过PHP脚本运行EVERYTHING,该脚本将内容作为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号而不是用户提供的文件名将文件存储在驱动器上,你会获得更多的安全性。Web服务器可能会尝试执行nastyscript.php,但如果驱动器上只有12345,服务器将不知道该如何处理它