2009-10-28 2 views
18

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

Я реализую Markdown и редактор Markdown Markdown (ветвь SO master from 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 будет лишать его, поэтому элемент сценария не будет удален.

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

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

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

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

+3

FWIW, я ненавижу, когда просмотр не соответствует опубликованному. – Ms2ger

+1

@ ms2ger: Вот почему мне нужен дезинфицирующее средство для HTML, так что предварительный просмотр будет соответствовать тому, что делает сервер в фоновом режиме. –

+0

не проблема, чтобы позволить злоумышленникам проверять свои атаки в своем браузере, пока вы не видите никаких попыток? – siukurnin

ответ

9

Вы должны взглянуть на один рекомендуемого в этом вопросе Sanitize/Rewrite HTML on the Client Side

И просто чтобы быть уверенным, что вы не должны делать больше о XSS, пожалуйста, просмотрите ответы на этот один How to prevent Javascript injection attacks within user-generated HTML

+1

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

-1

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

var validateString = function(string) { 

     var validity = true; 

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

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

      validity = false; 
     } 

     return validity; 
    } 
Смежные вопросы