Столкнулся с задачей, когда необходимо фильтровать значение полей ввода, на предмет содержания в них HTML тегов, а также вызовов JScript функций.
В моем конкретном случае, дыра образовалась в инпуте, значение которого обрабатывалось JQuery методом.
Проблему решает написание JQuery фунции, которая может применятся к любому тегу который имеет значение val(). Я вырезаю из него все теги, а также содержимое всех скобок, вместе со скобками.
Реализацию функции привожу ниже:
(function($) {
$.fn.stripTagsFromVal = function() {
var regexp = /([<|(]("[^"]*"|'[^']*'|[^'">])*[>|)])/gi;
this.each(function() {
$(this).val(
$(this).val().replace(regexp,"")
);
});
return $(this);
}
})(jQuery);
Приведу пример использования:
Пусть у нас есть input#test, зададим ему значение:
$("#test").val('< script>alert('XSS attack!')< / script>');
Применим нашу функцию и проверим что получим на выходе:
$("#test").stripTagsFromVal();
console.log('text: ',$("#test").val());
В консоле будет: text: alert, что означает что из всей конструкции осталось только безобидное имя функции alert.