Pull to refresh

Не очередной XSS фильтр

Reading time2 min
Views8.4K
Что есть Cross Site Scripting? Об этом читайте на Википедии :)

Но знайте — во всем виноват браузер. Не важно: поддержиивает ли он HTML5 или до сих пор не понимает PNG прозрачность. Ну так как клиент всегда прав, то я расскажу как правильно фильтровать базар контент.


Немного о XSS


Философия XSS такова, что для внедрения вредоносного кода на страницу используется текст не «по правилам». Какие же они должны быть:
  • Наименование тега отделяется от аттрибутов только \r\t\n\s символами:
    <a href="http://habrahabr.ru">Click</a> <!-- Правильно -->
    <a\href="XSS">Click</a> <!-- Неправильно -->

  • HTML Entities, представленные в десятиричной/шестнадцатиричной формах должны быть переведены в свою привычную форму:
    &amp;#106;&amp;#97;&amp;#118;&amp;#97;&amp;#115;&amp;#99;&amp;#114;&amp;#105;&amp;#112;&amp;#116;
    javascript

  • Существует набор тегов, которых на странице пользователя быть не должно. Тут не стоит забывать и про HTML5, в котором есть теги (например audio, video), позволяющие злоумышленнику загружать код в браузер путем подмены ресурса на скриптлет.
  • Запрет на использование DOM событий.
  • Запрет на включение в аттрибут inline javascript или (внимание!) vbscript.
  • Запрет на использование в style таких IE-поделок как «expression» или CSS3 «behavior»

Это все из основного, более подробно о существующих видах атак можно почитать здесь

Как можно защититься?


Большинство решений по предотвращению XSS используют жесткую фильтрацию потенциально опасных конструкций.
Но давайте рассмотрим вот этот пример:
<a href=http://habrahabr.ru>javascript:alert("Hello");</a>

Уровень опасности этого кода равен нулю. Однако CodeIgniter вернет следующее (в других фреймворках не проверял, будет полезно почитать в комментах):
<a >[removed]alert("Hello");</a>

Так что воробей из пушки CodeIgniter убит.

Есть более гибкий фильтр


С недавнего времени я разрабатываю свой фреймворк Platcode. Но здесь я не пиарить его пришел, а рассказать о собственном XSS-фильтре.

Принцип работы прост — разбираем входную строку на теги/аттрибуты/значения, затем применяем фильтры на удаление опасных тегов и значений аттрибутов. Тем самым мы опускаем избыточную фильтрацию по всему тексту и делаем целенаправленные изменения в тегах/аттрибутах по отдельности. В этом случае вышеописанный пример сохранит свой первозданный вид. И клиент будет счастлив.

Из особеннностей фильтра:
  • удаление «опасных» тегов
  • удаление inline javascript/vbscript
  • удаление style аттрибута, содержащего expression, behavior
  • преобразование названий тегов/аттрибутов в lowercase
  • удаление пустых аттрибутов
  • автоматическое создание закрывающихся тегов
  • преобразование одинарных тегов вида <br> к <br />

Код, правда, документирован очень плохо, но функционал 100% работоспособный. Кому интересно поучавствовать в проекте или взломать XSS-фильтр, пишите в личку.

UPD.

Протестировать XSS-фильтр Да не сойдет на хостера хабрааффект :)

UPD2.

Благодаря хабрасообществу отлов и исправление багов идут ноздря в ноздрю.

Респект хабрапользователям: insaisisrecompilemefloppyformator, ICQ:32523553
Tags:
Hubs:
Total votes 46: ↑32.5 and ↓13.5+19
Comments61

Articles