Глоссарий
Что такое открытый редирект — ваш доверенный URL как трамплин на чужой сайт
Открытый редирект позволяет URL на вашем сайте перенаправить посетителя на любой внешний сайт, и ваш доверенный домен превращается в трамплин для фишинга. Как это работает и реальная защита (allowlist целей редиректа, никогда не принимать внешние URL) — изложено в защитном ключе, без шагов атаки.
«Начало URL было вашим настоящим доменом, но после клика я оказался совершенно на другом сайте» — это и есть открытый редирект. Вот как он работает и как его надёжно предотвратить (без шагов атаки).
Почему это опасно
Главный вред — заимствование доверия к вашему домену.
| Как злоупотребляют | Что происходит |
|---|---|
| Трамплин для фишинга | Ссылка начинается с настоящего домена → пользователи и фильтры доверяют ей → переход на поддельный сайт |
| Перехват потока аутентификации | Подмена цели редиректа в потоках в стиле OAuth, чтобы перехватить токен/код |
| Усиление других багов | В сочетании с SSRF или XSS для расширения ущерба |
Почему это работает
Это встречается в функциях вроде «вернуть пользователя туда, где он был, после входа», где URL возврата принимается на доверии и используется как есть. «Начало» URL, которое видит пользователь, — настоящий домен, поэтому усомниться до самого конца сложно.
Защита: не принимайте внешние URL
Разрешайте только относительные пути (самое важное)
Принимайте цели возврата вроде /dashboard — только относительные пути — и отклоняйте полные URL (начинающиеся с http:// или //). Не оставляйте пользователю возможности задать домен назначения.
Сверяйте с allowlist
Если нужны динамические цели, разрешайте только записи из фиксированного набора известных назначений (карты). Всё остальное откатывается на страницу по умолчанию.
Не полагайтесь на проверки строк
//evil, обратные слеши, @ и многократное кодирование обходят наивные фильтры. Измените то, что вы принимаете (относительные пути + allowlist), вместо латания фильтров.
Если переход на внешний сайт необходим — сделайте его явным
Когда внешние редиректы задуманы намеренно, показывайте промежуточную страницу («Вы переходите на внешний сайт»). Не перенаправляйте молча.
Мнение этого сайта: сам по себе «низкий», но опасен в паре с фишингом
Открытые редиректы часто оценивают как низкий риск сам по себе, но поскольку они одалживают доверие к вашему домену, они становятся мощными в сочетании с фишингом или перехватом аутентификации. Поэтому решение на уровне проектирования — относительные пути + allowlist — эффективно убивает корень проблемы. Это перекликается с SSRF (заставить сервер соединиться куда угодно): оба разделяют принцип защиты — никогда не позволять пользователю решать, куда идти.
Читать дальше
- Глоссарий: Что такое SSRF · Что такое XSS
- Основы: Основы безопасности
FAQ
QПочему открытый редирект — это проблема?
Первый домен в URL — ваш настоящий, доверенный (например, страница входа), поэтому пользователи и почтовые фильтры уверенно кликают по ссылке. Но сайт перенаправляет их на любой внешний ресурс, и ваш настоящий домен становится трамплином для фишинга и плацдармом для кражи токенов в потоках аутентификации.
QКакая защита главная?
Не принимайте внешние URL как цель редиректа. Для возврата после входа разрешайте только относительные пути (/dashboard) и сверяйте их с allowlist (фиксированным набором известных назначений). Если вам действительно нужно увести пользователя на сторонний сайт, покажите промежуточную страницу с предупреждением, что он покидает сайт.
QДостаточно ли проверки на http://?
Нет. Бессхемные формы (//evil.example), обратные слеши, кодирование и запутывающие URL с @ — всё это обходит наивные проверки. Вместо того чтобы судить о строке, проектируйте так, чтобы внешний URL вообще никогда не принимался (относительные пути + allowlist).