Что означает "очистка 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
атрибуты, они не выполняются вообще.