Экранирование строк HTML с помощью jQuery - PullRequest
573 голосов
/ 24 августа 2008

Кто-нибудь знает простой способ экранирования HTML из строк в jQuery ? Мне нужно иметь возможность передавать произвольную строку и правильно экранировать ее для отображения на странице HTML (предотвращая атаки с использованием JavaScript / HTML-инъекций). Я уверен, что для этого можно расширить jQuery, но в настоящий момент я недостаточно разбираюсь в фреймворке, чтобы этого добиться.

Ответы [ 24 ]

0 голосов
/ 26 мая 2015

Все решения бесполезны, если вы не препятствуете повторному побегу, например, большинство решений будут продолжать выходить из & в &.

escapeHtml = function (s) {
    return s ? s.replace(
        /[&<>'"]/g,
        function (c, offset, str) {
            if (c === "&") {
                var substr = str.substring(offset, offset + 6);
                if (/&(amp|lt|gt|apos|quot);/.test(substr)) {
                    // already escaped, do not re-escape
                    return c;
                }
            }
            return "&" + {
                "&": "amp",
                "<": "lt",
                ">": "gt",
                "'": "apos",
                '"': "quot"
            }[c] + ";";
        }
    ) : "";
};
0 голосов
/ 06 марта 2015

Если вы сохраняете эту информацию в базе данных , неправильно экранировать HTML с помощью клиентского сценария, это следует делать на сервере, В противном случае легко обойти защиту XSS.

Чтобы прояснить мою точку зрения, вот пример, использующий один из ответов:

Допустим, вы используете функцию escapeHtml, чтобы убрать Html из комментария в своем блоге и затем опубликовать его на своем сервере.

var entityMap = {
    "&": "&amp;",
    "<": "&lt;",
    ">": "&gt;",
    '"': '&quot;',
    "'": '&#39;',
    "/": '&#x2F;'
  };

  function escapeHtml(string) {
    return String(string).replace(/[&<>"'\/]/g, function (s) {
      return entityMap[s];
    });
  }

Пользователь может:

  • Измените параметры запроса POST и замените комментарий кодом JavaScript.
  • Перезаписать функцию escapeHtml с помощью консоли браузера.

Если пользователь вставит этот фрагмент в консоль, он пропустит проверку XSS:

function escapeHtml(string){
   return string
}
0 голосов
/ 18 сентября 2012

Этот ответ предоставляет методы jQuery и обычный JS, но это самый короткий путь без использования DOM:

unescape(escape("It's > 20% less complicated this way."))

Экранированная строка: It%27s%20%3E%2020%25%20less%20complicated%20this%20way.

Если сбежавшие места вас беспокоят, попробуйте:

unescape(escape("It's > 20% less complicated this way.").replace(/%20/g, " "))

Экранированная строка: It%27s %3E 20%25 less complicated this way.

К сожалению, функция escape() устарела в в JavaScript версии 1.5 . encodeURI() или encodeURIComponent() являются альтернативами, но они игнорируют ', поэтому последняя строка кода будет выглядеть так:

decodeURI(encodeURI("It's > 20% less complicated this way.").replace(/%20/g, " ").replace("'", '%27'))

Все основные браузеры по-прежнему поддерживают короткий код, и, учитывая количество старых сайтов, я сомневаюсь, что это скоро изменится.

0 голосов
/ 03 июня 2013
function htmlDecode(t){
   if (t) return $('<div />').html(t).text();
}

работает как шарм

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...