Страницы

Поиск по вопросам

воскресенье, 7 июля 2019 г.

Безопасность директории и публичные права на запись и выполнение

JavaScript-файл методом post отсылает в handler_dir/handler.php строку base64-представление бинарного файла с изображением. Обработчик handler.php получает base64-строку, записывает её в созданный им файл и копирует этот файл во временную директорию:
$str = $_POST['base64']; $img = "some_name.jpg"; file_put_contents($img, base64_decode($str)); rename($img, $temp_dir . $img);
Методом проб выяснилось, что это решение работает только в том случае, когда для директории обработчика handler_dir выставлены публичные права на запись и выполнение
Насколько я понимаю, это очень и очень небезопасно (несмотря на то, что в самом файле handler.php происходит проверка авторизации, а в директорию handler_dir запрещен доступ на уровне .htaccess).
Прошу совета, правильно ли я понимаю, что существующее решение уязвимо в плане безопасности? Существуют ли способы исключить (на любом уровне) загрузку и выполнение вредоносного кода в директории handler_dir?


Ответ

Как только вы открываете пользователям возможность загружать на сайт какие-то файлы — вы сразу самолично создаёте огромную дыру в безопасности сайта. Это ещё один дополнительный вектор атаки на сайт.
Да, хороший разработчик тут же начинает закрывать эту дыру какими-то действиями, многие из них будут весьма действенными — но до конца закрыть её будет можно лишь теоретически — отняв саму возможность загружать.
Чем плохо ваше решение? Тем, что загрузчик лежит в том же самом каталоге, что и загружаемые файлы. Зачем? Современные практики вообще доходят до того, что на сайте остаётся лишь один index.php, а остальной движок лежит выше уровня www_root. Вам нужно создать отдельную папку upload только под загруженные файлы. Отделяйте код от контента — это хорошо как с точки зрения хороших практик программирования, так и помогает с точки зрения безопасности.
Непонятно, почему вы пишете, что "решение работает только в том случае, когда для директории обработчика handler_dir выставлены публичные права на запись и выполнение". Вполне достаточно, чтобы PHP-скрипты имели owner'ом пользователя apache (ну или от кого у вас запускается веб-сервер?) и имели права 0644 (и, при условии включенного SELinux достаточно иметь контекст httpd_sys_content_t).
А вот на папку upload, куда вы хотите сохранять картинки, нужно, чтобы owner был apache, права на каталог 0755 и SELinux контекст httpd_sys_rw_content_t.
Что можно порекомендовать на практике для улучшения безопасности?
В этой статье собраны хорошие практики, посмотрите весь чеклист из рекомендованного вопроса PHP image upload security check list
Раз вы загружаете картинки — обратите внимание вот на какой способ защиты. Возьмите и сожмите картинку при помощи GD или ImageMagic на 99% — визуально картинка останется такой же (ну, если это не совсем крохотная картинка, а достаточно крупная), а зловредный код такую трансформацию не переживёт, как бы он не был представлен (приклеен после картинки или внедрён в неё).
Подскажите, где можно прочитать об изменении уровня относительно www_root?
Видимо что-то типа "Вынесение за пределы корня сайта"? А, вот ещё: "единая точка входа", сегодня попалось в вопросе. Самое краткое описание это "В идеале, чтобы система была спроектирована так, что в public_html будет лежать только index.php, внутри которого единственное подключение файлика, не лежащего в public_html", в качестве примера движка - посмотрите Laravel

Комментариев нет:

Отправить комментарий