Node.js: руководство по безопасности | OTUS

Node.js: руководство по безопасности

При наличии проблем с безопасностью может произойти утечка пользовательских данных, что приведёт к соответствующим репутационным и финансовым потерям. В этой статье мы поговорим о правилах безопасного кода в контексте Node.js-разработки.

Правило № 1: не используйте eval

Известная функция eval() может сделать приложение уязвимым для инъекций произвольного кода. Именно поэтому рекомендуется её не использовать. Если же без этого не обойтись, никогда не стоит передавать чистый пользовательский ввод в eval().

Правило № 2: пользуйтесь режимом «use strict»

С режимом use strict вы можете использовать строгий «вариант» JS, что позволяет находить ряд скрытых ошибок и отображать их.

'use strict'  
delete Object.prototype 
// ошибка ввода
var obj = {  
    a: 1, 
    a: 2 
} 
// ошибка синтаксиса

Правило № 3: обрабатывать ошибки надо аккуратно

При обработке исключений возможны утечки важной информации из вашего приложения. Речь идёт, например, об информации о внутренней структуре, допустим, X-Powered-By:Express.

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

Правило № 4: не забывайте про статический анализ кода

Статический анализ кода приложения поможет вам обнаружить много ошибок. Используйте для этого ESLint совместно со Standard code style.

Правило № 5: не запускайте процессы с root-правами

Увы, но очень часто разработчики запускают приложения с рут-правами (например, когда хотят использовать порты 443 и 80). И это тоже плохая практика. Если возникнет ошибка, процесс может «положить» всю систему, ведь открыт доступ ко всем возможностям.

Чтобы так не делать, настройте для перенаправления запроса HTTP-сервер либо прокси. Пусть это будет nginx либо Apache. Дополнительная информация есть в этой статье.

Правило № 6: настраиваем обязательные HTTP-заголовки

Есть ряд HTTP-заголовков, которые относятся к безопасности. И их надо установить: • Strict-Transport-Security — делает обязательным безопасные соединения с сервером (HTTP через SSL/TLS); • X-Frame-Options — для защиты от кликджекинга; • X-XSS-Protection — содержит фильтр межсайтового скриптинга (XSS), который встроен в большинство веб-браузеров; • X-Content-Type-Options — для предотвращения MIME-сниффинга ответа без декларированного Content-Type; • Content-Security-Policy — для защиты от широкого спектра атак, в том числе XSS и прочих межсайтовых инъекций.

Сделать всё это в Node.js просто — достаточно задействовать модуль Helmet:

var express = require('express')
var helmet = require('helmet')

var app = express()

app.use(helmet())

Правило № 7: управляйте сессиями корректно

Флаги, приведённые ниже, следует установить для всех куки: • secure — браузер получает сообщение, что надо отправлять куки лишь в том случае, если запрос отправляется посредством HTTPS; • HttpOnly — помогает предотвращать атаки типа XSS за счё того, что не даёт доступ к куки через JS.

Правило № 8: настраиваем ограничения для куки

Если работаете с куки, используйте также и следующие флаги: • domain — для сравнения домена, который записан в куки, с домена в URL. Если домен совпадает либо это субдомен, проверяется атрибут path; • path — с помощью этого атрибута в дополнение к domain для куки можно задать URL. Если path и domain совпадают, куки можно считать валидными, поэтому они отправляются в запросе; • expires — чтобы установить срок действия куки.

Кстати, с помощью пакета cookies вы можете без проблем создавать куки в Node.js. Однако эта фича довольно низкоуровневая, поэтому можно просто воспользоваться оболочкой типа cookie-session.

var cookieSession = require('cookie-session')
var express = require('express')

var app = express()

app.use(cookieSession({
  name: 'session',
  keys: [
    process.env.COOKIE_KEY1,
    process.env.COOKIE_KEY2
  ]
}))

app.use(function (req, res, next) {
  var n = req.session.views || 0
  req.session.views = n++
  res.end(n + ' views')
})

app.listen(3000)

Правило № 9: ищем уязвимости с Retire.js

Существует инструмент Retire.js, основная цель которого — оказать помощь в обнаружении уязвимых версии модулей. Устанавливается он предельно просто:

npm install -g retire

Далее применение команды retire позволит вам обнаружить уязвимости в директории node_modules.

Правило № 10: аудит модулей с Node Security Platform CLI

Используя этот инструмент, вы получаете возможность выполнять аудит package.json либо npm-shrinkwrap.json, выполняя сравнение со списком уязвимых модулей NSP API.

npm install nsp --global
# Из директории вашего проекта
nsp check

Источник — «Node Hero - Node.js Security Tutorial».

Не пропустите новые полезные статьи!

Спасибо за подписку!

Мы отправили вам письмо для подтверждения вашего email.
С уважением, OTUS!

Автор
0 комментариев
Для комментирования необходимо авторизоваться
Популярное
Сегодня тут пусто