Санируйте/Перепишите HTML на Стороне клиента

72
задан Erik Aigner 31 January 2014 в 13:15
поделиться

3 ответа

Обновление 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, '&lt;');
}

Люди скажут Вам, что можно создать элемент, и присвоиться innerHTML и затем добраться innerText или textContent, и затем выйти из объектов в этом. Не делайте этого. Это уязвимо для инжекции XSS, так как <img src=bogus onerror=alert(1337)> будет работать onerror обработчик, даже если узел никогда не будет присоединен к DOM.

105
ответ дан Mike Samuel 24 November 2019 в 12:30
поделиться

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

[редактирование] я сожалею, я неправильно понял вопрос. Однако я поддерживаю свой совет. Ваши пользователи, вероятно, будут более в безопасности, если Вы санируете на сервере прежде, чем отправить его им.

17
ответ дан Sean Edwards 24 November 2019 в 12:30
поделиться

Вы не можете ожидать каждый возможный странный тип уродливой разметки, за которую некоторый браузер где-нибудь мог бы споткнуться для выхода из помещения в черный список, не, помещают в черный список - также. Существуют многие [еще 110] структуры, которые Вы, возможно, должны были бы удалить, чем, просто пишут сценарий/встраивают/возражают и обработчики.

Вместо этого попытка проанализировать HTML в элементы и атрибуты в иерархии, затем выполните весь элемент и названия атрибута против белого списка as-minimal-as-possible. Также проверьте, что любой URL приписывает Вас пропущенный против белого списка (помните, что существуют более опасные протоколы, чем просто JavaScript:).

, Если вход является правильно построенным XHTML, первая часть вышеупомянутого намного легче.

Как всегда с санитизацией HTML, если можно найти какой-либо другой способ постараться не делать его, сделайте это вместо этого. Существуют многие, много потенциальных ям. Если основные сервисы веб-почты все еще находят использование после этого много лет, что заставляет Вас думать, что можно добиться большего успеха?

12
ответ дан bobince 24 November 2019 в 12:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: