Comments 29
Неправильный вывод. это ведь не уязвимость просто поделки корпораций как обычно работают через одно место, а свободный огнелис показывает верные результаты.
Вы меняете innerHTML. Для строковых переменных амперсанд нужно использовать в исходном виде, если после хотите увидеть там тот же амперсанд.
Ога, вперед:
Перед литеральным выводом в HTML (через document.write или innerHTML) — да, имеет смысл
document.location.href = "http://www.google.ru/search?hl=ru&q=javascript";
Перед литеральным выводом в HTML (через document.write или innerHTML) — да, имеет смысл
Когда я вижу «document.body.innerHTML +=» у меня начинает дергаться глаз.
вообще, это все замечательно инкапсулируется в соответствующие утилитарные функции с применением encodeURI и encodeURIComponent
Угу, а теперь попробуйте так же заэкронировать амперсанды, скажем, в AJAX-запросе ;)
Уточняйте, пожалуйста, юз-кейсы.
Уточняйте, пожалуйста, юз-кейсы.
В Опере как в Fx
Вы не умеете пользоваться DOM. Ничего не надо экранировать.
document.body.appendChild(document.createTextNode("http://example.org/get.php?test&ok&wonderful"))
слишком громоздко
Используйте jQuery, там красивее :-)
Суть-то в том, что автор подсовывал браузеру non-well-formed HTML (с незакрытым character entity), говоря про текст. То что стандарты не предписывают, как вести себя в таких случаях, и браузеры ведут себя по-разному — общеизвестный факт.
$('body').text("http://example.org/get.php?test&ok&wonderful")
Суть-то в том, что автор подсовывал браузеру non-well-formed HTML (с незакрытым character entity), говоря про текст. То что стандарты не предписывают, как вести себя в таких случаях, и браузеры ведут себя по-разному — общеизвестный факт.
Если XSLT в качестве шаблонизатора, то он вывалится если не экранировать.
Если скрипт заключен в CDATA, экранировать не надо, поскольку амперсанды там не парсятся как начало HTML entity.
ps. жалею что не хватает кармы на создание топика типа «уважаемые php программисты, экранируйте все переменные, передающиеся в запрос», или «уважаемые верстальщики, проставляйте доктайп»… :)
ps. жалею что не хватает кармы на создание топика типа «уважаемые php программисты, экранируйте все переменные, передающиеся в запрос», или «уважаемые верстальщики, проставляйте доктайп»… :)
Однако пишем:
Во всех браузерах результат одинаковый: выдаётся сообщение
Дело не в парсинге JS-скрипта, а в том, что этот скрипт криво модифицирует DOM-модель.
Если я неправ, приведите, пожалуйста, полный текст исправленного документа с использованием CDATA, который будет давать одинаковый результат в разных браузерах.
<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' !== 'а'
…
Короче бред
Может еще о более мелких проблемах будем писать на Хабре?
Мол 'a' !== 'а'
…
Короче бред
А никто ведь не сказал самого интересного — WTF оно так себя ведёт? И от чего это зависит полным списком — доктайп, цэдата и прочее.
Вообще, во-первых, следует помнить, что innerHTML — это не просто поле, а свойство. То есть записав туда что-то и тут же считав, мы можем не получить то, что записали. То есть += действует примерно как setInnerHTML(getInnerHTML()+"...").
Чтение из innerHTML всегда должно возвращать well-formed HTML (исходя из здравого смысла, а не из стандарта, которого нет). Так как на вход ему подсовывают не well-formed, то браузеры пытаются интерпретировать его по-разному. Моё предположение, что Firefox интерпретирует &ok как ошибочно незаэкранированный амперсанд и добавляет экранирование сам, а Chrome интерпретирует, как незакрытый character-entity, мысленно дописывает в конец точку с запятой, после чего замечает, что character-entity &ok; не существует вообще и выкидывает его из результата.
Чтение из innerHTML всегда должно возвращать well-formed HTML (исходя из здравого смысла, а не из стандарта, которого нет). Так как на вход ему подсовывают не well-formed, то браузеры пытаются интерпретировать его по-разному. Моё предположение, что Firefox интерпретирует &ok как ошибочно незаэкранированный амперсанд и добавляет экранирование сам, а Chrome интерпретирует, как незакрытый character-entity, мысленно дописывает в конец точку с запятой, после чего замечает, что character-entity &ok; не существует вообще и выкидывает его из результата.
Sign up to leave a comment.
Амперсанды в строковых константах