24 октября 2014 г.

PHP - логирование POST запросов

Бывают ситуации, когда требуется сохранить в лог содержимое $_POST (переменную POST запроса). Например, когда злоумышленник отправляет команды в файл, запрятанный на сайте, или при атаке большим количеством запросов POST, чтобы не только понять на какой адрес проходит атака (эту информацию можно получить из стандартных LOG-файлов web-сервера), но и какие данные используются.

Логирование POST-запросов при помощи PHP

Наиболее доступный (в том смысле, что не требует правки конфигурационных файлов веб-сервера) способ сохранения информации о содержимом переменных POST - сохранение переменной $_POST примерно следующим кодом:
// lev_save_post.php
$filename = dirname(__FILE__).’/log-post.txt’;
if (!empty($_POST)) {
$dh = fopen ($filename,’a+’);
fwrite($dh, var_export($_POST,true));
fclose($dh);
}

Теперь маленькая хитрость, которая заключается в том, что все запросы, которые приходят на сервер нужно пропустить через этот файл. Для этого как нельзя кстати подходит директива PHP-ini auto_prepend_file , которую можно подключить используя следующий код (вставляем в .htaccess, путь для надёжности указываем полный):
# .htaccess в корне добавим следующую строку
php_value auto_prepend_file /home/user/www/lev_save_post.php

Логирование POST запросов через Nginx

Для настройки логирования POST-запросов при помощи nginx следует добавить в нужный location следующие строки
log_format logpost $request_body;
access_log /var/log/nginx/post.log logpost;

Логирование POST запросов в Apache

Для логирования POST запросов в Apache 1 можно использовать mod_security.

SecAuditEngine On
# тип логирования Concurrent или
SecAuditLogType Concurrent
# путь к индексу
SecAuditLog /var/log/apache-post/index
# Каталог для запросов
# запросы сохраняются во вложенных каталогах день/транзакция
SecAuditLogStorageDir /var/log/apache-post/data
# логирование всех данных
SecAuditLogParts ABCDEFGHZ
# Используем POST данных.
SecFilterScanPOST On
SecFilterEngine On
# сохраняем загруженные файлы
SecUploadDir /var/log/apache-post/files
SecUploadKeepFiles On

В Apache2 есть упрощённый аналог исключительно для сохранения Post данных mod_log_post
mod_dumpio в Apache 2 также позволяет сохранять нужные данные http://httpd.apache.org/docs/2.2/mod/mod_dumpio.html

# Dump all input data to the error log
DumpIOInput On
DumpIOLogLevel debug


Источник: Заметки Лёвика