Pull to refresh

Comments 29

UFO just landed and posted this here
Неправильный вывод. это ведь не уязвимость просто поделки корпораций как обычно работают через одно место, а свободный огнелис показывает верные результаты.
Что значит «верные»? В соответствии со стандартом? Стандарт DOM не включает innerHTML вообще.
Верно как раз через & делать, так что все в принципе работают верно, просто огнелис допускает быдлокод, что не есть хорошо с другой стороны
Вы меняете innerHTML. Для строковых переменных амперсанд нужно использовать в исходном виде, если после хотите увидеть там тот же амперсанд.
Ога, вперед:
document.location.href = "http://www.google.ru/search?hl=ru&q=javascript";


Перед литеральным выводом в HTML (через document.write или innerHTML) — да, имеет смысл
Когда я вижу «document.body.innerHTML +=» у меня начинает дергаться глаз.
UFO just landed and posted this here
UFO just landed and posted this here
вообще, это все замечательно инкапсулируется в соответствующие утилитарные функции с применением encodeURI и encodeURIComponent
Первый нормальный комментарий по теме.
Угу, а теперь попробуйте так же заэкронировать амперсанды, скажем, в AJAX-запросе ;)
Уточняйте, пожалуйста, юз-кейсы.
Тут как я понял не о крутости браузеров спорят, а намекают о том что всё всегда надо проверять и часто задумываться, иначе проколешься на мелочи
Вы не умеете пользоваться DOM. Ничего не надо экранировать.
document.body.appendChild(document.createTextNode("http://example.org/get.php?test&ok&wonderful"))
Используйте jQuery, там красивее :-)
$('body').text("http://example.org/get.php?test&ok&wonderful")
Суть-то в том, что автор подсовывал браузеру non-well-formed HTML (с незакрытым character entity), говоря про текст. То что стандарты не предписывают, как вести себя в таких случаях, и браузеры ведут себя по-разному — общеизвестный факт.
Если XSLT в качестве шаблонизатора, то он вывалится если не экранировать.
Если скрипт заключен в CDATA, экранировать не надо, поскольку амперсанды там не парсятся как начало HTML entity.

ps. жалею что не хватает кармы на создание топика типа «уважаемые php программисты, экранируйте все переменные, передающиеся в запрос», или «уважаемые верстальщики, проставляйте доктайп»… :)
Однако пишем:
<body>
</body>
<script>
var a;
a = "http://example.org/get.php?test";
a += "&ok";
a += "&wonderful";
alert(a);
</script>

Во всех браузерах результат одинаковый: выдаётся сообщение
http://example.org/get.php?test&ok&wonderful
Дело не в парсинге JS-скрипта, а в том, что этот скрипт криво модифицирует DOM-модель.

Если я неправ, приведите, пожалуйста, полный текст исправленного документа с использованием CDATA, который будет давать одинаковый результат в разных браузерах.
Я, как верстальщик, писал через amp только потому, что валидатор ругается =)
В идеале моск должен ругаться раньше валидатора…
Экранирование зависит от контекста
Эм. Народ.
Может еще о более мелких проблемах будем писать на Хабре?
Мол 'a' !== 'а'

Короче бред
А никто ведь не сказал самого интересного — WTF оно так себя ведёт? И от чего это зависит полным списком — доктайп, цэдата и прочее.
Да нет, вот lany сказал выше

Вообще, по стандарту URL тоже должен быть «проамперсанжен» =)
в смысле URL в href тэга < a > :)
Вообще, во-первых, следует помнить, что innerHTML — это не просто поле, а свойство. То есть записав туда что-то и тут же считав, мы можем не получить то, что записали. То есть += действует примерно как setInnerHTML(getInnerHTML()+"...").
Чтение из innerHTML всегда должно возвращать well-formed HTML (исходя из здравого смысла, а не из стандарта, которого нет). Так как на вход ему подсовывают не well-formed, то браузеры пытаются интерпретировать его по-разному. Моё предположение, что Firefox интерпретирует &ok как ошибочно незаэкранированный амперсанд и добавляет экранирование сам, а Chrome интерпретирует, как незакрытый character-entity, мысленно дописывает в конец точку с запятой, после чего замечает, что character-entity &ok; не существует вообще и выкидывает его из результата.
Sign up to leave a comment.

Articles