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

时间:2013-07-30 14:11:31

标签: php apache security cgi

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

我想确保一个天真的用户无意中上传一个可能致命的文件,例如物理上可能的机会很少(或者实际上,尽可能少)。一些讨厌的PHP脚本。理想情况下,我想关闭PHP和其他任何可能存在安全风险的问题(CGI流程,服务器端包含等)。

我只是想知道,如果的堆栈溢出的社区可以帮助回答以下问题:什么是关闭与动态/可执行代码处理所有类型的文件/进程的最佳途径,那么实际上子域只不过是一个基本的静态文件服务器?

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

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

DO 可以访问:

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

有权访问:

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

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

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

提前致谢!

1 个答案:

答案 0 :(得分: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,则服务器将不知道如何处理它。