Подтвердить что ты не робот

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

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

В нем говорится, что "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>
4b9b3361

Ответ 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>