17 April 2021
Как все мы знаем, HTTP-запросы бывают двух типов – GET и POST. С логированием GET-запросов проблем никаких не возникает – все такие запросы заносятся в файл access.log. А вот что с POST-запросами? Как мы узнаем, какой пользователь обращался с помощью POST к нашим сценариям? В этом нам поможет модуль modsecurity. Также будет показан способ без изменения конфигурации сервера.
Возможности modsecurity довольно большие, но нас интересует сейчас только логирование POST-запросов, на этом и остановимся.
Установите modsecurity:
sudo apt install libapache2-modsecurity
Скопируйте файл конфигурации с рекомендуемыми параметрами, чтобы использовать его в качестве основного файла конфигурации:
cd /etc/modsecurity/ sudo cp modsecurity.conf-recomended modsecurity.conf
Откройте файл /etc/modsecurity/modsecurity.conf для редактирования:
sudo mcedit /etc/modsecurity/modsecurity.conf
Добавьте в него следующие строки:
SecRequestBodyAccess On SecRule REQUEST_METHOD "POST" "id:200012,phase:2,ctl:auditEngine=On,log,pass"
При желании вы можете настроить и другие параметры этого модуля – обратитесь к документации (вы без проблем найдете ее в Интернете). Перезапустим Apache:
sudo service apache2 restart
Файл журнала modsecurity называется /var/log/apache2/modsec_audit.log. Если на сервере "крутится" несколько сайтов, то соответствующую настройку можно произвести для каждого отдельного виртуального узла. Откройте файл конфигурации виртуального узла и добавьте строки:
SecAuditLog /var/log/apache2/audit_example_com.log SecRule REQUEST_METHOD "POST" "id:22222224,phase:2,ctl:auditEngine=On,log,pass" SecRuleEngine On
Здесь мы не только включаем логирование POST-запросов, но и указываем файл конфигурации.
Совсем другое дело, если мы не можем редактировать конфигурацию сервера, то есть у нас есть обычный хостинг, а логировать запросы к сайту нужно. В этом случае поможет следующий PHP-сценарий (postlog.php):
0){ $data=""; // собираем POST-данные, если они вообще есть foreach($_POST as $key=>$val){ if(is_string($val) && strlen($val)>2000 ) $val=substr($val,0,2000); $data.=$key."=>".$val."\n"; } // вместо /home/example.com/ указываем свой путь от // корня сервера, куда должен писаться лог $fp=fopen("/home/example.com/post-logs/".$_SERVER['HTTP_HOST']."--".date("Ymd").".log","a"); fwrite($fp,date("Y-m-d H:i:s")." ".$_SERVER['REMOTE_ADDR']." ".$_SERVER['SCRIPT_FILENAME']."\n".$data."---------------------------\n"); fclose($fp); $data=""; reset($_POST); } ?>
Теперь нужно сделать так, чтобы этот файл присоединялся к каждому выполняемому PH-сценарию. Для этого редактируем .htaccess и добавляем в него строку:
php_value auto_prepend_file /home/example.com/postlog.php
Путь к сценарию нужно указать полный – от корня сервера. На этом все. Мы показали два способа логирования POST-запросов, надеемся, статья будет для вас полезной.