Проблема: опасность внешних iframe на сайте WordPress
Встраивание iframe с внешних источников может привести к серьёзным проблемам безопасности: внедрение вредоносного кода, фишинг, снижение производительности и утечка пользовательских данных. Особенно это актуально, если на сайте разрешена загрузка контента от пользователей, например, в комментариях или редакторах.
Как диагностировать наличие внешних iframe на сайте
Для проверки, используются ли iframe с внешних ресурсов, выполните следующие шаги:
- Откройте исходный код главной страницы сайта (Ctrl+U в браузере) и выполните поиск по
<iframe. - Проверьте атрибут
srcкаждого iframe. Если домен не совпадает с вашим, это внешний iframe. - Используйте инструменты разработчика (F12) во вкладке Network, чтобы увидеть все загружаемые ресурсы и их источники.
- Для массовой проверки можно использовать WP-CLI с командой
wp post list --format=idsи затем по ID проверить содержимое постов на наличие iframe через SQL:
SELECT ID, post_content FROM wp_posts WHERE post_content LIKE '%<iframe%';Пошаговое решение: запрет загрузки внешних iframe с помощью фильтра the_content
Самый надёжный способ — фильтровать контент перед выводом и удалять или блокировать iframe, если src ведёт на внешний домен.
Пример кода для functions.php вашей темы или собственного плагина:
function wpsync_filter_external_iframes($content) {
// Разрешённый домен (ваш сайт)
$allowed_domain = parse_url(site_url(), PHP_URL_HOST);
// Используем DOMDocument для парсинга
libxml_use_internal_errors(true);
$dom = new DOMDocument();
$dom->loadHTML('<?xml encoding="utf-8"?>' . $content);
$iframes = $dom->getElementsByTagName('iframe');
$remove = [];
foreach ($iframes as $iframe) {
$src = $iframe->getAttribute('src');
if (!$src) continue;
$host = parse_url($src, PHP_URL_HOST);
if ($host && $host !== $allowed_domain) {
$remove[] = $iframe;
}
}
// Удаляем внешние iframe
foreach ($remove as $iframe) {
$iframe->parentNode->removeChild($iframe);
}
// Возвращаем очищенный контент
$body = $dom->getElementsByTagName('body')->item(0);
$newContent = '';
foreach ($body->childNodes as $child) {
$newContent .= $dom->saveHTML($child);
}
return $newContent;
}
add_filter('the_content', 'wpsync_filter_external_iframes', 20);Объяснение кода
- Определяем домен текущего сайта через
site_url(). - Парсим контент поста через
DOMDocument. - Ищем все iframe и проверяем их
src. - Если домен в
srcне совпадает с разрешённым, удаляем iframe из DOM. - Возвращаем очищенный HTML контент.
Проверка результата после внедрения
- Обновите страницу с контентом, где раньше были внешние iframe.
- Проверьте исходный код страницы — iframe с внешними ссылками должны исчезнуть.
- Если вы используете кеширование — очистите кеш.
- Для дополнительной проверки используйте браузерные DevTools: во вкладке Elements убедитесь, что внешние iframe отсутствуют.
Частые ошибки и как их исправить
- iframe не удаляются: Возможно, фильтр подключён с низким приоритетом или конфликтует с другими плагинами. Попробуйте увеличить приоритет фильтра (например, 99) или временно отключить плагины, влияющие на
the_content. - Появляются ошибки парсинга: Убедитесь, что контент корректно кодируется в UTF-8, и что
libxml_use_internal_errorsвключена для подавления предупреждений DOMDocument. - Удаляются нужные iframe с вашего домена: Проверьте логику сравнения доменов, особенно если сайт работает с www и без, или с поддоменами. Можно добавить нормализацию домена через
strtolowerи убрать www.
Альтернативные методы: Content Security Policy (CSP) и плагины
Для блокировки внешних iframe можно использовать заголовок CSP:
Content-Security-Policy: frame-src 'self';Этот метод блокирует загрузку iframe с любых доменов, кроме вашего, но требует настройки сервера (например, через .htaccess или nginx конфигурацию). CSP удобен для комплексной защиты от внешних ресурсов.
Таблица сравнения методов:
| Метод | Плюсы | Минусы | Пример |
|---|---|---|---|
PHP фильтр the_content | Гибкий контроль, удаляет iframe из контента | Зависит от корректной обработки HTML, нагрузка на PHP | Код в статье |
| CSP заголовок | Блокирует на уровне браузера, эффективен против всех iframe | Сложен в настройке, может блокировать легитимные ресурсы | frame-src 'self'; |
| Плагины безопасности (например, Clearfy Pro) | Простота настройки, дополнительные функции безопасности | Могут влиять на производительность, не всегда точны | Clearfy Pro |
Практические советы по безопасности и производительности
- Всегда проверяйте, кто и где может вставлять iframe на вашем сайте — например, ограничьте права пользователей.
- Используйте HTTPS для всех ресурсов, чтобы избежать смешанного контента.
- Отключите автоподключение iframe в визуальных редакторах, если они позволяют вставлять произвольный HTML.
- Регулярно сканируйте сайт на наличие вредоносного кода, используя специализированные плагины и внешние сервисы.
- Если используете CSP, комбинируйте его с другими механизмами безопасности, например, X-Frame-Options.