Подтвердить что ты не робот

Предотвращение подделки на основе межсайтового запроса с использованием маркера struts

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

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

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

4b9b3361

Ответ 1

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

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

Выполнение этого не только предотвратит дублирование форм, но любой script должен будет нажать первое действие Struts и получить сеанс, прежде чем он сможет отправить на второе действие Struts, чтобы отправить форму. Поскольку сайт не может установить сеанс для другого сайта, это должно предотвратить 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);
}