Открытые редиректы — одна из распространенных уязвимостей на сайтах WordPress, которая может привести к фишинговым атакам и потере доверия пользователей. В этой статье мы подробно рассмотрим, что такое открытые редиректы, почему они опасны и как с ними бороться на практике. Кроме того, приведем рабочие примеры функций и полезные плагины, которые помогут защитить ваш сайт.
Что такое открытый редирект и почему это опасно
Открытый редирект (open redirect) — это ситуация, когда сайт принимает URL для перенаправления из внешнего источника без должной проверки. Например, если пользователь вводит ссылку вроде https://example.com/redirect?url=http://malicious-site.com, а сайт просто перенаправляет на указанный в параметре адрес, это открытый редирект.
Опасность в том, что злоумышленники могут использовать такие ссылки, чтобы заставить пользователей перейти на вредоносные сайты, скрывая истинный адрес в ссылке, выглядящей как ваш домен. Это снижает доверие к вашему сайту и может привести к серьезным последствиям.
В WordPress открытые редиректы часто встречаются в функциях, использующих wp_safe_redirect() или wp_redirect() без проверки параметров, а также в некоторых плагинах, которые реализуют собственные механизмы редиректа.
Как выявить открытые редиректы на сайте — инструменты и методы
Первый шаг — проверить, есть ли у вас на сайте уязвимые редиректы. Сделать это можно с помощью специализированных сканеров безопасности, таких как:
- WPScan с опцией проверки редиректов;
- Burp Suite — профессиональный инструмент для анализа веб-приложений;
- Онлайн-сервисы вроде Open Redirect Check;
- Ручное тестирование с подстановкой различных URL в параметры редиректа.
Важно проверить как собственный код темы и плагинов, так и сторонние расширения. Часто уязвимости кроются именно в них.
Как защитить WordPress от открытых редиректов: практические советы
Для защиты от открытых редиректов надо в первую очередь внедрить проверку URL, на который выполняется перенаправление. Ниже приводим несколько подходов.
1. Использование wp_safe_redirect вместо wp_redirect
Функция wp_safe_redirect() проверяет, что URL для редиректа ведет на ваш домен или его поддомены. Это базовый способ избежать редиректов на внешние сайты.
function wp8_safe_redirect_example($url) {
if (wp_safe_redirect($url)) {
exit;
} else {
wp_die('Неверный URL для редиректа');
}
}Однако даже wp_safe_redirect не всегда покрывает все случаи, особенно если URL формируется динамически из входящих параметров.
2. Явная проверка URL на принадлежность к доверенному списку доменов
Можно реализовать функцию, которая проверит, что URL принадлежит вашему сайту или списку разрешенных доменов:
function wp8_is_allowed_redirect_url($url) {
$allowed_hosts = array(parse_url(site_url(), PHP_URL_HOST));
$host = parse_url($url, PHP_URL_HOST);
return in_array($host, $allowed_hosts);
}
function wp8_safe_redirect_custom($url) {
if (wp8_is_allowed_redirect_url($url)) {
wp_redirect($url);
exit;
} else {
wp_die('Редирект на внешний сайт запрещен');
}
}Этот метод более гибкий и позволяет контролировать редиректы точечно.
3. Очистка и фильтрация параметров редиректа
Если URL для редиректа приходит из GET или POST-запроса, никогда не используйте его без предварительной фильтрации и валидации. Например:
function wp8_get_safe_redirect_url() {
$redirect_url = isset($_GET['redirect_to']) ? esc_url_raw($_GET['redirect_to']) : '';
if (wp8_is_allowed_redirect_url($redirect_url)) {
return $redirect_url;
}
return home_url(); // перенаправляем на главную, если URL не безопасен
}Используйте эту функцию перед редиректом, чтобы гарантировать безопасность.
Полезные плагины для контроля и предотвращения открытых редиректов
Если вы не хотите писать код вручную, можно воспользоваться готовыми плагинами, которые помогут обнаружить и блокировать открытые редиректы:
- Redirection — популярный плагин для управления редиректами, который умеет фильтровать и логировать редиректы;
- WP Cerber Security — комплексный плагин безопасности с функциями защиты от различных атак, в том числе открытых редиректов;
- Safe Redirect Manager — легкий плагин для безопасного управления редиректами с возможностью ограничивать URL.
При использовании плагинов важно тщательно настраивать параметры и периодически проверять логи на предмет подозрительных редиректов.
Пример реализации безопасного редиректа в пользовательском плагине WP8
Ниже пример минимального плагина, который обрабатывает параметр redirect_to и выполняет безопасный редирект с проверкой домена:
<?php
/**
* Plugin Name: WP8 Safe Redirect
* Description: Безопасный редирект с проверкой URL
* Version: 1.0
* Author: WP8.ru
*/
function wp8_is_allowed_redirect_url($url) {
$allowed_hosts = array(parse_url(site_url(), PHP_URL_HOST));
$host = parse_url($url, PHP_URL_HOST);
return in_array($host, $allowed_hosts);
}
function wp8_handle_safe_redirect() {
if (isset($_GET['redirect_to'])) {
$redirect_url = esc_url_raw($_GET['redirect_to']);
if (wp8_is_allowed_redirect_url($redirect_url)) {
wp_redirect($redirect_url);
exit;
} else {
wp_die('Недопустимый URL для редиректа.');
}
}
}
add_action('template_redirect', 'wp8_handle_safe_redirect');
?>Этот код можно доработать, расширив список разрешенных доменов, добавив логирование попыток недопустимых редиректов и интеграцию с админ-панелью.
Итоги и рекомендации по работе с редиректами в WordPress
Чтобы снизить риск открытых редиректов на вашем сайте WordPress, придерживайтесь следующих правил:
- Используйте
wp_safe_redirect()вместоwp_redirect()там, где возможно; - Всегда проверяйте и фильтруйте входящие URL перед редиректом;
- Ограничивайте редиректы только доверенными доменами и адресами;
- Регулярно проверяйте сайт с помощью сканеров безопасности;
- Обновляйте плагины и темы, чтобы исключить уязвимости;
- Используйте проверенные плагины безопасности для дополнительной защиты.
Внедрение этих мер поможет надежно защитить ваш сайт на WordPress от злоумышленников и сохранить доверие пользователей.