Как запретить загрузку внешних iframe в WordPress для безопасности сайта

Проблема: опасность внешних 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.
Как синхронизировать пользовательские аватары WordPress между сайтами
21.03.2026
Как отключить автоматические обновления WordPress и плагинов
28.03.2026
Как сделать свойства контакта в WordPress в Contact Form 7
22.11.2025
Обратный синхрон в WordPress: решение проблем и пример кода
18.03.2026
Как синхронизировать виджеты WordPress между сайтами
09.01.2026