Назад | Перейти на главную страницу

Apache неправильно разрешает запросы с путями, начинающимися с /index.php/

При просмотре журналов доступа я заметил следующее автоматическое сканирование уязвимостей, для которого Apache возвращает статус 200:

POST /index.php/api/Uploadify/preview HTTP/1.1

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

Может ли кто-нибудь объяснить мне, почему Apache разрешает этот URL-адрес и / или как заставить его возвращать 404?

Apache's AcceptPathInfo

Это поведение контролируется AcceptPathInfo Директива в обоих Apache 2.2 и 2,4:

Эта директива контролирует, будут ли приняты или отклонены запросы, содержащие информацию о конечном имени пути, которая следует за фактическим именем файла (или несуществующим файлом в существующем каталоге). Информация о конечном имени пути может быть сделана доступной для сценариев в PATH_INFO переменная окружения.

Например, предположим, что местоположение /test/ указывает на каталог, содержащий только один файл here.html. Затем запросы на /test/here.html/more и /test/nothere.html/more оба собирают /more так как PATH_INFO.

По умолчанию

  • основной обработчик отклоняет PATH_INFO для обычных файлов

  • другие обработчики, такие как mod_cgi, mod_isapi или mod_php, обычно принимают PATH_INFO.

Если вы хотите явно отключить это для всех обработчиков, используйте:

AcceptPathInfo Off

PHP-FPM

В AcceptPathInfo похоже, не работает с PHP-FPM, например. если есть такой обработчик прокси:

<FilesMatch "\.php$">
    SetHandler  "proxy:unix:/run/php/php7.4-fpm.sock|fcgi://localhost"
</FilesMatch>
<Proxy "fcgi://localhost/">
</Proxy>

В этом случае вы могли бы, например, запретить доступ ко всем URL, содержащим .php/.