Прежде чем все будут говорить мне, что я не должен выполнять очистку на стороне клиента (на самом деле я собираюсь сделать это на клиенте, хотя это может работать и в 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 для более легкого обхода, а затем беспокоиться об отфильтровывании нежелательных элементов, атрибутов и значений атрибутов.
Спасибо!