Как запретить загрузку внешних 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.
Как синхронизировать поля ACF между сайтами WordPress
19.12.2025
Автоматическая синхронизация отзывов WooCommerce между сайтами WordPress
02.03.2026
Как автоматизировать удалённый вывод данных WooCommerce через REST API
19.07.2026
Автоматическая синхронизация пользовательских данных WordPress между сайтами
17.11.2025
Как сделать свойства контакта в WordPress в Contact Form 7
22.11.2025