Перейти к содержанию

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

Защите разрабатываемых приложений стоит уделить особое внимание. Обеспечение должной безопасности гарантирует непрерывную стабильную работу сервера и сохранность личных данных пользователей.

Для защиты самого соединения и передаваемых по сети данных настоятельно рекомендуется использовать один из протоколов криптографии: SSL или TLS.

Одним из способов защиты Node.js приложений от самых популярных уязвимостей в интернете является использование модуля helmet, который можно установить из репозитория npm.

npm install helmet --save

Модуль helmet представляет собой набор функций промежуточной обработки (middleware), устанавливающие определенные HTTP-заголовки для обеспечения безопасности.

Для использования helmet с настройками по умолчанию просто добавьте следующий middleware.

const helmet = require('helmet'),
  express = require('express'),
  app = express()

app.use(helmet())

Список функций промежуточной обработки, входящих в модуль helmet:

csp - предотвращение межсайтовых вмешательств через задание заголовка Content-Security-Policy, с полным списком задаваемых параметров можно ознакомиться здесь;

app.use(
  helmet.csp({
    directives: {
      objectSrc: ['none'],
      workerSrc: false //значение не задается
    }
  })
)

dnsPrefetchedControl - управляет загрузкой DNS через задание заголовка X-DNS-Prefetch-Control;

app.use(helmet.dnsPrefetchControl({ allow: true })) //задание заголовка

app.use(helmet.dnsPrefetchControl({ allow: false })) //удаление заголовка
app.use(helmet.dnsPrefetchControl()) //удаление заголовка

expectCt - устанавливает заголовок Expect-CT;

app.use(
  helmet.expectCt({
    enforce: true,
    maxAge: 90, //задается в днях
    reportUri: 'http://example.com/report'
  })
)

featurePolicy - позволяет ограничить использование некоторых функций браузера (например, использование камеры или геолокации) заданием заголовка Feature-Policy, с полным списком функций можно ознакомиться здесь;

app.use(
  helmet.featurePolicy({
    features: {
      camera: ['none'], //запрет использования web-камеры
      fullscreen: ['none'], //запрет использования Fullscreen API
      geolocation: ['none'] //запрет использования геолокации
    }
  })
)

hidePoweredBy - удаляет или заменяет значение заголовка X-Powered-By, устанавливается отдельно (в случае использования express не нужен);

app.use(helmet.hidePoweredBy()) //отключение заголовка
app.use(helmet.hidePoweredBy({ setTo: 'PHP X.X.X' })) //установка для заголовка определенного значения

app.disable('x-powered-by') //отключение через express

hsts - управляет заголовком Strict-Transport-Security;

app.use(
  helmet.hsts({
    maxAge: 31536000, //задается в секундах
    includeSubdomains: true,
    preload: true
  })
)

ieNoOpen - устанавливает заголовок X-Download-Options для предотвращения открытия скачанных файлов в контексте вашего сайта;

app.use(helmet.ieNoOpen())

noCache - отключает кэширование на стороне клиента через задание заголовков Cache-Control, Pragma, Surrogate-Control и Expires;

app.use(helmet.noCache())

noSniff - задает заголовок X-Content-Type-Options и тем самым предотвращает прослушивание MIME ответов с не соответствующим заявленному в Content-Type типу данных;

app.use(helmet.noSniff())

frameguard - предотвращает атаку clickjacking заданием заголовка X-Frame-Options;

app.use(
  helmet.frameguard({
    action: 'deny',
    domain: 'http://example.com'
  })
)

permittedCrossDomainPolicies - задает заголовок X-Permitted-Cross-Domain-Policies для предотвращения загрузки на сайте контента Adobe Flash и Adobe Acrobat;

app.use(helmet.permittedCrossDomainPolicies()) //по умолчанию none
app.use(helmet.permittedCrossDomainPolicies({ permittedPolicies: 'all' }))

referrerPolicy - управляет заголовком Referrer задавая заголовок Referrer-Policy;

app.use(helmet.referrerPolicy({ policy: 'no-referrer' }))
app.use(helmet.referrerPolicy({ policy: ['no-referrer', 'unsafe-url'] }))

xssFilter - устанавливает заголовок X-XSS-Protection, активируя тем самым фильтр межсайтового скриптинга.

app.use(
  helmet.xssFilter({
    setOnOldIE: true,
    reportUri: 'http://example.com/report'
  })
)

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

app.use(
  helmet({
    ieNoOpen: false,
    hidePoweredBy: false
  })
)

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

app.use(
  helmet({
    xssFilter: {
      setOnOldIE: true
    },
    hidePoweredBy: {
      setTo: 'PHP X.X.X'
    }
  })
)

Каждая из перечисленных функций промежуточной обработки может быть установлена отдельно. Например, это будет полезным, если вам не требуется функционал всего Node.js модуля helmet.

npm install frameguard --save

Пример использования.

const frameguard = require('frameguard')

app.use(frameguard())