2011-05-07 6 views
6

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

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

Say строка запроса выглядел как ...

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 для вас и поэтому считается безопасным?

ответ

8

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

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

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

this.value = "new value for SomeTextbox"; 

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

EDIT:

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

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

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

+0

@fire - После публикации ответа выше, я подумал о чем-то другом, что вы можете найти полезным.Хотя вы уже приняли мой первоначальный ответ, я решил опубликовать дополнительный материал в любом случае, потому что я думаю, что он может ответить на более глубокий вопрос, который лежит в основе того, что вы просили. Удачи в том, чтобы держать хакеров в страхе! –