Защита от подделки межсайтовых запросов с использованием токенов распорок - PullRequest
19 голосов
/ 29 ноября 2010

Я хочу реализовать предотвращение подделки межсайтовых запросов для моего веб-приложения, основанного на структуре Struts 1.x.Я знаю, что структура Struts 2 предоставляет для этого токен-перехватчик, и я могу реализовать аналогичные функции с помощью фильтров.

Я немного сбит с толку из-за того, что мало кто задумывается: 1) Как я могу сгенерировать уникальный токен простым способом?(могу ли я использовать токен класса Action для этой цели, который используется для избежания дублирования отправки формы)

Есть ли какие-либо проблемы в использовании механизма токенов структуры Struts 1.x для предотвращения CSRF

1 Ответ

17 голосов
/ 17 марта 2011

Методы токенов Struts 1 Action работают как перехватчик токенов Struts 2, так как они добавляют токен в ваш сеанс и проверяют его при отправке формы, но это гораздо более ручной процесс.Основной рабочий процесс:

  1. Пользователь получает форму через действие Struts (не напрямую в JSP).Действие Struts вызывает saveToken(request) перед пересылкой на JSP, который содержит форму.
  2. Форма в JSP должна использовать тег <html:form>.
  3. Ваше действие, которое форма отправляет всначала вызовет isTokenValid(request, true), и вам следует перенаправить обратно к первому действию с сообщением об ошибке, если оно вернет false.Это также сбрасывает токен для следующего запроса.

Это не только предотвратит повторные отправки формы, но и любому сценарию придется выполнить первое действие Struts и получить сеанс, прежде чем он сможет его передать второму.Struts Action для отправки формы.Поскольку сайт не может установить сеанс для другого сайта, это должно предотвратить CSRF.

Если вы обычно отправляете пользователей непосредственно в JSP, не делайте этого.Вместо этого создайте новый класс, унаследованный от ActionForward, и установите его как метод execute():

public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)  throws Exception {
    saveToken(request);
    return super.execute(mapping, form, request, response);
}
...