Я пытаюсь предотвратить атаки CSRF в существующем крупном веб-приложении. Я выбрал токен, который вставляется с использованием JS в любую форму, и фильтр сервлетов Java, который проверит его наличие, прежде чем разрешить продолжить запрос. Во-первых, мы рады, что у пользователя есть JS.
Во-вторых - как мне это сделать?
Самая простая идея: $(document).live("submit", myTokenAddFn);
не работает.
Часть ввода токена оказывается очень сложной, поскольку, как я уже сказал, веб-приложение очень велико, и есть несколько мостов для пересечения:
- Существуют формы, которые создаются (используя JS) после загрузки страницы
- Мы используем JSF (который имеет атрибуты onclick на тегах привязки для отправки форм)
- Существуют случаи отправки форм jQuery с использованием AJAX
- Существует множество обработчиков onclick, прикрепленных к элементам отправки формы
Я чувствую, что я очень близок, но не могу поверить, что не влияю на производительность в медленных браузерах. Я начинаю думать, что мог бы быть лучший способ.
Что я сделал:
- Чтобы преодолеть отправку jQuery AJAX-форм: Использование метода ajaxSend для добавления моего токена к значениям реальных данных перед отправкой запроса AJAX
- Чтобы добавить токен в простые элементы формы на странице, которые присутствуют при загрузке страницы: При загрузке страницы эффективно переберите формы и добавьте токен, затем добавьте jQuery data , который говорит, что эта форма имеет маркер (для улучшения производительности следующего шага)
- Для преодоления динамически создаваемых форм:
$("input[type='submit'],input[type='image'],button,a[onclick]").live("mousedown", myTokenAddFn);
Вышеприведенная строка отлично справляется со своей задачей, и «myTokenAddFn» фактически просто перебирает страницу снова, ища все формы, в которых нет элемента данных jQuery, который я добавил при загрузке страницы.
Он справляется с формами JSF, которые отправляются с атрибутом onclick тега привязки, кнопками, которые не находятся в форме, но отправляют форму, и гарантирует, что токен всегда добавляется до того, как какой-либо другой обработчик onclick отправит форму (которая может присутствовать) .
Последний выпуск:
Форма JS динамически добавляется на страницу, и пользователь отправляет ее с помощью клавиши ввода, когда курсор находится в поле ввода текста. Пользователь (благодаря моему сервлету Java) вышел из системы.
Самое простое решение - включить прослушивание клавиш для всех элементов ввода, но удар по производительности меня беспокоит.
Есть предложения? Идеи для нового старта?
Заранее спасибо.