При просмотре журналов доступа я заметил следующее автоматическое сканирование уязвимостей, для которого Apache возвращает статус 200:
POST /index.php/api/Uploadify/preview HTTP/1.1
Для этого виртуального хоста нет правила перезаписи, и файл / URL не существует. Я не могу найти для этого директиву Apache, и Google убежден, что я хочу создать такое поведение, а не отключать его.
Может ли кто-нибудь объяснить мне, почему Apache разрешает этот URL-адрес и / или как заставить его возвращать 404?
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
В AcceptPathInfo
похоже, не работает с PHP-FPM, например. если есть такой обработчик прокси:
<FilesMatch "\.php$">
SetHandler "proxy:unix:/run/php/php7.4-fpm.sock|fcgi://localhost"
</FilesMatch>
<Proxy "fcgi://localhost/">
</Proxy>
В этом случае вы могли бы, например, запретить доступ ко всем URL, содержащим .php/
.
Apache 2.2 LocationMatch
& Контроль доступа:
<LocationMatch ".php/">
Order deny,allow
Deny from all
</LocationMatch>
Apache 2.4 LocationMatch
& Контроль доступа:
<LocationMatch ".php/">
Require all denied
</LocationMatch>