Спасибо за статью. Есть ли где-то готовый набор практик и приемов, которые позволяют исключить или уменьшить вероятность получить XSS уязвимость? Это настолько уже обширная тема, что знать все методы XSS атак прикладному программисту просто невозможно. Нужны best practices, которые позволят избежать уязвимостей не вдаваясь в детали их реализации.

PS: К сожалению, судя по количеству комментариев, сообщество не очень интересуется этой темой :(
Для сообщества тема скорее избита уже с XSS

Проверять на валидность/Парсить/Очищать все входящие и исходящие данные.
Остальное тут.

Использовать подходы которые исключают вставку "грязных" данных напрямую в разметку.


Например, шаблонизатор Razor (он же ASP.NET WebPages) полностью исключает XSS если не использовать инлайн-скрипты и конструкцию Html.Raw.


Клиентские фреймворки, которые работают с DOM а не с HTML — тоже безопасны (если, опять-таки, не использовать html-биндинги и инлайн-скрипты).

которые работают с DOM а не с HTML — тоже безопасны


При том что автор привел обратные примеры.
если, опять-таки, не использовать html-биндинги и инлайн-скрипты
Если делать все корректно — у вас все будет хорошо.
Но всегда есть соблазн сэкономить свое время.

best-practice — не доверять ничему что приходит от пользователя. Куки, заголовки, данные, файлы. Валидировать и санитизить серверной стороной!!! (Валидация на клиенте — только декоративная, чтобы быстро юзеру подсказать что не так, потому что я могу скриптик ручками поправить и отправить в ваше апи любую каку минуя валидации)

best-practice — не доверять ничему что приходит от пользователя


Не только от пользователя.
От коллег, библиотеки/пакеты которых вы используете в своих продуктах
best-practice — не доверять ничему.
Спасибо! Хорошая и актуальная статья. Но, «заэскейпить» — как это?

На картинке же показано как.

htmlspecialchars (если php)
Тэги и их аттрибуты надо фильтровать только по белому списку. После чего дофильтровывать возможные значения.
Так вот, за свою шутку Сэми получил 3 года.

Английская википедия говорит


but paying a fine of $20,000 USD, serving three years of probation, working 720 hours of community service

Не находите, что "получил 3 года" — это совсем не то же самое, что "три года условно и 720 часов общественных работ"?

три года условно в России — тоже срок :) Ты не можешь выбрать Путина, не можешь работать на некоторых работах, обязан отмечаться у всяких мерзких товарищей-участковых, итп. Тебя обязательно заставят найти работу (т.е. просто жить фрилансером не получится). А при приёме на работу, пока срок не закончился, тебе нужно писать судимость — и кто тебя таким возьмёт? И ты даже не можешь выехать из России!
Не в курсе — не пиши.
Даже реально заключенные, а не условно — имеют право голосовать. Они не могут сами быть избранными.
Ну, думаю вы знаете, как голосуют в тюрьмах и армии.
Ну, думаю вы знаете, как голосуют в тюрьмах и армии.

В отличие от остальных граждан, которым лениво свою жопу от дивана оторвать в день голосования — голосуют реально, да.
И главное, дружно, за одного кандидата. А содержащиеся в психушках так вообще, с песней.
А содержащиеся в психушках так вообще, с песней.
Недееспособные не имеют право голосовать, о грамотей
Ну да, и количество дееспособных увеличивается на 146%.
У знакомого сын получил условный срок.Раз в месяц отмечается, официально не работает, и никто его не заставляет устраиваться на работу.Сейчас вот оформляется даже на УДО…
ну технически автор не сказал что Сэми получил три года именно тюрьмы так что в чем укор? Тем более три года без интернета, сейчас для многих это наказание было бы худшим кошмаром.
По поводу
Vue.js никак нам в этом не помогает. Это должен делать сам разработчик. И вот сейчас, если вы пишете на Vue.js и впервые об этом слышите — у вас уязвимое приложение. Поздравляю.

То v-html применяется специально для вывода сырого html и подразумевается, что это не безопасно давать контроль пользователю над выводимым таким образом значением, вообще v-html используется в крайне редких случаях. Для вывода контента нужно использовать "{{ }}"
ru.vuejs.org/v2/guide/syntax.html#%D0%A1%D1%8B%D1%80%D0%BE%D0%B9-HTML
Dynamically rendering arbitrary HTML on your website can be very dangerous because it can easily lead to XSS vulnerabilities. Only use HTML interpolation on trusted content and never on user-provided content.

Автор презентации упоминал eslint-security-plugin, я портировал его под TSLint как preset с правилами.

Предлагаю написать новый js-Фреймворк с защитой от xss!

Только полноправные пользователи могут оставлять комментарии.
Войдите, пожалуйста.