<!-- review: finished -->

<a id="http-secure-link"></a>

# Secure Link

Позволяет проверять аутентичность запрашиваемых ссылок, защищать ресурсы от несанкционированного доступа, а также ограничивать срок действия ссылок.

Правильность запрашиваемой ссылки проверяется сравнением переданного в запросе значения контрольной суммы со значением, вычисляемым для запроса. Если ссылка имеет ограниченный срок действия и он истек, ссылка считается устаревшей. Результат этих проверок делается доступным в переменной [$secure_link](#v-secure-link).

Модуль реализует два альтернативных режима работы. В первом режиме, который включается директивой [secure_link_secret](#secure-link-secret), можно проверить аутентичность запрашиваемых ссылок и защитить их от несанкционированного доступа. Второй режим включается директивами [secure_link](#id2) и [secure_link_md5](#secure-link-md5), и позволяет также ограничить срок действия ссылок.

При [сборке из исходного кода](https://angie.software//angie/docs/installation/sourcebuild.md#sourcebuild) модуль не собирается по умолчанию; его необходимо
включить с помощью [параметра сборки](https://angie.software//angie/docs/installation/sourcebuild.md#configure)
`‑‑with‑http_secure_link_module`.
В пакетах и образах из
[наших репозиториев](https://angie.software//angie/docs/installation/index.md#install-packages)
модуль включен в сборку.

<a id="directives-41"></a>

## Директивы

<a id="index-0"></a>

<a id="id2"></a>

### secure_link

| [Синтаксис](https://angie.software//angie/docs/configuration/configfile.md#configfile)   | `secure_link` выражение;   |
|------------------------------------------------------------------------------------------|----------------------------|
| По умолчанию                                                                             | —                          |
| [Контекст](https://angie.software//angie/docs/configuration/configfile.md#configfile)    | http, server, location     |

Задает строку с переменными, из которой будет выделено значение контрольной суммы и время действия ссылки.

Используемые в выражении переменные обычно связаны с запросом; см. [пример](#secure-link-md5) ниже.

Выделенное из строки значение контрольной суммы сравнивается со значением MD5-хэша, вычисляемым для выражения, заданного директивой [secure_link_md5](#secure-link-md5).

Если контрольные суммы не совпадают, значением переменной [$secure_link](#v-secure-link) становится пустая строка. Если контрольные суммы совпадают, проверяется время действия ссылки.

Если срок действия ссылки задан и истек, переменная [$secure_link](#v-secure-link) получает значение `0`. В противном случае она получает значение `1`. Значение MD5-хэша передается в запросе закодированным в base64url.

Если ссылка имеет ограниченный срок действия, время ее действия задается в секундах с начала эпохи (1 января 1970 года 00:00:00 GMT). Значение указывается в выражении после MD5-хэша и отделяется от него запятой. Время действия ссылки, переданное в запросе, делается доступным в переменной [$secure_link_expires](#v-secure-link-expires) для использования в директиве [secure_link_md5](#secure-link-md5). Если время действия ссылки не задано, ссылка имеет неограниченный срок действия.

<a id="index-1"></a>

<a id="secure-link-md5"></a>

### secure_link_md5

| [Синтаксис](https://angie.software//angie/docs/configuration/configfile.md#configfile)   | `secure_link_md5` выражение;   |
|------------------------------------------------------------------------------------------|--------------------------------|
| По умолчанию                                                                             | —                              |
| [Контекст](https://angie.software//angie/docs/configuration/configfile.md#configfile)    | http, server, location         |

Задает выражение, для которого считается значение MD5-хэша, сравниваемое с переданным в запросе.

Выражение должно содержать защищаемую часть ссылки (ресурс) и секретную составляющую. Если ссылка имеет ограниченный срок действия, выражение также должно содержать [$secure_link_expires](#v-secure-link-expires).

Для предотвращения несанкционированного доступа выражение может содержать информацию о клиенте, например, его адрес и версию браузера.

Пример:

```nginx
location /s/ {
    secure_link $arg_md5,$arg_expires;
    secure_link_md5 "$secure_link_expires$uri$remote_addr secret";

    if ($secure_link = "") {
        return 403;
    }

    if ($secure_link = "0") {
        return 410;
    }

#    ...
}
```

Ссылка "/s/link?md5=_e4Nc3iduzkWRm01TBBNYw&expires=2147483647" ограничивает доступ к "/s/link" для клиента с IP-адресом 127.0.0.1. Ссылка также имеет ограниченный срок действия до 19 января 2038 года (GMT).

Значение аргумента запроса md5 на UNIX можно получить так:

```console
echo -n '2147483647/s/link127.0.0.1 secret' | \
    openssl md5 -binary | openssl base64 | tr +/ -_ | tr -d =
```

<a id="index-2"></a>

<a id="secure-link-secret"></a>

### secure_link_secret

| [Синтаксис](https://angie.software//angie/docs/configuration/configfile.md#configfile)   | `secure_link_secret` слово;   |
|------------------------------------------------------------------------------------------|-------------------------------|
| По умолчанию                                                                             | —                             |
| [Контекст](https://angie.software//angie/docs/configuration/configfile.md#configfile)    | location                      |

Задает секретное слово для проверки аутентичности запрашиваемых ссылок.

Полный URI запрашиваемой ссылки выглядит так:

```console
/префикс/хэш/ссылка
```

где хэш — MD5-хэш в шестнадцатеричном виде, вычисленный для конкатенации ссылки и секретного слова, а префикс — произвольная строка без косых черт.

Если запрашиваемая ссылка проходит проверку на аутентичность, значением переменной [$secure_link](#v-secure-link) становится ссылка, выделенная из URI запроса. В противном случае значением переменной [$secure_link](#v-secure-link) становится пустая строка.

Пример:

```nginx
location /p/ {
    secure_link_secret secret;

    if ($secure_link = "") {
        return 403;
    }

    rewrite ^ /secure/$secure_link;
}

location /secure/ {
    internal;
}
```

По запросу "/p/5e814704a28d9bc1914ff19fa0c4a00a/link" будет выполнено внутреннее перенаправление на "/secure/link".

Значение хэша для данного примера на UNIX можно получить так:

```console
echo -n 'linksecret' | openssl md5 -hex
```

<a id="built-in-variables-9"></a>

## Встроенные переменные

<a id="v-secure-link"></a>

### `$secure_link`

Результат проверки ссылки. Конкретное значение зависит от выбранного режима работы.

<a id="v-secure-link-expires"></a>

### `$secure_link_expires`

Время действия ссылки, переданное в запросе. Предназначено исключительно для использования в директиве [secure_link_md5](#secure-link-md5).
