# Безопасность

В этой главе мы рассмотрим различные методы, которые помогут вам повысить безопасность ваших приложений.

### Helmet

[**Helmet**](https://github.com/helmetjs/helmet) может помочь защитить ваше приложение от некоторых известных веб-уязвимостей, установив соответствующие заголовки HTTP. Как правило, **Helmet** - это всего лишь набор из 14 небольших **middleware** функций, которые устанавливают связанные с безопасностью HTTP-заголовки ([**подробнее**](https://github.com/helmetjs/helmet#how-it-works)).

Начните с установки необходимого пакета:

```bash
$ npm i --save helmet
```

После завершения установки примените его в качестве глобального **middleware**.

```typescript
import * as helmet from 'helmet';
// somewhere in your initialization file
app.use(helmet());
```

### CORS

Cross-origin resource sharing (**CORS**) - это механизм, позволяющий запрашивать ресурсы из другого домена. Под капотом **Nest** использует Express пакет [**cors**](https://github.com/expressjs/cors). Этот пакет предоставляет различные опции, которые вы можете настроить в соответствии с вашими требованиями. Чтобы включить **CORS**, вызовите метод `enableCors()` для объекта приложения Nest.

```typescript
const app = await NestFactory.create(AppModule);
app.enableCors();
await app.listen(3000);
```

Метод `enableCors()` принимает необязательный аргумент объекта конфигурации. Доступные свойства этого объекта описаны в официальной документации [**CORS**](https://github.com/expressjs/cors#configuration-options).

Альтернативный способ: включите **CORS** с помощью объекта параметров метода `create()`. Установите для свойства `cors` значение `true`, чтобы включить **CORS** с настройками по умолчанию. Кроме того, передайте [**объект конфигурации CORS**](https://github.com/expressjs/cors#configuration-options) в качестве значения свойства `cors`, чтобы настроить его поведение.

```typescript
const app = await NestFactory.create(AppModule, { cors: true });
await app.listen(3000);
```

### CSRF

Подделка межсайтовых запросов (Cross-site request forgery)(также известная как CSRF или XSRF) - это тип вредоносного эксплойта веб-сайта, при котором несанкционированные команды передаются от пользователя, которому веб-приложение доверяет. Чтобы смягчить этот вид атаки, вы можете использовать пакет `csurf`.

Начните с установки необходимого пакета:

```bash
$ npm i --save csurf
```

{% hint style="info" %}
Как объяснено на [**странице csurf middleware**](https://github.com/expressjs/csurf#csurf), модуль **csurf** требует, чтобы сначала было инициализировано либо middleware сессий, либо парсер cookie. Пожалуйста, ознакомьтесь с этой документацией для получения дальнейших инструкций.
{% endhint %}

После завершения установки примените csurf middleware в качестве глобального middleware.

```typescript
import * as csurf from 'csurf';
// somewhere in your initialization file
app.use(csurf());

```

### Ограничение частот

Распространенным методом защиты приложений от атак грубой силы является **rate-limiting**. Многие пакеты Express существуют для обеспечения функции ограничения скорости. Одним из популярных является [**express-rate-limit**](https://github.com/nfriedly/express-rate-limit).

Начните с установки необходимого пакета:

```bash
$ npm i --save express-rate-limit
```

После завершения установки примените **rate-limiter** в качестве **global middleware**.

```typescript
import * as rateLimit from 'express-rate-limit';
// somewhere in your initialization file
app.use(
  rateLimit({
    windowMs: 15 * 60 * 1000, // 15 minutes
    max: 100, // limit each IP to 100 requests per windowMs
  }),
);
```

При наличии балансировщика нагрузки или обратного прокси-сервера между сервером и интернетом Express может потребоваться настроить доверие к заголовкам, установленным прокси-сервером, чтобы получить правильный IP-адрес для конечного пользователя. Для этого сначала используйте [**интерфейс**](https://docs.nestjs.com/first-steps#platform) платформы `NestExpressApplication` при создании экземпляра `app`, а затем включите параметр [**доверенный**](https://expressjs.com/en/guide/behind-proxies.html) прокси-сервер:

```typescript
const app = await NestFactory.create<NestExpressApplication>(AppModule);
// see https://expressjs.com/en/guide/behind-proxies.html
app.set('trust proxy', 1)
```

{% hint style="info" %}
Если вы используете `FastifyAdapter`, рассмотрите возможность использования `fastify-rate-limit` вместо этого.
{% endhint %}
