Javascript / jQuery XSS потенциальное чтение из строк запроса - PullRequest
6 голосов
/ 07 мая 2011

Мой javascript читает данные из строки запроса и помещает эти данные в текстовое поле, используя jQuery.val().

Это работает нормально, но мне интересно, это безопасно от атак XSS?

Скажем, строка запроса выглядела как ...

site.com?q="javascript:alert(document.cookie)

Что бы эффективно сделать:

jQuery.val('"javascript:alert(document.cookie)')

Из того, что я тестировал вIE8 / firefox устанавливает входное значение как видимое и не выполняет фактическую инъекцию.

Если я сначала запускаю эту функцию над строкой:

function htmlEncode(str) {
    return str.replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/'/g, '&#039;').replace(/"/g, '&quot;');
}

Тогда вы буквально видите &quot;javascript:alert(document.cookie) во входном значении, которое не то, что я хочу.

Использование jQuery 1.5.2 Наверное, мой вопрос: jQuery.val() обрабатывает ли HTML-объекты для вас и поэтому считается безопасным?

1 Ответ

8 голосов
/ 07 мая 2011

Учитывая следующее:

jQuery("#SomeTextbox").val("new value for SomeTextbox")

код jQuery для функции val просто делает это:

this.value = "new value for SomeTextbox";

где this - это ссылка на объект Text в DOM, представляющий текстовое поле с идентификатором «SomeTextbox». Строка "new value for SomeTextbox" сохраняется как свойство value этого объекта DOM. Он не трансформируется и не дезинфицируется. Но он не анализируется и не интерпретируется движком JavaScript (например, как в случае InnerHTML). Поэтому, независимо от того, что вы аргументируете val, он ничего не «сделает». Он просто изменяет значение строкового свойства объекта в DOM. Так что да, это было бы безопасно.

EDIT:

Вот некоторая дополнительная информация, которая может оказаться вам полезной.

Как правило, помещение чего-либо в текстовое поле, независимо от того, насколько вредоносным оно может быть, и независимо от того, как оно туда попадает, является «безопасным», если оно остается в текстовом поле. Но куда это идет, очень важно.

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

...