HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-03-10
1 <p>При наличии проблем с безопасностью может произойти утечка пользовательских данных, что приведёт к соответствующим репутационным и финансовым потерям. В этой статье мы поговорим о правилах безопасного кода в контексте Node.js-разработки.</p>
1 <p>При наличии проблем с безопасностью может произойти утечка пользовательских данных, что приведёт к соответствующим репутационным и финансовым потерям. В этой статье мы поговорим о правилах безопасного кода в контексте Node.js-разработки.</p>
2 <h2>Правило № 1: не используйте eval</h2>
2 <h2>Правило № 1: не используйте eval</h2>
3 <p>Известная функция eval() может сделать приложение уязвимым для инъекций произвольного кода. Именно поэтому рекомендуется её не использовать. Если же без этого не обойтись, никогда не стоит передавать чистый пользовательский ввод в eval().</p>
3 <p>Известная функция eval() может сделать приложение уязвимым для инъекций произвольного кода. Именно поэтому рекомендуется её не использовать. Если же без этого не обойтись, никогда не стоит передавать чистый пользовательский ввод в eval().</p>
4 <h2>Правило № 2: пользуйтесь режимом "use strict"</h2>
4 <h2>Правило № 2: пользуйтесь режимом "use strict"</h2>
5 <p>С режимом use strict вы можете использовать строгий "вариант" JS, что позволяет находить ряд скрытых ошибок и отображать их.</p>
5 <p>С режимом use strict вы можете использовать строгий "вариант" JS, что позволяет находить ряд скрытых ошибок и отображать их.</p>
6 'use strict' delete Object.prototype // ошибка ввода var obj = { a: 1, a: 2 } // ошибка синтаксиса<h2>Правило № 3: обрабатывать ошибки надо аккуратно</h2>
6 'use strict' delete Object.prototype // ошибка ввода var obj = { a: 1, a: 2 } // ошибка синтаксиса<h2>Правило № 3: обрабатывать ошибки надо аккуратно</h2>
7 <p>При обработке исключений возможны утечки важной информации из вашего приложения. Речь идёт, например, об информации о внутренней структуре, допустим, X-Powered-By:Express.</p>
7 <p>При обработке исключений возможны утечки важной информации из вашего приложения. Речь идёт, например, об информации о внутренней структуре, допустим, X-Powered-By:Express.</p>
8 <p>Да, сами по себе данные трассировки уязвимостью не являются, но часто они могут раскрывать другую информацию, которая интересует хакеров. Таким образом, предоставление отладочной информации в качестве результата, генерируемого в случае ошибки - плохая практика. Поэтому всегда записывайте информацию в логи и скрывайте от пользователя.</p>
8 <p>Да, сами по себе данные трассировки уязвимостью не являются, но часто они могут раскрывать другую информацию, которая интересует хакеров. Таким образом, предоставление отладочной информации в качестве результата, генерируемого в случае ошибки - плохая практика. Поэтому всегда записывайте информацию в логи и скрывайте от пользователя.</p>
9 <h2>Правило № 4: не забывайте про статический анализ кода</h2>
9 <h2>Правило № 4: не забывайте про статический анализ кода</h2>
10 <p>Статический анализ кода приложения поможет вам обнаружить много ошибок. Используйте для этого ESLint совместно со Standard code style.</p>
10 <p>Статический анализ кода приложения поможет вам обнаружить много ошибок. Используйте для этого ESLint совместно со Standard code style.</p>
11 <h2>Правило № 5: не запускайте процессы с root-правами</h2>
11 <h2>Правило № 5: не запускайте процессы с root-правами</h2>
12 <p>Увы, но очень часто разработчики запускают приложения с рут-правами (например, когда хотят использовать порты 443 и 80). И это тоже плохая практика. Если возникнет ошибка, процесс может "положить" всю систему, ведь открыт доступ ко всем возможностям.</p>
12 <p>Увы, но очень часто разработчики запускают приложения с рут-правами (например, когда хотят использовать порты 443 и 80). И это тоже плохая практика. Если возникнет ошибка, процесс может "положить" всю систему, ведь открыт доступ ко всем возможностям.</p>
13 <p>Чтобы так не делать, настройте для перенаправления запроса HTTP-сервер либо прокси. Пусть это будет nginx либо Apache. Дополнительная информация есть в<a>этой статье</a>.</p>
13 <p>Чтобы так не делать, настройте для перенаправления запроса HTTP-сервер либо прокси. Пусть это будет nginx либо Apache. Дополнительная информация есть в<a>этой статье</a>.</p>
14 <h2>Правило № 6: настраиваем обязательные HTTP-заголовки</h2>
14 <h2>Правило № 6: настраиваем обязательные HTTP-заголовки</h2>
15 <p>Есть ряд HTTP-заголовков, которые относятся к безопасности. И их надо установить: •<strong>Strict-Transport-Security</strong>- делает обязательным безопасные соединения с сервером (HTTP через SSL/TLS); •<strong>X-Frame-Options</strong>- для защиты от кликджекинга; •<strong>X-XSS-Protection</strong>- содержит фильтр межсайтового скриптинга (XSS), который встроен в большинство веб-браузеров; •<strong>X-Content-Type-Options</strong>- для предотвращения MIME-сниффинга ответа без декларированного Content-Type; •<strong>Content-Security-Policy</strong>- для защиты от широкого спектра атак, в том числе XSS и прочих межсайтовых инъекций.</p>
15 <p>Есть ряд HTTP-заголовков, которые относятся к безопасности. И их надо установить: •<strong>Strict-Transport-Security</strong>- делает обязательным безопасные соединения с сервером (HTTP через SSL/TLS); •<strong>X-Frame-Options</strong>- для защиты от кликджекинга; •<strong>X-XSS-Protection</strong>- содержит фильтр межсайтового скриптинга (XSS), который встроен в большинство веб-браузеров; •<strong>X-Content-Type-Options</strong>- для предотвращения MIME-сниффинга ответа без декларированного Content-Type; •<strong>Content-Security-Policy</strong>- для защиты от широкого спектра атак, в том числе XSS и прочих межсайтовых инъекций.</p>
16 <p>Сделать всё это в Node.js просто - достаточно задействовать модуль<strong>Helmet</strong>:</p>
16 <p>Сделать всё это в Node.js просто - достаточно задействовать модуль<strong>Helmet</strong>:</p>
17 var express = require('express') var helmet = require('helmet') var app = express() app.use(helmet())<h2>Правило № 7: управляйте сессиями корректно</h2>
17 var express = require('express') var helmet = require('helmet') var app = express() app.use(helmet())<h2>Правило № 7: управляйте сессиями корректно</h2>
18 <p>Флаги, приведённые ниже, следует установить для всех куки: •<strong>secure</strong>- браузер получает сообщение, что надо отправлять куки лишь в том случае, если запрос отправляется посредством HTTPS; •<strong>HttpOnly</strong>- помогает предотвращать атаки типа XSS за счё того, что не даёт доступ к куки через JS.</p>
18 <p>Флаги, приведённые ниже, следует установить для всех куки: •<strong>secure</strong>- браузер получает сообщение, что надо отправлять куки лишь в том случае, если запрос отправляется посредством HTTPS; •<strong>HttpOnly</strong>- помогает предотвращать атаки типа XSS за счё того, что не даёт доступ к куки через JS.</p>
19 <h2>Правило № 8: настраиваем ограничения для куки</h2>
19 <h2>Правило № 8: настраиваем ограничения для куки</h2>
20 <p>Если работаете с куки, используйте также и следующие флаги: •<strong>domain</strong>- для сравнения домена, который записан в куки, с домена в URL. Если домен совпадает либо это субдомен, проверяется атрибут path; •<strong>path</strong>- с помощью этого атрибута в дополнение к domain для куки можно задать URL. Если path и domain совпадают, куки можно считать валидными, поэтому они отправляются в запросе; •<strong>expires</strong>- чтобы установить срок действия куки.</p>
20 <p>Если работаете с куки, используйте также и следующие флаги: •<strong>domain</strong>- для сравнения домена, который записан в куки, с домена в URL. Если домен совпадает либо это субдомен, проверяется атрибут path; •<strong>path</strong>- с помощью этого атрибута в дополнение к domain для куки можно задать URL. Если path и domain совпадают, куки можно считать валидными, поэтому они отправляются в запросе; •<strong>expires</strong>- чтобы установить срок действия куки.</p>
21 <p>Кстати, с помощью пакета<a>cookies</a>вы можете без проблем создавать куки в Node.js. Однако эта фича довольно низкоуровневая, поэтому можно просто воспользоваться оболочкой типа<a>cookie-session</a>.</p>
21 <p>Кстати, с помощью пакета<a>cookies</a>вы можете без проблем создавать куки в Node.js. Однако эта фича довольно низкоуровневая, поэтому можно просто воспользоваться оболочкой типа<a>cookie-session</a>.</p>
22 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)<h2>Правило № 9: ищем уязвимости с Retire.js</h2>
22 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)<h2>Правило № 9: ищем уязвимости с Retire.js</h2>
23 <p>Существует инструмент Retire.js, основная цель которого - оказать помощь в обнаружении уязвимых версии модулей. Устанавливается он предельно просто:</p>
23 <p>Существует инструмент Retire.js, основная цель которого - оказать помощь в обнаружении уязвимых версии модулей. Устанавливается он предельно просто:</p>
24 <p>Далее применение команды retire позволит вам обнаружить уязвимости в директории node_modules.</p>
24 <p>Далее применение команды retire позволит вам обнаружить уязвимости в директории node_modules.</p>
25 <h2>Правило № 10: аудит модулей с Node Security Platform CLI</h2>
25 <h2>Правило № 10: аудит модулей с Node Security Platform CLI</h2>
26 <p>Используя этот инструмент, вы получаете возможность выполнять аудит package.json либо npm-shrinkwrap.json, выполняя сравнение со списком уязвимых модулей NSP API.</p>
26 <p>Используя этот инструмент, вы получаете возможность выполнять аудит package.json либо npm-shrinkwrap.json, выполняя сравнение со списком уязвимых модулей NSP API.</p>
27 npm install nsp --global # Из директории вашего проекта nsp check<p><em>Источник - "<a>Node Hero - Node.js Security Tutorial</a>".</em></p>
27 npm install nsp --global # Из директории вашего проекта nsp check<p><em>Источник - "<a>Node Hero - Node.js Security Tutorial</a>".</em></p>
28  
28