Обход плагина WP Hashcash

WP Hashcash — очередной для борьбы со спамом. Принцип работы основывается на том, что -боты не умеют исполнять . Идея в том, что если пользователь открыл сайт из браузера, браузер выполнит некоторый хитрый код , и реузльтат работы этого скрипта будет передан назад на сервер в качестве доказательства «человечности» комментатора. Далее »

Автор: , опубликовано в: Безопасность, Плагины WordPress, комментариев: 2
26
Дек
2011

SQLMon для Yii

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

Ситуацию частично исправило расширение под названием Yii DB profiler. Но остались некоторые неудобства:

  • Отображение запросов в порядке убывания времени выполнения — в принципе, это дело вкуса: при таком порядке сразу видны проблемные запросы. С другой стороны, лично мне более привычен хронологический порядок — так чётче прослеживается логика работы;
  • Prepared statements. Это просто здорово, но если повторять запрос в phpMyAdmin (например, если интересует план выполнения запроса), бывает очень муторно заменять все связанные значения. Например, для запросов вида
    [-]
    View Code MySQL
    SELECT 't'."object_id" AS "t0_c0", 't'."ymd" AS "t0_c1", 't'."black" AS "t0_c2", 't'."brown" AS "t0_c3", 't'."yellow" AS "t0_c4",
    't'."neutral" AS "t0_c5", 't'."white" AS "t0_c6", 't'."unknown" AS "t0_c7", 't'."error" AS "t0_c8", 'object'."object" AS "t1_c2",
    'object'."id" AS "t1_c0"
    FROM 'dnsbl_summary' 't'
    LEFT OUTER JOIN 'objects' 'object' ON ('t'."object_id"='object'."id")
    WHERE (((black > 0) OR (brown > 0)) AND
    (((((((((ymd=:ycp0) AND (black>:ycp1)) AND (brown=:ycp2)) AND (yellow=:ycp3)) AND
    (neutral>:ycp4)) AND (white>:ycp5)) AND (unknown=:ycp6)) AND (black>:ycp7)) AND
    (error=:ycp8))) AND (object.enabled = 1)
    LIMIT 50
    заменять все :ycpXXX на их значения немного муторно. В общем случае здесь вряд ли можно что-то сделать — заполнители параметров могут быть любыми (и даже позиционными), поэтому тупое использование str_replace может наделать делов.

Лично мне список запросов нужен обычно только для двух вещей:

  1. Оценка работы механизмов кэширования;
  2. Оценка плана выполнения запроса, составленная оптимизатором.

Первое обычно не критично (зачастую достаточно посмотреть на количество запросов), а вот второе позволяет выявить многие будущие проблемы с производительностью заранее.

В результате, взяв за основу Александра, я портировал SQLMon на Yii.
Далее »

Автор: , опубликовано в: Yii, комментариев: нет
22
Ноя
2011

Преобразование ошибок в PHP в исключения

Навеяно этим сообщением на форуме.

Дано:

  • фреймворк перехватывает все возникающие ошибки (которые разрешены текущим значением error_reporting()) и аварийно завершает работу скрипта (в целях отладки/безопасности/нужное подчеркнуть);
  • имеется код, вызывающий -функцию, которая может сгенерировать предупреждение (в оригинальном сообщении это mkdir() — кидает E_WARNING, если не удаётся создать каталог)
  • местные стандарты кодирования запрещают использование оператора @ (довольно распространённая практика).

Требуется обработать возникшую ошибку без авоста скрипта. Далее »

Автор: , опубликовано в: PHP, комментариев: 8
17
Авг
2011

Перехват фатальных ошибок в Yii

Как и , помогает разработчику, отлавливая неперехваченные исключения и ошибки в коде. Как и в , реализуется это одинаково — через функции set_exception_handler() и set_error_handler(). Но, в отличие от Kohana, Yii не умеет перехватывать фатальные ошибки (E_ERROR в терминах PHP).

Как следствие, если приложение сгенерирует фатальную ошибку (например, вызов несуществующей функции), у разработчика все шансы об этом не узнать (например, на production-сервере с display_errors установленным Off). Конечно, если приложение хорошо протестировано шансы возникновения такой ситуации близки к нулю, но если приложение позволяет пользователю устанавливать какие-либо свои дополнения, то лучше узнавать о проблемах прежде, чем начальник получит кучу гневных писем :-) Далее »

Автор: , опубликовано в: Yii, комментариев: 1
7
Авг
2011

Вложенные транзакции в PDO

В есть такая особенность: отсутствие поддержки вложенных транзакций.

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

Может так случиться, что сервисы А и Б разрабатываются разными людьми и разработчик сервиса Б может не знать, что сервис А уже начал выполнение транзакции. Как следствие, при использовании PDO как только сервис Б попытается начать транзакцию, PDO выбросит исключение, предупреждающее о наличии активной транзакции.

Тем не менее, такие СУБД как и поддерживают вложенные транзакции (о чём PDO не знает). Поэтому было бы неплохо добавить поддержку вложенных транзакций для данных СУБД в PDO. Далее »

Автор: , опубликовано в: PHP, комментариев: 4
6
Авг
2011

Ставим спам в комментариях на службу людям

Я давно получаю по несколько тысяч -комментариев в день (не то, что мне он мешает — система его отсеивает полностью автоматически) и, как следствие, давно думаю о том, как заставить этот служить людям.

Начиналось всё созданием чёрных списков типа DNSBL (сюда попадали -адреса спамеров) и URIBL (а сюда — рекламируемые домены), но на раскрутку очередного чёрного списка (а также на его поддержание) банально не было ни сил, ни времени.

Закончилось всё тем, что я прекратил заниматься велосипедостроительством, зарегистрировался на Stop Forum Spam и теперь отсылаю весь полученный спам туда. Хотя я не во всём согласен с SFS, положительным моментом является то, что списки спамеров мониторятся (пример 1, пример 2). Хотя Spamhaus о себе тоже много думает (блокировать почту на основании того, что с данного IP-адреса идёт форумный спам — бред), тем не менее, у Spamhaus больше шансов прикрыть спамера, чем у простого блоггера.

На этом лирическое отступление закончено, далее идёт рассказ о том, как автоматически сообщать об автоматическом спаме в , ибо чем больше отчетов они получат, тем быстрее спамер будет остановлен. Далее »

Автор: , опубликовано в: WordPress, комментариев: 8
6
Авг
2011

php: symbol zlibVersion, version libmysqlclient_16 not defined in in file libmysqlclient.so.16 with link time reference

Не везёт мне с на

Ситуация: имеется сервер на CentOS с установленной CPanel. PHP в случайные моменты времени завершается с ошибкой вида

php: relocation error: php: symbol zlibVersion, version libmysqlclient_16 not defined in in file libmysqlclient.so.16 with link time reference

Вместо zlibVersion может быть другое имя, например crc32.

Из-за CPanel/WHM возможности ограничены опциями, предоставляемыми EasyApache — обновить /PHP штатными средствами (например, через yum) не представляется возможным из-за риска сломать CPanel. Далее »

Автор: , опубликовано в: Linux, комментариев: 1
30
Май
2011

KSES в WordPress: можно ли проще?

Вчера мне довелось разбираться с тем, как работает в .

KSES (рекурсивный акроним от KSES Strips Evil Scripts) — подсистема в WordPress (изначально написанная Ulf Harnhammar), предназначенная для проверки и очистки текста, введённого пользователем: она позволяет задать список допустимых тэгов, стилей и протоколов и на основе этих параметров убрать из текста пользователя всё, что им не соответствует.

KSES является довольно стабильной подсистемой; что немаловажно, KSES работает. Работает — не трогай, а то сломаешь… Далее »

Автор: , опубликовано в: WordPress, комментариев: 23
10
Фев
2011

Автоматическая проверка репутации IP-адреса

Репутация -адреса — одна из очень важных составляющих, используемых для борьбы с почтовым спамом.

Письма приходят с IP-адресов, а репутация этих адресов может сказать, является ли данный адрес ответственным за рассылку спама или нет. По некоторым данным проверка репутации IP-адресов позволяет остановить порядка 80% спама.

Как следствие, компании, занимающиеся массовой рассылкой электронных писем, должны заботиться о поддержании хорошей репутации адресов своих почтовых серверов. Далее »

Автор: , опубликовано в: PHP, комментариев: 6
3
Фев
2011

WordPress: кэширование средствами nginx

Много было сказано про кэширование в WordPress… Сегодня я хочу рассказать о действительно эффективном методе, позволяющем сильно снизить нагрузку.

Метод основан на использовании кэша web-сервера .

Идея состоит в генерации статических страниц и отдачи их пользователям, не имеющим cookie комментатора. Зарегистрированным пользователям, а также комментаторам всегда отдаётся свежая страница. Так как читателей, ни разу не оставлявших комментарий, как правило, гораздо больше, чем комментаторов, то подобный использование кэша позволяет значительно снизить нагрузку на /. Знакомые с принципом работы WP Super Cache заметят, что WPSC использует тот же принцип работы. Далее »

Автор: , опубликовано в: nginx, WordPress, комментариев: 61
10
Дек
2010