Штатные комментарии WordPress включаются одной галочкой, и именно поэтому их часто выключают совсем: спам, ссылки на казино, чужие почты в базе. Под статьями этого блога комментарии есть, и сделаны они так, чтобы ни одна из этих проблем не возникла.

Это шестая часть цикла «WordPress на кэшируемом сайте» — первая из трёх про комментарии.

Что опасно в штатном варианте

ЧтоЧем плохо
wp-comments-post.phpоткрытый адрес приёма, его знают все спам-боты; форма ему не нужна
поле «почта»персональные данные, которые нужно хранить и защищать, а для комментария они не нужны
Gravatarзапрос к внешнему сервису на каждом комментарии; в адресе картинки — хэш почты, и по словарю адресов его можно сопоставить с человеком
ссылки в тексте и поле «сайт»ради них и приходит спам
публикация без проверкивсё, что прошло фильтр, сразу на странице
куки комментаторавыключают кэш этому посетителю — об этом седьмая часть

Как сделано здесь

  • только имя и текст. Почту не спрашиваем — нечему утечь;
  • всё на модерацию. Опубликованным становится только одобренное; о новом комментарии сразу приходит сообщение в рабочий Telegram со ссылкой на модерацию, а если Telegram недоступен — письмо;
  • без HTML и ссылок. Теги вырезаются, вывод только через esc_html. Комментарий со ссылкой не уходит на модерацию, а отклоняется сразу с подсказкой «опишите словами»;
  • Gravatar выключен, вместо аватара — первая буква имени;
  • свой приём через ajax, а штатный wp-comments-post.php анониму отвечает 403;
  • REST для анонимных комментариев закрыт;
  • отдельная галочка согласия на обработку данных: имя публикуется рядом с комментарием.
add_filter('pre_comment_approved', fn($approved, $data) =>
    !empty($data['user_id']) && user_can((int) $data['user_id'], 'moderate_comments') ? $approved : 0, 99, 2);

add_filter('preprocess_comment', function ($data) {
    if (empty($GLOBALS['own_comment_ajax']) && !current_user_can('moderate_comments')) {
        wp_die('Комментарии принимаются только через форму на странице статьи.', '', ['response' => 403]);
    }
    return $data;
}, 1);

add_filter('rest_allow_anonymous_comments', '__return_false');
add_filter('pre_option_show_avatars', fn() => '0');
remove_action('set_comment_cookies', 'wp_set_comment_cookies');
remove_filter('comment_text', 'make_clickable', 9);

Защита от ботов без капчи

  • поле-ловушка: невидимое поле «сайт», которое человек не видит и не заполняет, а бот заполняет;
  • время заполнения: скрипт считает секунды с открытия страницы; меньше 5 — не человек;
  • лимит с адреса: не больше 3 комментариев за 10 минут;
  • длина: до 3000 символов.

Ботам, попавшимся на ловушку или время, отвечаем «спасибо, появится после проверки» — так же, как человеку. Отказ с объяснением подсказал бы, что именно его выдало.

Комментарии без JavaScript не отправить: время заполнения ставит скрипт. Для блога о разработке это осознанная цена — почти весь спам приходит именно без скрипта.

Ответы — два уровня

Дерево ответов — в два уровня: комментарий и ответы под ним. Ответ на ответ встаёт под исходный комментарий, а не уходит лесенкой вправо, — на телефоне глубокое дерево нечитаемо.

А при чём тут кэш

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

Отключили комментарии из-за спама?

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

· полезно?
АЧ
Алексей Чикун веб-разработчик, команда TRIOHEAD

Делаю сайты и сервисы целиком: от вёрстки до сервера. Пишу о том, что проверил на своих проектах.

Комментарии

// загружаю комментарии…

Комментарии публикуются после проверки. Ссылки и HTML не принимаются.