Логування POST-запитів


Як усі ми знаємо, HTTP-запити бувають двох типів – GET та POST. З логуванням GET-запитів проблем ніяких не виникає – усі такі запити заносяться до файлу access.log. А ось що із POST-запитами? Як ми дізнаємося, який користувач звертався за допомогою POST до наших сценаріїв? У цьому нам допоможе модуль modsecurity. Також буде показано спосіб без зміни конфігурації сервера.

Використання 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-сценарію

Зовсім інша річ, якщо ми не можемо редагувати конфігурацію сервера, тобто ми маємо звичайний хостинг, а логувати запити до сайту потрібно. В цьому випадку допоможе наступний 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-запитів, сподіваємося, стаття буде для вас корисною.