Библиотека JavaScript или Esapi, предотвращающая XSS — экранирование и кодирование ненадежных данных

Я работаю над некоторыми одностраничными приложениями, написанными на JavaScript, которые в настоящее время используют lodash. Я хотел бы предотвратить межсайтовый скриптинг (XSS) с использованием стандартной библиотеки следующим образом:

1) Избегание всего ненадежного контента

2) Кодирование вывода в зависимости от его назначения CSS, HTML, HTMLAttribute JavaScript, JSON и т. д.

Я видел несколько ответов на переполнение стека, но они не предоставляют полного решения для канонизации/кодирования в стандартной библиотеке, которую я могу написать статический тест, чтобы убедиться, что разработчики используют библиотеку.

Есть ли esapi или аналогичная «легкая» библиотека, которую я могу использовать только для JavaScript?

Я видел OWASP Esapi и подключаемый модуль jQuery Encoder https://github.com/chrisisbeef/jquery-encoder и кодировщик SalesForce https://github.com/salesforce/secure-filters

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

Может ли кто-нибудь предложить лучший подход к использованию?


person MikeyB_Leeds    schedule 02.01.2017    source источник


Ответы (2)


Используются ли какие-либо фреймворки шаблонов? В идеале вы должны использовать фреймворк, такой как React, который обрабатывает кодировку по умолчанию. Тогда все, что вам нужно сделать, это убедиться, что dagerousSetInnerHTML не используется (или используется безопасно).

Добавление ненадежного CSS считается небезопасным, если только не проверен белый список. Добавление ненадежных данных в теги можно безопасно выполнить, назначив данные элементу element.textContent или используя jQuery $.text(). Добавление ненадежных данных к атрибутам HTML, которые не являются обработчиками событий, можно выполнить с помощью element.setAttribute или $.attr(). Для двойных контекстов, таких как внутренние теги скрипта (контекст javascript внутри контекста html) или атрибуты обработчика событий javascript (контекст javascript внутри контекста атрибута html), вам нужно убедиться, что вы кодируете для обоих.

Для содержимого HTML вы можете дополнительно использовать DOMPurify для удаления любого активного содержимого, но это более справедливо, если вам нужно разрешить ненадежные фрагменты HTML.

person Erlend    schedule 03.01.2017
comment
Спасибо за ответ. Фреймворки? да. Мы находимся в положении, когда у нас есть номер как унаследованный, так и у разных третьих сторон. Не все проекты используют jQuery. Одна из причин, по которой я искал автономную библиотеку. Спасибо за DOMPurify — я изучу это дальше. Есть ли у вас какие-либо мысли о том, как я могу использовать статический анализ, чтобы попытаться убедиться, что разработчики поступают правильно? - person MikeyB_Leeds; 04.01.2017
comment
Для JavaScript просто закодируйте в формате \xNN все небуквенно-цифровые символы. Таким образом, вам не нужно дважды кодировать, так как вы не получите ничего, что также требует кодирования HTML. Будьте осторожны с любыми параметрами URL, так как в них может оказаться javascript: URL-адресов, добавьте в белый список http:// и https://, если вам нужно вставить сюда динамическое содержимое. - person SilverlightFox; 05.01.2017

Я видел несколько ответов на переполнение стека, но они не предоставляют полного решения для канонизации/кодирования в стандартной библиотеке, которую я могу написать статический тест, чтобы убедиться, что разработчики используют библиотеку.

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

Есть ли у вас какие-либо мысли о том, как я могу использовать «Статический анализ», чтобы попытаться убедиться, что разработчики поступают правильно?

Veracode, HP Fortify — два примера COTS. Я знаю, что они могут проверять несколько разных кодовых баз. Но они требуют внедрения их в цикл разработки, чтобы они были эффективными... в идеале как часть конвейера сборки.

person avgvstvs    schedule 06.01.2017