Безопасность: внедрение решения против CSRF-атак в struts 1

Мне нужно реализовать решение для предотвращения CSRF-атак в приложении, основанном на инфраструктуре struts 1. В сети люди предлагают такие решения:

  • Struts saveToken (запрос) и isTokenValid (запрос, правда)
  • Библиотеки, такие как HDIV и OWASP CSRFGuard

В настоящее время я не знаю, какой из них лучше всего подходит для этой проблемы. Итак, не могли бы вы высказать свое мнение об этих решениях, чтобы направить мой выбор и, если возможно, с примером или предложить другое решение.

Спасибо за помощь


person kkung    schedule 12.11.2015    source источник


Ответы (2)


Если вас беспокоит только CSRF, а не другие проблемы безопасности OWASP, я бы посоветовал вам использовать встроенную поддержку Struts, то есть шаблон токена синхронизатора, вместо использования каких-либо внешних библиотек.

Отрывок о шаблоне синхронизатора из руководства по выживанию Struts.

Чтобы понять, как работает токен синхронизатора, необходимы некоторые сведения о встроенных функциях класса Action. Класс Action имеет метод saveToken(), логика которого следующая:

HttpSession session = request.getSession();
String token = generateToken(request);
if (token != null) {
 session.setAttribute(Globals.TRANSACTION_TOKEN_KEY, token);
}

Метод генерирует случайный токен, используя идентификатор сеанса, текущее время и MessageDigest, и сохраняет его в сеансе, используя имя ключа org.apache.struts.action.TOKEN (это значение статической переменной TRANSACTION_TOKEN_KEY в org.apache.struts). Класс .Globals. Класс Action, отображающий форму, вызывает метод saveToken() для создания атрибута сеанса с указанным выше именем. В JSP вы должны использовать токен в качестве скрытого поля формы следующим образом:

<input type="hidden"
name="<%=org.apache.struts.taglib.html.Constants.TOKEN_KEY%>"
value="<bean:write name="<%=Globals.TRANSACTION_TOKEN_KEY%>"/>">

Встроенный тег ‹bean:write>, показанный выше, ищет bean-компонент с именем org.apache.struts.action.TOKEN (который является значением Globals. TRANSACTION_TOKEN_KEY ) в области сеанса и отображает его значение как атрибут значения скрытого входная переменная. Имя скрытой входной переменной — org.apache.struts.taglib.html.TOKEN (это не что иное, как значение статической переменной TOKEN_KEY в классе org.apache.struts.taglib.html.Constants). Когда клиент отправляет форму, скрытое поле также отправляется. В действии, обрабатывающем отправку формы (которое, скорее всего, отличается от действия, обрабатывающего форму), токен в отправке формы сравнивается с токеном в сеансе с помощью метода isTokenValid(). Метод сравнивает два токена и возвращает true, если они одинаковы. Обязательно передайте reset="true" в методе isTokenValid(), чтобы удалить токен из сеанса после сравнения. Если два токена равны, форма была отправлена ​​​​в первый раз. Однако, если два токена не совпадают или в сеансе нет токена, то это дублирующая отправка и обработайте ее способом, приемлемым для ваших пользователей.

person Priyanshu    schedule 03.12.2015

С помощью HDIV вы можете предотвратить CSRF-атаки и не только это. Вы можете избежать 90% OWASP Top 10. Итак, если вы хотите разработать более безопасное программное обеспечение, я рекомендую вам использовать HDIV.

CSRFGuard — хорошая библиотека для предотвращения CSRF, но только для этого. Как вы знаете, изучение нескольких продуктов требует времени, и в этом случае более полное решение лучше, если вы можете избежать большего количества типов атак.

Насчет методов Struts saveToken и isTokenValid думаю то же самое. Это ограниченная функциональность, и я бы предпочел более законченный продукт.

person Gorka    schedule 03.12.2015