Проблема: неавторизованные пользователи могут вставлять видео в комментариях и отзывах WooCommerce
В стандартной установке WooCommerce и WordPress пользователи с возможностью оставлять отзывы могут вставлять ссылки и HTML-код, включая видео. Это создает риск, что неавторизованные пользователи вставят нежелательный или вредоносный видеоконтент, что влияет на безопасность и качество отзывов.
Диагностика проблемы
Чтобы проверить, действительно ли неавторизованные пользователи могут вставлять видео в отзывы, выполните следующие шаги:
- Отключите авторизацию на сайте или откройте форму отзыва для гостей.
- Попробуйте вставить в поле отзыва iframe или ссылку на видео (например, YouTube embed).
- Отправьте отзыв и проверьте, отобразился ли видео-контент на странице товара.
Если видео отображается, значит, ограничение на вставку видео для гостей отсутствует, и требуется доработка.
Пошаговое решение: запрет видео в отзывах WooCommerce для неавторизованных
Реализуем фильтрацию содержимого отзывов, удаляя теги <iframe> и <video> для гостей, оставляя возможность вставлять видео только авторизованным пользователям.
1. Добавляем фильтр на обработку содержимого комментария
add_filter('preprocess_comment', 'restrict_video_in_reviews_for_guests');
function restrict_video_in_reviews_for_guests($commentdata) {
if (!is_user_logged_in() && isset($commentdata['comment_content'])) {
// Удаляем теги iframe и video из текста комментария
$commentdata['comment_content'] = preg_replace('#<iframe.*?</iframe>#is', '', $commentdata['comment_content']);
$commentdata['comment_content'] = preg_replace('#<video.*?</video>#is', '', $commentdata['comment_content']);
}
return $commentdata;
}
2. Фильтрация при выводе отзывов (на всякий случай)
Чтобы исключить обход ограничения с помощью JavaScript или других способов, дополнительно фильтруем вывод отзывов:
add_filter('comment_text', 'filter_video_tags_in_review_output', 10, 3);
function filter_video_tags_in_review_output($comment_text, $comment, $args) {
if (!is_user_logged_in()) {
$comment_text = preg_replace('#<iframe.*?</iframe>#is', '', $comment_text);
$comment_text = preg_replace('#<video.*?</video>#is', '', $comment_text);
}
return $comment_text;
}
Проверка результата после внедрения
- Выйдите из аккаунта и попробуйте оставить отзыв с видео (iframe или video тег). Видео должно быть удалено из содержимого.
- Авторизуйтесь и повторите попытку — видео должно отображаться без изменений.
- Проверьте исходный код страницы с отзывами, чтобы убедиться, что теги видео отсутствуют у гостей.
Частые ошибки и их исправление
- Видео не удаляется из отзыва: проверьте, что фильтр
preprocess_commentдобавлен правильно и нет конфликтов с другими плагинами, которые могут переписывать комментарии. - Удаляется весь HTML: убедитесь, что используете только удаление конкретных тегов, а не всю разметку.
- Видео пропадает и для авторизованных: проверьте условие
!is_user_logged_in()и его корректность.
Практические советы по безопасности и производительности
- Для более надежной фильтрации можно использовать библиотеку HTMLPurifier или встроенную функцию
wp_kses()с разрешенным набором тегов. - Ограничение вставки видео для гостей снижает риск XSS-атак и загрузки вредоносного контента.
- Для улучшения UX можно добавить сообщение об ошибке или предупреждение при попытке вставить видео без авторизации через JavaScript в форме отзыва.
Сравнение вариантов реализации ограничения вставки видео в отзывах WooCommerce
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
Фильтрация на preprocess_comment | Удаление тегов видео из комментария перед сохранением | Простота, работает на сервере | Не исключает обход при выводе без фильтрации |
Фильтрация на comment_text | Удаление тегов при выводе комментариев | Защищает от обхода, дополнительно фильтрует вывод | Дополнительная нагрузка на вывод |
| Использование HTMLPurifier/ wp_kses | Полная очистка и разрешение только безопасных тегов | Максимальная безопасность | Сложнее настроить, требует дополнительные библиотеки |