Объекты HTML неEscape в JavaScript?

146
задан Joseph Turian 16 December 2009 в 05:27
поделиться

4 ответа

РЕДАКТИРОВАТЬ: Вы должны использовать DOMParser API, как Владимир предлагает , я отредактировал свой предыдущий ответ, поскольку опубликованная функция привела к уязвимости системы безопасности.

Следующее snippet - это старый код ответа с небольшой модификацией: использование textarea вместо div снижает уязвимость XSS, но это все еще проблематично в IE9 и Firefox.

function htmlDecode(input){
  var e = document.createElement('textarea');
  e.innerHTML = input;
  // handle case of empty input
  return e.childNodes.length === 0 ? "" : e.childNodes[0].nodeValue;
}

htmlDecode("<img src='myimage.jpg'>"); 
// returns "<img src='myimage.jpg'>"

В основном я программно создать элемент DOM, присвоить закодированный HTML его innerHTML и получить nodeValue из текстового узла, созданного при вставке innerHTML. Поскольку он просто создает элемент, но никогда не добавляет его, HTML-код сайта не изменяется.

Он будет работать в кросс-браузере (включая старые браузеры) и принимать все HTML-символы .

РЕДАКТИРОВАТЬ: Старая версия этого кода не работала в IE с пустыми входами, о чем свидетельствует здесь, в jsFiddle (просмотреть в IE). Вышеупомянутая версия работает со всеми входными данными.

ОБНОВЛЕНИЕ: похоже, это не работает с большой строкой, а также представляет собой уязвимость безопасности , см. Комментарии.

162
ответ дан 23 November 2019 в 22:38
поделиться
var encodedStr = 'hello &amp; world';

var parser = new DOMParser;
var dom = parser.parseFromString(
    '<!doctype html><body>' + encodedStr,
    'text/html');
var decodedString = dom.body.textContent;

console.log(decodedString);
0
ответ дан 23 November 2019 в 22:38
поделиться

Если вы используете jQuery:

function htmlDecode(value){ 
  return $('<div/>').html(value).text(); 
}

В противном случае используйте Strictly Software's Encoder Object , который имеет отличную функцию htmlDecode () .

38
ответ дан 23 November 2019 в 22:38
поделиться

Не прямой ответ на ваш вопрос, но не лучше ли, чтобы ваш RPC возвращал некоторую структуру (будь то XML, JSON или что-то еще) с этими данными изображения (URL-адреса в вашем примере ) внутри этой структуры?

Затем вы можете просто проанализировать его в своем javascript и построить , используя сам javascript.

Структура, которую вы получите от RPC, может выглядеть так:

{"img" : ["myimage.jpg", "myimage2.jpg"]}

Я думаю, так лучше , так как внедрение кода из внешнего источника на вашу страницу не выглядит очень безопасным. Представьте, что кто-то перехватывает ваш XML-RPC скрипт и помещает туда то, что вам не нужно (даже какой-то javascript ...)

3
ответ дан 23 November 2019 в 22:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: