Что означает "очистка JavaScript не спасает вас от innerHTML"?

Я изучаю xss предотвращение через этот ppt: http://stash.github.io/empirejs-2014/, и у меня есть вопрос на этой странице.

Там написано: "Очистка JavaScript не спасет вас от innerHTML", и я попробовал простой тест, подобный следующему:

<!doctype html>
<html>
<head>
  <meta charset="utf-8">
  <title>test</title>
</head>
<body>
  <div id="test"></div>
  <script>
    var userName = "Jeremy\x3Cscript\x3Ealert('boom')\x3C/script\x3E";
    document.getElementById('test').innerHTML = "<span>"+userName+"</span>";
  </script>
</body>
</html>

Когда я открыл этот HTML-код в моем браузере (Chrome), я увидел только имя "Джереми", с помощью F12, я увидел

<div id="test"><span>Jeremy<script>alert('boom')</script></span></div>

Хотя скрипт был добавлен в html, окно предупреждения не появилось.

"Очистка JavaScript не спасает вас от innerHTML". Я думаю, это означает, что слово "бум" должно быть предупреждено. Я прав?

1 ответ

Решение

Согласно MDN, innerHTML предотвращает <script> элементы от непосредственного выполнения 1, что означает, что ваш тест не должен ничего предупреждать. Однако это не препятствует запуску обработчиков событий в будущем, что делает возможным следующее:

var name = "\x3Cimg src=x onerror=alert(1)\x3E";
document.getElementById('test').innerHTML = name; // shows the alert
<div id="test"></div>

(скрипт адаптирован из примера в статье, с escape-последовательностями, хотя я не уверен, что они актуальны вне <script> элементы)

поскольку <script> элементы никогда не выполняются при вставке через innerHTML Мне не ясно, что этот слайд пытается передать этим примером.


1 Это на самом деле указано в HTML5. MDN ссылки на проект 2008 года; в текущей Рекомендации W3C он расположен ближе к концу раздела 4.11.1, непосредственно перед началом раздела 4.11.1.1:

Примечание: при вставке с использованием document.write() метод, script элементы выполняются (обычно синхронно), но при вставке с использованием innerHTML а также outerHTML атрибуты, они не выполняются вообще.

Другие вопросы по тегам