Штатные комментарии 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 не отправить: время заполнения ставит скрипт. Для блога о разработке это осознанная цена — почти весь спам приходит именно без скрипта.
Ответы — два уровня
Дерево ответов — в два уровня: комментарий и ответы под ним. Ответ на ответ встаёт под исходный комментарий, а не уходит лесенкой вправо, — на телефоне глубокое дерево нечитаемо.
А при чём тут кэш
Безопасность — первая половина. Вторая: как сделать, чтобы комментарии не выключали кэш посетителю и не сбрасывали его всему сайту. Об этом две следующие части.
Отключили комментарии из-за спама?
Пришлите адрес — верну их без спама, без чужих почт в базе и без потерь в скорости.
// загружаю комментарии…