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