Безопасность веб-приложения Java: добавление токенов в запросы - PullRequest
0 голосов
/ 07 января 2010

Я ищу метод или текущий API, который позволяет добавлять токены в запросы веб-приложений. Может быть, в течение сессии, но не сохраняется. Или, если вы могли бы помочь мне, наметив эффективный метод для этого

например.

1. GET request => Сервлет генерирует токен и печатает его в представлении

2. возвращает представление со скрытым токеном

<input type="hidden" name="token" value="UA37jdjs9UDJS3">
<input type="submit" name="deleteEmail" value="Delete">

3. Форма запроса POST => отправляется и проверяет, совпадает ли токен.

Несколько вещей, на которые следует обратить внимание: если есть запросы Ajax, некоторые другие токены должны быть активны для ряда запросов.

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

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

Но как лучше внедрить подобную систему,

Есть ли у Spring Security 3 система, которую я могу использовать?

в областях Java, Grails, Spring MVC, Spring Security 3 и Hibernate

Ответы [ 5 ]

2 голосов
/ 08 января 2010

Посмотрите на проект HDIV на http://www.hdiv.org/. Они делают именно это. Даже если вы не используете код проекта HDIV, информация, содержащаяся в нем, может дать вам возможность сделать это самостоятельно. Для меня было хорошим руководством узнать о том, как обращаться с токенами для таких вещей, как CSRF, и для других целей, таких как двойные элементы управления.

1 голос
/ 12 января 2010

Вы взглянули на "Шаблон токена синхронизатора" в документации Grails на http://grails.org/doc/1.2.0/guide/single.html?

1 голос
/ 07 января 2010

Почему бы просто не использовать session_id, который веб-контейнер генерирует для вас, когда вы вызываете request.getSession () ?

Если вы хотите создать свой собственный «токен», вы можете проверить Cookies. Cookie - это пара ключ-значение, отправляемая в виде заголовка HTTP веб-сервером веб-браузеру, а затем отправляемая браузером обратно без изменений при каждом доступе к этому серверу.

Для создания файла cookie в сервлете вы можете использовать:

public void doGet ( HttpServletRequest request, HttpServletResponse response )
     throws ServletException, IOException {
  // Create a cookie
  Cookie c1 = new Cookie("yourdomain.token","the value");
  response.addCookie(c1);
 //build your response

}

Файл cookie будет автоматически включен в следующий http-запрос. Вы можете прочитать его обратно:

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Cookie[] cookies = request.getCookies();
//build your response
}
1 голос
/ 07 января 2010

Первой мыслью было, что вы можете просто использовать уже сгенерированный идентификатор сессии. Но если вы пытаетесь форкнуть состояние, я бы предложил использовать что-то вроде модель разговора швов

0 голосов
/ 07 января 2010

Я недавно столкнулся с вариантом использования для этого.

Если в браузере присутствовало старое окно приложения, и ссылка входа в систему была нажата в другом окне браузера, действие входа в систему сначала создало новый сеанс, а затем было перенаправлено в окно приложения. Это вызвало метод метода onunload старого окна, в результате чего на сервер вышел запрос на выход из системы нового пользователя.

Полагаться на событие javascript onunload для выхода из системы мне кажется немного дерьмовым, но это не может быть изменено, поэтому мы решили сделать так, как предложил OP, и добавили токен в каждом отображаемом виде, проверяя его для каждого запроса. Это останавливает запрос на выход из onunload от завершения нового сеанса.

Что касается лучшего способа, я бы сказал, что это довольно просто. Например, вы можете использовать http://java.sun.com/j2se/1.5.0/docs/api/java/util/UUID.html для генерации уникальных ключей. Если вы используете инфраструктуру на основе компонентов, такую ​​как Tapestry, JSF или Wicket, возможно, существует более высокоуровневый способ решения этой проблемы.

Это похоже на ваш вариант использования? Или вы пытаетесь достичь чего-то совершенно другого?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...