> For the complete documentation index, see [llms.txt](https://notes.kraken-security.ru/kraken/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://notes.kraken-security.ru/kraken/secure-coding/client-side/open-redirects.md).

# Open Redirects

## 1. Введение:

Небезопасные перенаправления и переадресации возможны, когда веб-приложение перенаправляет запрос на URL, заданный при помощи произвольного ввода. Изменив произвольный URL на вредоносный сайт, злоумышленник может успешно запустить фишинговую аферу, украсть учетные данные пользователя и многое другое.

## 2. Типичный уязвимый код:

Типичный уязвимый код принимает некоторый url-параметр, на который он перенаправляет пользователя.

{% tabs %}
{% tab title="PHP" %}

```php
<?php
...
$redirect_url = $_GET['url'];
header("Location: " . $redirect_url);
...
?>
```

{% endtab %}

{% tab title="Java" %}

```java
...
response.sendRedirect(request.getParameter("url"));
...
```

{% endtab %}
{% endtabs %}

## 3. Смягчение последствий

Правило, которое вы, вероятно, уже заметили, если прочитали все остальные темы, заключается в том, что каждый разработчик должен ВАЛИДИРОВАТЬ вводимые данные! Валидация и фильтрация ввода - это методы защиты от любого вида эксплуатации доступного пользователю ввода.

Однако в данном сценарии валидация ввода даже не нужна. Поскольку разработчик обычно знает, куда ему нужно перенаправить пользователя, больше нет необходимости в параметре url, который может быть использован. Мы можем просто зарубить его на корню :)

На вкладке Java следующего кирпичика кода вы найдете способ не хардкорить сам url, а сконструировать его вместо этого.

{% tabs %}
{% tab title="PHP" %}

```php
<?php

/* Redirect the browser. */
header("Location: http://www.bobi.io");

/* Exit to prevent the rest of the code from executing. */
exit;

?>
```

{% endtab %}

{% tab title="Java" %}

```java

// build the redirectURL based on the hostname lookup
StringBuilder redirectUrl = new StringBuilder()
    .append(request.getScheme())
    .append("://")
    .append(InetAddress.getLoopbackAddress().getHostName())
    .append(request.getContextPath()
);

//
response.sendRedirect(redirectUrl);
```

{% endtab %}
{% endtabs %}

## 4. Выводы:

Безопасное использование перенаправлений и переадресаций может быть обеспечено несколькими способами:

* Просто избегайте использования перенаправлений и переадресаций.
* Если они используются, не допускайте ввода URL-адреса в качестве адресата пользователем.
* Если пользовательского ввода не избежать, убедитесь, что вводимое значение действительно, подходит для приложения и авторизовано для пользователя.
* Санируйте вводимые данные, создавая список доверенных URL (списки хостов или regex). Он должен быть основан на разрешающем, а не блокирующем списке.
* Заставляйте все перенаправления сначала проходить через страницу, уведомляющую пользователей о том, что они уходят с вашего сайта, с четким указанием места назначения, и заставляйте их нажимать ссылку для подтверждения.
