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


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

2 октября 2014 г.

Stream "Now Playing" feature

https://obsproject.com/forum/resources/smg-now-playing.46/
Полезная штуковина если нужно отображать название трека, который сейчас играет.

29 сентября 2014 г.

SoundCloud Playlist Shuffle

Виджет для рандомизации очереди выполнения трэков виджета SoundCloud: https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/playlists/52259130

// via http://stackoverflow.com/a/6274381
//+ Jonas Raoni Soares Silva
//@ http://jsfromhell.com/array/shuffle [v1.0]

require(['lib/play-manager'], function (a) {
    function shuf(o) {
        for(var j, x, i = o.length; i; j = Math.floor(Math.random() * i), x = o[--i], o[i] = o[j], o[j] = x);
    }
    shuf(a.source.models);
    var c = a.getCurrentSound(), p = c ? c.isPaused() : false;
    a.playNext();
    a.playPrev();
    if (p) {
        a.pause(c);
    }
});

Источник

20 декабря 2013 г.

Веб-тулы для проверки регулярных выражений

Пара удобных онлайн-инструментов для тестирования регулярок:

http://gskinner.com/RegExr/ - сделано на Flash, поддерживается, по моему, только PCRE.

Достаточно удобный интерфейс, есть возможность сохранять шаблоны на будущее, есть база примеров шаблонов (много примитивов, но есть и пара сложных).

Самый большой плюс - база пользовательских шаблонов. С категориями, поиском и описанием, даже рейтинг у каждого отдельного шаблона есть. База довольно обширная, можно много чего интересного надыбать.

Кроме "поиск" по шаблону, есть "замена" по шаблону - прописываем шаблон, прописываем на что менять, вставляем исходный текст и получаем в отдельном поле текст с произведенной заменой.

Отдельно нужно оговорить, что при наведении на шаблон, подсвечиваются группы и выдается подсказка, что конкретная часть шаблона делает. Не всегда работает корректно, замечены глюки с использованием экранированных спец-символов. Например, при поиске названия функции по такому шаблону - "([^\s\(]+)" - при наведении будет писать, что не найдена закрывающая скобка.



http://regex101.com/ - сделано на JavaScript, поддерживается PHP (PCRE), JavaScript, Python.

Дизайн также довольно удобен, но данный сервис "одноразовый" - ничего нигде не сохраняется. Главное отличие от предыдущего сервиса - улучшенная работа с разбором регулярных выражений - автоматическое выделение групп в самом шаблоне разными цветами (и, по моему, такими же цветами и в исходном тексте подсвечивается найденное, но не уверен).

Два самых важных отличия - отображение результатов и детальный разбор шаблона.

Отсутствие "замены" компенсируется наличием отображения результатов поиска, чего в первом инструменте нет.

Детальный же разбор шаблона - крайне полезная штука. Благодаря ему для себя узнал интересные особенности работы регулярных выражений с повторяемыми "группами захвата". Оказывается, сохраняется только последняя.

Очень удобно пользоваться этим инструментом, когда нужно понять, что же происходит в чужом сложном трехэтажном шаблоне.

19 декабря 2013 г.

Удаление дубликатов строк в файле

If you have a file in which all lines are sorted (alphabetically or otherwise), you can easily delete (consecutive) duplicate lines. Simply open the file in your favorite text editor, and do a search-and-replace searching for ^(.*)(\r?\n\1)+$ and replacing with \1. For this to work, the anchors need to match before and after line breaks (and not just at the start and the end of the file or string), and the dot must not match newlines.