Предотвращение XSS в Node.js / javascript на стороне сервера

Есть идеи, как предотвратить атаки XSS на приложение node.js? Любые библиотеки, которые обрабатывают удаление javascript в hrefs, атрибутах onclick и т. Д. из опубликованных данных?

Я не хочу писать для всего этого регулярное выражение :)

Какие-либо предложения?


person Techwraith    schedule 14.09.2010    source источник


Ответы (9)


Один из ответов на вопрос Очистить / перезаписать HTML на стороне клиента предлагает заимствование средства очистки HTML на основе белого списка в JS от Google Caja, который, насколько я могу судить по быстрой прокрутке, реализует синтаксический анализатор HTML SAX, не полагаясь на DOM браузера.

Обновление. Кроме того, имейте в виду, что дезинфицирующее средство Caja, по-видимому, прошло полную профессиональную проверку безопасности, в то время как регулярные выражения известны тем, что их очень легко вводить опечатками, нарушая безопасность.

Обновление от 24 сентября 2017 г .: теперь есть DOMPurify. Я еще не использовал его, но похоже, что он соответствует или превосходит все пункты, которые я ищу:

  • По возможности полагается на функциональность, предоставляемую средой выполнения. (Важно как для производительности, так и для максимальной безопасности за счет максимально возможного использования хорошо протестированных и зрелых реализаций.)

    • Relies on either a browser's DOM or jsdom for Node.JS.
  • Конфигурация по умолчанию, предназначенная для минимального удаления, при этом гарантируя удаление javascript.

    • Supports HTML, MathML, and SVG
    • Возвращается к проприетарному, не настраиваемому toStaticHTML от Microsoft в IE8 и IE9.
  • Широкие возможности настройки, что делает его подходящим для применения ограничений для ввода, который может содержать произвольный HTML-код, например поле комментария WYSIWYG или Markdown. (Фактически, здесь это верхушка кучи)

    • Supports the usual tag/attribute whitelisting/blacklisting and URL regex whitelisting
    • Имеет специальные параметры для дальнейшей очистки некоторых распространенных типов метасимволов HTML-шаблонов.
  • Они серьезно относятся к совместимости и надежности

    • Automated tests running on 16 different browsers as well as three diffferent major versions of Node.JS.
    • Чтобы гарантировать, что разработчики и хосты CI находятся на одной странице, публикуются файлы блокировки.
person ssokolow    schedule 14.09.2010
comment
Спасибо, у меня это в основном выяснилось с помощью регулярного выражения (yuck), но я хотел бы изучить создание промежуточного программного обеспечения для подключения для очистки всех параметров. - person Techwraith; 16.09.2010

Я создал модуль, который объединяет Caja HTML Sanitizer.

npm install sanitizer

http://github.com/theSmaw/Caja-HTML-Sanitizer

https://www.npmjs.com/package/sanitizer

Любая обратная связь приветствуется.

person theSmaw    schedule 29.10.2010
comment
Использование require('sanitizer').sanitize удаляет все a[href] атрибуты, а не только непослушные. Для нашего случая использования нам нужно, чтобы ссылки по-прежнему принимались (только не непослушные ссылки и другие хулиганы и т. Д.), Какие-нибудь предложения? - person balupton; 09.10.2013

Все обычные методы применимы и к выводу node.js, что означает:

  • Черные списки работать не будут.
  • Вы не должны фильтровать ввод, чтобы защитить вывод HTML. Он не будет работать или будет работать из-за ненужного искажения данных.
  • Вы должны использовать HTML-экранирование текста при выводе HTML.

Я не уверен, что в node.js есть что-то встроенное для этого, но что-то вроде этого должно сработать:

function htmlEscape(text) {
   return text.replace(/&/g, '&').
     replace(/</g, '&lt;').  // it's not neccessary to escape >
     replace(/"/g, '&quot;').
     replace(/'/g, '&#039;');
}
person Kornel    schedule 11.12.2010
comment
Вы не должны фильтровать ввод ... Вы должны использовать HTML-escape ... output: Есть ли у вас какие-либо ссылки на этот предлагаемый передовой метод? - person Daniel Flippance; 28.02.2014
comment
@DanielFlippance эти два пункта являются логическим следствием того, что вы должны экранировать HTML-вывод HTML, и это спецификация HTML. - person Kornel; 28.02.2014
comment
Отказ от фильтрации пользовательского ввода - лучший рискованный метод. Вы открываете дверь для ошибок разработчика, а в большом проекте ошибки разработчика будут повторяться, так что вас будут взламывать снова и снова. Имейте это в виду, если решите пойти этим путем. - person Tomov; 17.12.2020
comment
@LachoTomov Для выявления ошибок разработчиков я предлагаю использовать движки шаблонов с экранированием по умолчанию. У искажения ввода есть два существенных недостатка: потеря данных и ложное чувство безопасности. Например, имена людей могут содержать апострофы. Вы не можете отфильтровать все, что могло быть плохим в любом контексте, но если отфильтровать очевидные вещи, разработчики могут быть менее бдительными в отношении побега, и тесты дыма могут пройти, когда они не должны. - person Kornel; 20.12.2020
comment
@Kornel уверен, что есть способы защититься от этого. Но вы не всегда можете контролировать то, что используют другие разработчики. Например, если вы создаете публичный API. Если он вернет небезопасные данные, то 50 +% сайтов, которые их используют, будут взломаны. И да, вы можете винить в этом других разработчиков, но идея не в этом - сайты все равно взламывают :) Так что правильный подход зависит от конкретного случая использования. - person Tomov; 20.12.2020

Недавно я обнаружил узел-валидатор от chriso.

Пример

get('/', function (req, res) {

  //Sanitize user input
  req.sanitize('textarea').xss(); // No longer supported
  req.sanitize('foo').toBoolean();

});

Функция XSS устарела

Функция XSS больше не доступна в этой библиотеке.

https://github.com/chriso/validator.js#deprecations

person Baggz    schedule 23.12.2010
comment
Месяц назад убрали поддержку xss. - person Brmm; 03.12.2013

Вы также можете посмотреть ESAPI. Существует версия библиотеки для javascript. Он довольно крепкий.

person jeandenis    schedule 15.09.2010

В более новых версиях модуля validator вы можете использовать следующий скрипт для предотвращения XSS-атаки:

  var validator = require('validator');

  var escaped_string = validator.escape(someString);
person Paramore    schedule 31.01.2014
comment
Как указано в nealpoole.com/blog / 2013/07 / --- вы не можете просто использовать escape-фильтр для предотвращения XSS. Более подробная информация представлена ​​в шпаргалке по предотвращению OWASP XSS. Вы все равно должны использовать Google Caja Sanitizer. - person jmnwong; 05.12.2014

Попробуйте модуль npm strip-js. Он выполняет следующие действия:

  • Дезинфицирует HTML
  • Удаляет теги скрипта
  • Удаляет такие атрибуты, как «onclick», «onerror» и т. Д., Которые содержат код JavaScript.
  • Удаляет атрибуты href, содержащие код JavaScript.

https://www.npmjs.com/package/strip-js

person Shivanshu Goyal    schedule 12.10.2016
comment
К сожалению, я обнаружил, что эта библиотека удалила действительную разметку CSS, например !important. - person Joseph Lust; 05.07.2019

Вам стоит попробовать библиотеку npm "insane". https://github.com/bevacqua/insane

Пробую в продакшене, работает хорошо. Размер очень маленький (около 3 КБ в сжатом виде).

  • Очистить HTML
  • Удалите все атрибуты или теги, которые оценивают js
  • Вы можете разрешить атрибуты или теги, которые вы не хотите дезинфицировать

Документацию очень легко читать и понимать. https://github.com/bevacqua/insane

person Renan Bronchart    schedule 31.12.2018

Обновление 2021-04-16: xss - это модуль, используемый для фильтрации ввода от пользователей для предотвращения XSS-атак.

Очистите ненадежный HTML (для предотвращения XSS) с конфигурацией, указанной в белом списке.

Посетите https://www.npmjs.com/package/xss
домашнюю страницу проекта. : http://jsxss.com

person Frank    schedule 16.04.2021