Что есть Cross Site Scripting? Об этом читайте на Википедии :)
Но знайте — во всем виноват браузер. Не важно: поддержиивает ли он HTML5 или до сих пор не понимает PNG прозрачность. Ну так как клиент всегда прав, то я расскажу как правильно фильтроватьбазар контент.
Философия XSS такова, что для внедрения вредоносного кода на страницу используется текст не «по правилам». Какие же они должны быть:
Это все из основного, более подробно о существующих видах атак можно почитать здесь
Большинство решений по предотвращению XSS используют жесткую фильтрацию потенциально опасных конструкций.
Но давайте рассмотрим вот этот пример:
Уровень опасности этого кода равен нулю. Однако CodeIgniter вернет следующее (в других фреймворках не проверял, будет полезно почитать в комментах):
Так что воробей из пушки CodeIgniter убит.
С недавнего времени я разрабатываю свой фреймворк Platcode. Но здесь я не пиарить его пришел, а рассказать о собственном XSS-фильтре.
Принцип работы прост — разбираем входную строку на теги/аттрибуты/значения, затем применяем фильтры на удаление опасных тегов и значений аттрибутов. Тем самым мы опускаем избыточную фильтрацию по всему тексту и делаем целенаправленные изменения в тегах/аттрибутах по отдельности. В этом случае вышеописанный пример сохранит свой первозданный вид. И клиент будет счастлив.
Из особеннностей фильтра:
Код, правда, документирован очень плохо, но функционал 100% работоспособный. Кому интересно поучавствовать в проекте или взломать XSS-фильтр, пишите в личку.
UPD.
Протестировать XSS-фильтр Да не сойдет на хостера хабрааффект :)
UPD2.
Благодаря хабрасообществу отлов и исправление багов идут ноздря в ноздрю.
Респект хабрапользователям: insa, isis, recompileme, floppyformator, ICQ:32523553
Но знайте — во всем виноват браузер. Не важно: поддержиивает ли он HTML5 или до сих пор не понимает PNG прозрачность. Ну так как клиент всегда прав, то я расскажу как правильно фильтровать
Немного о XSS
Философия XSS такова, что для внедрения вредоносного кода на страницу используется текст не «по правилам». Какие же они должны быть:
- Наименование тега отделяется от аттрибутов только \r\t\n\s символами:
<a href="http://habrahabr.ru">Click</a> <!-- Правильно -->
<a\href="XSS">Click</a> <!-- Неправильно -->
- HTML Entities, представленные в десятиричной/шестнадцатиричной формах должны быть переведены в свою привычную форму:
&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#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.
Благодаря хабрасообществу отлов и исправление багов идут ноздря в ноздрю.
Респект хабрапользователям: insa, isis, recompileme, floppyformator, ICQ:32523553