2009-09-29 4 views
2

Я работаю над StackQL.net, который представляет собой простой веб-сайт, который позволяет запускать специальные запросы tsql в общедоступном наборе данных StackOverflow. Это уродливо (я не графический дизайнер), но он работает.Только теги сценариев HTMLEncode

Один из вариантов, которые я сделал, это то, что я делаю не хочу, чтобы html кодировал все содержимое тел сообщений. Таким образом, вы видите некоторые форматирования из сообщений в ваших запросах. Он даже загрузит изображения, и я в порядке с этим.

Но я обеспокоен тем, что это также оставит <script> теги активными. Кто-то может установить вредоносный скрипт в ответ на stackoverflow; они могут даже сразу удалить его, поэтому никто его не видит. Один из самых распространенных запросов, которые люди пробуют при первом посещении, - это простой Select * from posts, поэтому с небольшим количеством времени такой скрипт может работать в нескольких браузерах. Я хочу убедиться, что это не вызывает беспокойства, прежде чем я обновляю (октябрь) экспорт данных (надеюсь, скоро будет выпущен).

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

ответ

3

Возможно, вы захотите изменить HTMLSanatize script в соответствии с вашими потребностями. Это было написано Джеффом Этвудом, чтобы показать некоторые виды HTML. Поскольку это было написано для Stack Overflow, оно также соответствовало бы вашей цели.

Я не знаю, является ли это «актуальным» с тем, что сейчас развернул Джефф, но это хорошая отправная точка.

+0

Это, скорее всего, закончится как принятый ответ, но я не буду проверять его до этих выходных. –

2

Не забудьте onclick, onmouseover и т.д. или JavaScript: псевдопользователей-URLs (<img src="javascript:evil!Evil!">) или CSS (style="property: expression(evil!Evil!);") или ...

Есть множество атак векторов помимо простых элементов сценария.

Внесите a white list, а не черный список.

0

Как насчет простого разбиения тегов <script>? Исключение только < и > для этого тега, заканчивающегося &lt;script&gt;, может быть простым и простым способом.

Конечно, ссылки - это еще один вектор. Вы также должны отключить каждый экземпляр href='javascript:' и каждый атрибут, начинающийся с on *.

Чтобы быть уверенным, удалите его с орбиты.

+0

Замена < and > нарушит другое форматирование, которое я хочу разрешить. –

+0

@Joel Coehoorn: и замена

0

Но я обеспокоен тем, что это также оставит <script теги активными.

О, это только начало вредоносного содержимого HTML, которое может вызвать межсайтовый скриптинг. Есть также обработчики событий; встроенные и связанные CSS (выражения, поведение, привязки), Flash и другие встраиваемые плагины, iframe для использования сайтов, javascript: и другие опасные схемы (есть больше, чем вы думаете!) в любом месте, которое может принимать URL-адрес, мета-обновление, переполнения UTF-8, неправильное обнюхивание UTF-7, привязку данных, VML и другие вещи, отличные от HTML, разбитая разметка анализируется как скрипты разрешительными браузерами ...

Короче говоря, любая попытка быстрого исправления HTML с простым регулярным выражением не удастся.

Либо избегайте всего, чтобы любой HTML отображался как обычный текст или использовался полный синтаксический анализатор на основе парсера и белого списка. (И держите его в курсе, потому что даже это тяжелая работа, и в них часто появляются вновь открытые дыры.)

Но разве вы не используете ту же систему Markdown, что и SO, чтобы отображать сообщения? Это было бы очевидным делом. Я не могу гарантировать, что в Markdown нет отверстий, которые позволяли бы межсайтовый скриптинг (в прошлом, конечно, было и есть, вероятно, еще несколько неясных, поскольку это довольно сложная система). Но, по крайней мере, вы не были бы более беззащитными, чем это было!

+0

Да, я думаю, что я собираюсь с сценарием Html Sanitize, уже предложенным Джорджем. –