Прежде чем все скажут мне, что я не должен проводить дезинфекцию на стороне клиента (на самом деле я намереваюсь сделать это на клиенте, хотя это может работать и в SSJS), позвольте мне уточнить, что я пытаюсь сделать.
Мне бы хотелось что-то похожее на Google Caja или HTMLPurifier , но для JavaScript: подход безопасности на основе белого списка, который обрабатывает HTML и CSS (еще не вставлен)конечно, в DOM, что было бы небезопасно, но сначала получалось в виде строки), а затем выборочно отфильтровывал небезопасные теги или атрибуты, игнорируя их или, необязательно, включая их в качестве экранированного текста или иным образом позволяя сообщать о них приложению для дальнейшегообработка, в идеале в контексте.Было бы здорово, если бы он мог уменьшить любой JavaScript до безопасного подмножества, как в Google Caja, но я знаю, что это потребовало бы много.
Мой пример использования - доступ к ненадежным данным XML / XHTML, полученным через JSONP (данные из вики Mediawiki перед обработкой вики, что позволяет вводить необработанный, но ненадежный ввод XML / HTML) и позволяет пользователю выполнять запросы и преобразования этих данных (XQuery, jQuery, XSLT и т. Д.),использование HTML5 для разрешения автономного использования, хранения IndexedDB и т. д., что позволяет затем просматривать результаты на той же странице, где пользователь просматривал источник ввода и создавал или импортировал свои запросы.
Пользователь может производить любой вывод, который он хочет, поэтому я не буду дезинфицировать то, что он делает - если он хочет внедрить JavaScript в страницу, вся мощь для него.Но я хочу защитить пользователей, которые хотят быть уверенными в том, что они могут добавлять код, который безопасно копирует целевые элементы из ненадежного ввода, не позволяя им копировать небезопасный ввод.
Это определенно должно быть выполнимо, но ямне интересно, есть ли какие-нибудь библиотеки, которые уже делают это.
И если я застрял, реализуя это самостоятельно (хотя мне любопытно, в любом случае), я хотел бы иметь доказательства того, используется ли innerHTML
или создание / добавление DOM ПЕРЕД вставкой в документ безопасны во всех отношениях.Например, могут ли события запускаться случайно, если я впервые запустил DOMParser
или использовал анализ HTML-кода в браузере, используя innerHTML
для добавления необработанного HTML-кода к не вставленному div?Я полагаю, что это должно быть безопасно, но не уверен, что события манипуляции DOM могли произойти как-то до вставки, которая могла бы быть использована.
Конечно, построенный DOM должен быть очищен после этого момента, но я просто хочуубедитесь, что я могу безопасно построить сам объект DOM для облегчения обхода, а затем беспокоиться о фильтрации нежелательных элементов, атрибутов и значений атрибутов.
Спасибо!