Обновление 2016: существует теперь пакет Google Closure на основе дезинфицирующего средства Caja.
Это имеет более чистый API, было переписано для принятия во внимание API, доступных на современных браузерах, и взаимодействует лучше с Компилятором Закрытия.
<час>Бесстыдный разъем: см. caja/plugin/html-sanitizer.js для клиентского дезинфицирующего средства HTML, которое было полностью рассмотрено.
Это добавлено в белый список, не помещено в черный список, но белые списки настраиваются согласно <час> CajaWhitelists
, Если Вы хотите удалить все теги, затем сделайте следующее:
var tagBody = '(?:[^"\'>]|"[^"]*"|\'[^\']*\')*';
var tagOrComment = new RegExp(
'<(?:'
// Comment body.
+ '!--(?:(?:-*[^->])*--+|-?)'
// Special "raw text" elements whose content should be elided.
+ '|script\\b' + tagBody + '>[\\s\\S]*?</script\\s*'
+ '|style\\b' + tagBody + '>[\\s\\S]*?</style\\s*'
// Regular name
+ '|/?[a-z]'
+ tagBody
+ ')>',
'gi');
function removeTags(html) {
var oldHtml;
do {
oldHtml = html;
html = html.replace(tagOrComment, '');
} while (html !== oldHtml);
return html.replace(/</g, '<');
}
Люди скажут Вам, что можно создать элемент, и присвоиться innerHTML
и затем добраться innerText
или textContent
, и затем выйти из объектов в этом. Не делайте этого. Это уязвимо для инжекции XSS, так как <img src=bogus onerror=alert(1337)>
будет работать onerror
обработчик, даже если узел никогда не будет присоединен к DOM.
Никогда не доверяйте клиенту. Если Вы пишете серверное приложение, предполагаете, что клиент будет всегда отправлять антисанитарные, злонамеренные данные. Это - эмпирическое правило, которое не допустит Вас в проблему. Если бы Вы можете, я советовать делать всю проверку и санитарию в серверном коде, который Вы знаете (до разумного градуса), не будет играться с. Возможно, Вы могли использовать веб-приложение серверной стороны в качестве прокси для Вашего клиентского кода, который выбирает от третьей стороны и делает санитарию прежде, чем отправить его клиенту сам?
[редактирование] я сожалею, я неправильно понял вопрос. Однако я поддерживаю свой совет. Ваши пользователи, вероятно, будут более в безопасности, если Вы санируете на сервере прежде, чем отправить его им.
Вы не можете ожидать каждый возможный странный тип уродливой разметки, за которую некоторый браузер где-нибудь мог бы споткнуться для выхода из помещения в черный список, не, помещают в черный список - также. Существуют многие [еще 110] структуры, которые Вы, возможно, должны были бы удалить, чем, просто пишут сценарий/встраивают/возражают и обработчики.
Вместо этого попытка проанализировать HTML в элементы и атрибуты в иерархии, затем выполните весь элемент и названия атрибута против белого списка as-minimal-as-possible. Также проверьте, что любой URL приписывает Вас пропущенный против белого списка (помните, что существуют более опасные протоколы, чем просто JavaScript:).
, Если вход является правильно построенным XHTML, первая часть вышеупомянутого намного легче.
Как всегда с санитизацией HTML, если можно найти какой-либо другой способ постараться не делать его, сделайте это вместо этого. Существуют многие, много потенциальных ям. Если основные сервисы веб-почты все еще находят использование после этого много лет, что заставляет Вас думать, что можно добиться большего успеха?