В C компилятор может обычно оптимизировать их, чтобы быть тем же, если результат не использован.
Однако в C++ при использовании других типов, которые обеспечивают их собственное ++ операторы, версия префикса, вероятно, будет быстрее, чем постфиксная версия. Так, если Вам не нужна постфиксная семантика, лучше использовать префиксный оператор.
Измените тестовую строку на & lt; b & gt; & lt; & lt; & amp; & amp; & amp; & lt; / b & gt;
, чтобы лучше понять, каков риск ... (или лучше, & lt; img src = 'http: //www.spam.com/ASSETS/0EE75B480E5B450F807117E06219CDA6/spamReg.png' onload = 'alert (document.cookie);' & gt;
для спама с кражей файлов cookie)
См. пример по адресу http://jsbin.com/uveme/139/ (на основе вашего примера с использованием прототипа для отмены экранирования). Попробуйте нажать четыре разные кнопки чтобы увидеть различные эффекты. Только последний представляет угрозу безопасности. (Вы можете просмотреть / отредактировать исходный код на http://jsbin.com/uveme/139/edit ) Пример фактически не ворует ваши куки ...
createTextNode
для создания текстовый узел и appendChild
, чтобы вставить этот неизмененный объект узла прямо в ваш документ , вы в безопасности. Примечание: Как указал Бен Винегар Использование createTextNode
не является волшебной пулей: используйте его для экранирования строки, а затем используйте ] textContent
или innerHTML
для вывода экранированного текста и других действий с ним не защитит вас при дальнейшем использовании. В частности, метод escapeHtml в Питере Брауне '
Попробуйте функции escape и unescape, доступные в Javascript
Подробнее: http://www.w3schools.com/jsref/jsref_unescape.asp
Некоторые догадки, чего это стоит.
innerHTML - это буквально браузер, интерпретирующий hte html.
поэтому <становится меньше символа, потому что это произойдет, если вы поместите <в html document.
Самый большой риск для безопасности строк с & - это выражение eval, любой JSON может сделать приложение небезопасным. Я не специалист по безопасности, но если строки остаются строками, то все должно быть в порядке.
Это еще один способ защиты innerHTML: неэкранированная строка превращается в HTML, поэтому нет никакого риска, что она запустит javascript.
Пока ваш код создает текстовые узлы, браузер НЕ должен отображать ничего вредного. Фактически, если вы проверите источник сгенерированного текстового узла с помощью Firebug или панели инструментов IE Dev, вы увидите, что браузер повторно экранирует специальные символы.
присвойте ему
"<script>"
, и он повторно экранирует его, чтобы :
"<script>"
Есть несколько типов узлов: Элементы, Документы, Текст, Атрибуты и т. Д.
Опасность заключается в том, что браузер интерпретирует строку как содержащий сценарий. Свойство innerHTML подвержено этой проблеме, поскольку оно указывает браузеру создавать узлы Element, один из которых может быть элементом сценария или иметь встроенный Javascript, например обработчики onmouseover. Создание текстовых узлов позволяет обойти эту проблему.
если вы проверите источник сгенерированного текстового узла с помощью Firebug или панели инструментов IE Dev, вы увидите, что браузер повторно экранирует специальные символы.присвойте ему
"<script>"
, и он повторно экранирует его на:
"<script>"
Существует несколько типов узлов: элементы, документы, текст, атрибуты и т. Д.
Опасность заключается в том, что браузер интерпретирует строку как содержащий сценарий. Свойство innerHTML подвержено этой проблеме, поскольку оно указывает браузеру создавать узлы Element, один из которых может быть элементом сценария или иметь встроенный Javascript, например обработчики onmouseover. Создание текстовых узлов позволяет обойти эту проблему.
если вы проверите источник сгенерированного текстового узла с помощью Firebug или панели инструментов IE Dev, вы увидите, что браузер повторно экранирует специальные символы.присвойте ему
"<script>"
, и он повторно экранирует его на:
"<script>"
Существует несколько типов узлов: элементы, документы, текст, атрибуты и т. Д.
Опасность заключается в том, что браузер интерпретирует строку как содержащий сценарий. Свойство innerHTML подвержено этой проблеме, поскольку оно указывает браузеру создавать узлы Element, один из которых может быть элементом сценария или иметь встроенный Javascript, например обработчики onmouseover. Создание текстовых узлов позволяет обойти эту проблему.
Элементы, документы, текст, атрибуты и т. Д.Опасность заключается в том, что браузер интерпретирует строку как содержащий сценарий. Свойство innerHTML подвержено этой проблеме, поскольку оно указывает браузеру создавать узлы Element, один из которых может быть элементом сценария или иметь встроенный Javascript, например обработчики onmouseover. Создание текстовых узлов позволяет обойти эту проблему.
Элементы, документы, текст, атрибуты и т. Д.Опасность заключается в том, что браузер интерпретирует строку как содержащий сценарий. Свойство innerHTML подвержено этой проблеме, поскольку оно указывает браузеру создавать узлы Element, один из которых может быть элементом сценария или иметь встроенный Javascript, например обработчики onmouseover. Создание текстовых узлов позволяет обойти эту проблему.