Простое средство для дезинфекции HTML в Javascript - PullRequest
25 голосов
/ 28 октября 2009

Я ищу простое дезинфицирующее средство HTML, написанное на JavaScript. Он не должен быть на 100% безопасным для XSS.

Я внедряю Markdown и редактор WMD Markdown (основная ветка SO от github) на моем веб-сайте. Проблема в том, что HTML-код, показанный в реальном времени, не фильтруется, как здесь, в SO. Я ищу простое / быстрое дезинфицирующее средство HTML, написанное на JavaScript, чтобы я мог отфильтровать содержимое окна предварительного просмотра.

Нет необходимости в полном парсере с полной защитой XSS. Я не отправляю вывод обратно на сервер. Я отправляю Markdown на сервер, где использую правильное полное HTML-дезинфицирующее средство, прежде чем сохранить результат в базе данных.

Google абсолютно бесполезен для меня. Я просто получаю сотни (часто неправильных) статей о том, как отфильтровать JavaScript из сгенерированного пользователем HTML на всех видах серверных языков.

UPDATE

Я объясню немного лучше, зачем мне это нужно. На моем сайте есть редактор, очень похожий на тот, что здесь, на StackOverflow. Есть текстовая область для ввода синтаксиса MarkDown и окно предварительного просмотра, которое показывает вам, как оно будет выглядеть после того, как вы его отправили.

Когда пользователь отправляет что-то, оно отправляется на сервер в формате MarkDown. Сервер преобразует его в HTML, а затем запускает на нем дезинфицирующее средство HTML для очистки HTML. MarkDown допускает произвольный HTML, поэтому мне нужно его очистить. Например, пользователь вводит что-то вроде этого:

<script>alert('Boo!');</script>

Конвертер MarkDown его не трогает, так как это HTML. Дезинфицирующее средство HTML удалит его, поэтому элемент script исчезнет.

Но это не то, что происходит в окне предварительного просмотра. Окно предварительного просмотра только преобразует MarkDown в HTML, но не очищает его. Таким образом, окно предварительного просмотра будет иметь элемент script. Это означает, что окно предварительного просмотра отличается от фактического рендеринга на сервере.

Я хочу это исправить, поэтому мне нужно быстрое и грязное JavaScript HTML-дезинфицирующее средство. Что-то простое с базовым списком элементов / атрибутов подойдет. Он не должен быть безопасным для XSS, потому что защита XSS выполняется с помощью средства очистки HTML-кода на стороне сервера.

Это просто для того, чтобы убедиться, что окно предварительного просмотра будет соответствовать фактическому рендерингу в 99,99% времени, что мне достаточно.

Вы можете помочь? Заранее спасибо!

Ответы [ 3 ]

12 голосов
/ 28 октября 2009

Вы должны взглянуть на то, что рекомендовано в этом вопросе Очистить / переписать HTML на стороне клиента

И чтобы убедиться, что вам не нужно больше заниматься XSS, просмотрите ответы на этот вопрос Как предотвратить атаки с использованием Javascript в пользовательском HTML

3 голосов
/ 18 января 2019

Мы разработали простой HtmlSantizer и открыли его здесь: https://github.com/jitbit/HtmlSanitizer

Использование

var result = HtmlSanitizer.SanitizeHtml(input);

[Отказ от ответственности! Я один из авторов!]

0 голосов
/ 27 сентября 2017

для моей функции я заботился только о том, чтобы строка не была пустой и содержала только буквенно-цифровые символы. Это использует простой JS и не третьи библиотеки или что-нибудь еще. Он содержит длинное регулярное выражение, но он делает свою работу;) Вы можете основываться на этом, но ваше регулярное выражение должно быть чем-то более похожим ' | ' (с символами, экранированными там, где это необходимо, без пробелов). ;)

    var validateString = function(string) {

      var validity = true;

      if( string == '' ) { validity = false; }

      if( string.match( /[ |<|,|>|\.|\?|\/|:|;|"|'|{|\[|}|\]|\||\\|~|`|!|@|#|\$|%|\^|&|\*|\(|\)|_|\-|\+|=]+/ ) != null ) {

          validity = false;
      }

      return validity;
    }
...