Еще больше про SEO, сайты и маркетинг
+секретные методики в нашем телеграм канале!
Внешние ссылки — это мосты, которые ведут пользователей за пределы вашего сайта. Они полезны, но иногда ломают не только навигацию, но и безопасность: фишинг, вредоносные скрипты, утечки реферера и даже атаки через окно-родитель. Здесь разберём конкретные практики, которые реально работают и легко внедряются.
Я расскажу о простых правилах, которые стоит применить немедленно, и о более глубоких подходах для крупных проектов. Никакой воды — только проверенные рекомендации и примеры, понятные разработчикам и владельцам сайтов.
Первая угроза — эксплуатация target=»_blank». Открыв новую вкладку, вы даёте ей доступ к объекту window.opener. Злоумышленник может перенаправить исходную страницу на фишинговую форму или выполнить скрипт в её контексте.
Вторая — вредоносный контент по ссылке: фишинговые сайты, загрузки с вирусами, эксплойты на уязвимых браузерах. Третья — утечка данных через заголовок Referer: URL с токенами или приватными параметрами может оказаться в логах стороннего сервера.
Самое простое и эффективное — добавлять rel=»noopener noreferrer» к ссылкам с target=»_blank». noopener блокирует доступ к window.opener, noreferrer дополнительно убирает реферер. В большинстве браузеров rel=»noreferrer» также включает noopener, но лучше указывать оба атрибута явно.
Для пользовательского контента используйте rel=»ugc» и rel=»sponsored» по назначению. Google рекомендует rel=»ugc» для ссылок, созданных пользователями, и rel=»sponsored» для рекламных или платных ссылок. rel=»nofollow» по-прежнему работает, но сейчас есть более точечные атрибуты.
Не доверяйте href, который пришёл от пользователя. Пропускайте только разрешённые схемы (http, https, mailto, tel по необходимости), запрещайте javascript:, data: и прочие потенциально опасные схемы. Кодируйте и нормализуйте адреса, чтобы избежать обхода валидации.
Используйте allowlist доменов или регулярные выражения для контролируемых сценариев. Для внешних перенаправлений применяйте промежуточную страницу-предупреждение или редирект через сервер с проверкой целевого URL.
Content Security Policy помогает ограничить загрузку скриптов и фреймов с неразрешённых источников. Директивы вроде frame-ancestors и default-src уменьшают риск включения вредоносного контента из внешних ресурсов.
Интеграция с сервисами репутации URL (Google Safe Browsing или аналогами) даёт дополнительную проверку перед тем, как разрешить переход по ссылке. Для UGC стоит сканировать ссылки асинхронно и помечать подозрительные.
Если ссылка ведёт на сторонний ресурс, показывайте мягкое предупреждение: «Вы покидаете сайт…». Для платных ссылок или сумнівных доменов можно открывать специальную страницу-переадресатор с описанием риска.
Открытие в новой вкладке удобно, но не обязательно. Иногда лучше открывать внутри приложения с контролируемым предпросмотром или не использовать target=»_blank» вовсе.
| Мера | Цель | Когда применять |
|---|---|---|
| rel=»noopener noreferrer» | Защита от tabnabbing и утечки Referer | Все ссылки с target=»_blank» |
| rel=»ugc» / rel=»sponsored» | Маркировка UGC и платных ссылок | Комментарии, форумы, рекламные блоки |
| Серверная валидация URL | Блокировка опасных схем и SSRF | Любые ссылки от пользователей |
| CSP | Ограничение загрузки внешних скриптов и фреймов | Проекты с высоким уровнем безопасности |
Безопасные внешние ссылки — это набор простых привычек и немного технической дисциплины. Добавьте rel=»noopener noreferrer», фильтруйте и валидайте URL, маркируйте UGC и платные ссылки, используйте CSP и сканеры. Эти шаги значительно снизят риск для пользователей и репутации сайта.
Не нужно усложнять: начните с трёх вещей — валидация, rel-атрибуты и предупреждения — и вы уже на шаг впереди большинства проблем.