# 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). Он должен быть основан на разрешающем, а не блокирующем списке.
* Заставляйте все перенаправления сначала проходить через страницу, уведомляющую пользователей о том, что они уходят с вашего сайта, с четким указанием места назначения, и заставляйте их нажимать ссылку для подтверждения.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://notes.kraken-security.ru/kraken/secure-coding/client-side/open-redirects.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
