Гарантируется ли, что текстовый узел DOM не интерпретируется как HTML? - PullRequest
10 голосов
/ 25 января 2009

Кто-нибудь знает, гарантированно ли DOM Node типа Text не интерпретируется браузером как HTML?

Подробнее см.

Фон

Я создаю простую систему веб-комментариев для друга и думаю о XSS-атаках. Я не думаю, что фильтрация или экранирование тегов HTML - это очень элегантное решение - слишком легко придумать свертку, которая ускользнет от фильтра. Фундаментальная проблема заключается в том, что я хочу гарантировать, что для определенных фрагментов контента (т. Е. Контента, который POST случайные неаутентифицированные веб-пользователи) браузер никогда не пытается интерпретировать или запускать контент.

Простое (текстовое) начало

Первая мысль, которая пришла в голову, это просто использовать Content-Type: text/plain, но это относится ко всей странице. Вы можете поместить простой текст IFRAME в середину страницы, но это уродливо и создает проблемы с фокусировкой, если пользователь нажимает на фрейм.

InnerText / TextContent / JQuery

Оказывается, есть некоторые специфичные для браузера атрибуты (innerText в IE, textContent в FF, Safari и т. Д.), Которые при установке необходимы для создания одного узла Text.

JQuery пытается избежать различий в специфичных для браузера атрибутах, реализуя единственную функцию text(val), которая пропускает специфичные для браузера атрибуты и переходит непосредственно к document.createTextNode(text), который, как вы можете догадаться, создает Text узел.

W3 DOM Text Node с

Так что я думаю, что это близко к тому, что я хочу, это выглядит хорошо - Text узлы не могут иметь детей, и кажется, что они не могут быть интерпретированы как HTML. Но я не уверен на 100% из официальных документов.

Часть из textContent особенно обнадеживает, потому что она говорит: «при настройке синтаксический анализ также не выполняется, входная строка воспринимается как чисто текстовое содержимое». Но является ли это основополагающим для всех Text узлов или только для узлов, для которых вы установили textContent? Это, вероятно, похоже на глупое утверждение, но это может быть важно, потому что IE не поддерживает textContent (см. Выше).

Вернемся к первоначальному вопросу

Может кто-нибудь подтвердить / отклонить, что это будет работать? То есть, совместимый с w3 DOM браузер не будет никогда интерпретировать узел Text как HTML, независимо от содержимого? Я был бы чрезвычайно признателен за решение этой мучительной небольшой неопределенности.

Спасибо за ваше время!

Ответы [ 2 ]

6 голосов
/ 25 января 2009

Да, это подтверждается в той мере, в какой бы браузер ни был, этот браузер будет иметь серьезный дефект. Текстовый узел, который отображает что угодно, кроме текста, будет противоречием. Используя document.createTextNode («некоторая строка»); и добавляя этот узел, строка гарантированно будет отображаться как текст.

0 голосов
/ 25 января 2009

Я не думаю, что фильтрация или экранирование тегов HTML - это очень элегантное решение - слишком легко придумать свертку, которая проскользнет мимо фильтра

Это абсолютно не соответствует действительности, фильтруя> к & gt; и <до ​​& lt; полностью остановит любую HTML-инъекцию. </p>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...