Node.js: руководство по безопасности
При наличии проблем с безопасностью может произойти утечка пользовательских данных, что приведёт к соответствующим репутационным и финансовым потерям. В этой статье мы поговорим о правилах безопасного кода в контексте Node.js-разработки.
Правило № 1: не используйте 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».