пятница, 2 октября 2009 г.

Создаем JQuery фильтр для полей для предотвращения XSS атак. Create JQuery filter for XSS attacks avert

Столкнулся с задачей, когда необходимо фильтровать значение полей ввода, на предмет содержания в них 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.

Модифицировать даный пример, для конкретного вашего случая, не составит проблем. Для отладки регулярных выражений пользуйтесь замечательным online отладчиком Rubular