Отключение исполняемого кода (CGI/SSI/PHP/ и т. Д.) В поддомене сервера Apache

Недавно мне было поручено открыть поддомен небольшого веб-сайта, который позволяет доверенным пользователям загружать и хранить файлы в качестве резервных копий с локальных дисков. В целом, этот новый поддомен будет использоваться для хранения в основном статических документов типа Office (например, документов Microsoft/OpenOffice, PDF-файлов, текстовых файлов и т. Д.).

Я хочу убедиться, что у наивного пользователя нет возможности (или реально, настолько мало, насколько это физически возможно) случайно загрузить потенциально фатальный файл, например, какой-нибудь неприятный PHP-скрипт. В идеале я хотел бы закрыть PHP и все остальное, что может представлять угрозу безопасности (процессы CGI, серверные включения и т. Д.).

Мне просто интересно, может ли сообщество Stack Overflow помочь ответить на следующий вопрос: каков наилучший способ завершения всех типов файлов / процессов, которые имеют дело с динамическим / исполняемым кодом, так что в действительности субдомен является не чем иным, как базовый статический файловый сервер?

Я просматривал Google, используя различные ключевые слова / фразы, но, похоже, не могу найти хорошую ссылку на то, чтобы сделать "субдомен" "безопасным", как это можно сделать у кого-то с уровнем полномочий общего сервера.

Веб-сайт работает на Apache 2.2 с типичной архитектурой LAMP и размещается на стороннем общем сервере.

У меня есть доступ к:

  • .htaccess (уровень каталога с типичными привилегиями / ограничениями)
  • php.ini а также .user.ini (уровень каталога с типичными привилегиями / ограничениями)
  • программное обеспечение панели управления с некоторыми довольно щедрыми опциями и функциями (cPanel X)
  • довольно гибкие веб-хосты с отличной службой технической поддержки

У меня нет доступа к:

  • root-доступ (очевидно!)
  • httpd.conf
  • php.ini (уровень сервера приложений)
  • mysql.cnf

Имейте в виду, что у меня нет ресурсов, чтобы просто инвестировать в файловый сервер или передавать его сторонним службам. Кроме того, этот сервер не будет использоваться в смысле CDN, поэтому производительность на самом деле не является проблемой.

(Кроме того, я не знаю, что можно сделать со скриптами на стороне клиента, например, JavaScript/VBScript, но любые предложения будут приветствоваться.)

Заранее спасибо!

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 А если вы храните файлы на диске, используя только их внутренний идентификационный номер, а не предоставленное пользователем имя файла, вы получаете еще большую безопасность. Веб-сервер может попытаться выполнить nastyscript.php, но если это просто 12345 на диске сервер не будет знать, что с ним делать.

Другие вопросы по тегам