Отключение исполняемого кода (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
на диске сервер не будет знать, что с ним делать.