11 November 2024
Як усі ми знаємо, 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-запитів, сподіваємося, стаття буде для вас корисною.