Защита вашего экспресс-приложения NodeJs — часть 1

Защита вашего экспресс-приложения NodeJs — часть 1

27 апреля 2022 г.

Express — это быстрый, бескомпромиссный и минималистичный веб-фреймворк для Node.js. Это был фактический выбор для создания приложения веб-сервера в Node.js. Если вы хотите использовать Express в своем приложении, вам необходимо прочитать эту статью.


Давайте посмотрим, как сделать Express более безопасным.


Используйте обновленную экспресс-версию (и любой другой пакет npm)


В старых версиях Express есть такие уязвимости, как Path traversal (CVE-2017–14849). Лучше всего использовать последние стабильные пакеты для устранения таких уязвимостей. Вы можете использовать команду npm audit, чтобы найти известные уязвимости в вашем приложении Nodejs. Затем вы можете исправить их, выполнив команду npm audit fix. Убедитесь, что в отчете команды аудита npm получено 0 уязвимостей.


Защитите свои заголовки HTTP


Правильные заголовки HTTP могут предотвратить уязвимости системы безопасности, такие как межсайтовый скриптинг, кликджекинг, перехват пакетов и раскрытие информации. Лучше не использовать Express с его HTTP-заголовками по умолчанию. Попробуйте Helmet пакет npm для защиты заголовков HTTP вашего проекта Express.


Ниже приведен пример кода.


```javascript


константный экспресс = требуется ("экспресс");


константный шлем = require("шлем");const app = express();app.use(шлем());// ...


Прочтите Полное руководство по HTTP-заголовкам для получения более подробной информации о HTTP. Безопасность заголовков.


Проверить ввод


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


Рассмотрим приведенный ниже код, который получает ваше имя в параметре запроса name и отображает его.


```javascript


константный экспресс = требуется ('экспресс')


const app = express()app.get('/', функция (запрос, ответ) {


response.send('Привет' + request.query.name)


})app.listen(3000)


Если вы отправите запрос типа http://localhost:3000/?name[foo]=bar, вы получите объект вместо имени строки. Это атака, известная как загрязнение параметров HTTP (HPP). Это может быть очень страшно при работе с базой данных без SQL, такой как MongoDB.


Перед обработкой любого параметра запроса проверьте следующее:


  • Тип ввода (строка, число, логическое значение и т. д.)

  • Границы ввода: проверьте диапазон чисел, длину и допустимые символы для строк.

  • Формат ввода: проверьте шаблоны ввода, такие как электронные письма, IP-адреса и т. д.

Вы можете использовать hpp пакет npm для предотвращения HPP-атак.


Проверка ввода — широкая тема. Это может быть очень сложно, особенно при работе с богатым пользовательским контентом. Вы можете прочитать эту статью для подробного обзора.


Очистка вывода


В приведенном ниже примере кода обнаружена уязвимость межсайтового скриптинга (XSS).


```javascript


константный экспресс = требуется ('экспресс')


const app = express()app.get('/', функция (запрос, ответ) {


response.send('Привет' + request.query.name)


})app.listen(3000)


Если вы запустите приложение и откроете URL-адрес http://localhost:2000/?name=<script>alert(1)</script>, будет выполнен код JavaScript alert(1). Ошибка XSS позволяет злоумышленнику запускать любой код на стороне клиента для кражи токенов сеанса, паролей или отображения неверной информации.



Чтобы предотвратить XSS, вы должны использовать правильную кодировку перед отображением входных параметров в ответе. Вы можете использовать node-esapi или escape-html


Ниже приведен код исправления для вышеупомянутого XSS:


```javascript


константный экспресс = требуется ('экспресс')


var ESAPI = требуется ('узел-esapi');


const app = express()app.get('/', функция (запрос, ответ) {


encodedName = ESAPI.encoder().encodeForHTML(request.query.name)


response.send('Привет' + encodedName)


})app.listen(3000)


Использовать анти CSRF


Обработка данных формы и выполнение действий только с использованием данных формы приведет к подделке межсайтовых запросов (CSRF). Если одни и те же данные запроса (либо данные формы, либо URL-запрос) вызывают одно и то же действие в вашем приложении, то у вас проблема с CSRF. Это становится серьезным, когда действие является важным, например, создание нового пользователя или удаление данных.


Злоумышленники используют CSRF для выполнения действий от имени авторизованного пользователя, в то время как пользователь не знает об этом действии. Ниже приведен пример кода, который убивает приложение с помощью CSRF.


```javascript


константный экспресс = требуется ('экспресс')


const app = express()app.get('/', функция (запрос, ответ) {


response.send('

Панель администратора

kill')


})app.get('/kill', функция (запрос, ответ) {


процесс.выход()


})app.listen(2000)


Вы можете задаться вопросом, не может ли добавление управления сеансами на основе файлов cookie предотвратить CSRF, поскольку файлы cookie автоматически отправляются браузерами. Чтобы предотвратить CSRF, вы должны отправлять случайные токены в каждом запросе и проверять существование токена CSRF перед обработкой запроса.


Вы можете использовать пакет csurf npm для интеграции предотвращения CSRF в ваше приложение Express.


В следующей статье мы увидим, как предотвратить атаки методом перебора, выполнение команд и уязвимости раскрытия информации.


Также опубликовано [здесь] (https://www.thesmartscanner.com/blog/how-to-secure-your-nodejs-express-javascript-application-part-1)



Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE