﻿# V5324\. OWASP\. Possible open redirect vulnerability\. Potentially tainted data is used in the URL\.

Анализатор обнаружил перенаправление с одного ресурса на другой\. Причём URL\-адрес для перенаправления был получен из внешнего источника и не проверялся\. Это может стать причиной возникновения уязвимости типа open redirect, если адрес будет скомпрометирован\.

Уязвимости типа open redirect относятся к категории рисков OWASP Top 10 Application Security Risks 2021: 

* [A1:2021\- Broken Access Control\.](https://owasp.org/Top10/A01_2021-Broken_Access_Control/)

Приведём пример:

```cpp
@GetMapping("/redirectExample")
public RedirectView redirect(@RequestParam("url") String url) {
  return new RedirectView(url);
}
```

В этом примере `url` может содержать заражённые данные, так как они получены из внешнего источника\. Эти данные используются для перенаправления клиента на адрес, который записан в `url`\. Подобная логика работы программы упрощает проведение фишинговых атак для кражи данных пользователя\.

Пример скомпрометированного адреса:

```cpp
URL: http://mySite.com/login?url=http://attacker.com/
```

Возможный сценарий проведения атаки:

* пользователь получает ссылку от злоумышленника и под каким\-то предлогом переходит по ней;
* он оказывается на известном сайте, который запрашивает авторизацию\. После ввода логина и пароля произойдёт перенаправление на поддельный сайт, который выглядит в точности, как ожидаемый;
* фишинговый сайт также запрашивает логин и пароль\. Пользователь думает, что ошибся и снова вводит данные для авторизации;
* соответственно, их получает злоумышленник, создавший поддельный сайт\. После этого происходит перенаправление на оригинальный сайт\. В итоге пользователь может даже не заметить, что его данные были украдены\.

Главная опасность open redirect состоит в том, что ссылка, полученная от злоумышленника, фактически ведёт на сайт, которому пользователь доверяет\. Следовательно, жертва с большей вероятностью перейдёт по ней\.

Для защиты от open redirect стоит проверять, что перенаправление осуществляется на локальный адрес или на адрес из белого списка\.

Исправленный пример:

```cpp
private static final List<String> ALLOWED_SITES = List.of(
            "https://goodsite.com",
            "https://verygoodsite.com"
    );

@GetMapping("/redirectExample")
public RedirectView redirect(@RequestParam("url") String url) {
  if (ALLOWED_SITES.contains(url)) {
    return new RedirectView(url);
  }
  // ....
}
```