JSP проверяет пользователя с предыдущей страницы - PullRequest
1 голос
/ 16 марта 2011

В моем веб-приложении JSP я хочу проверить, что пользователь пришел с определенной моей страницы, http://myapplication.com/foo.jsp. На странице, делающей проверку, я мог сделать:

String ref = request.getHeader("referer");

Затем сравните ref с http://myapplication.com/foo.jsp

Однако, эта проверка может быть легко подделана. Какие еще методы используются для проверки того, что клиент приходит с ожидаемого URL-адреса?

Я полагаю, это уже было в SO. Спасибо

PR

Ответы [ 2 ]

1 голос
/ 16 марта 2011

Пусть сервлет предварительной обработки первого JSP сгенерирует уникальный токен.

String token = UUID.randomUUID().toString();

Сохраните его в сеансе

session.setAttribute("token", token);

Передайте его как скрытое входное значениев форме

<input type="hidden" name="token" value="${token}" />

или в качестве параметра запроса ссылки, когда вы используете ссылки вместо форм

<a href="second.jsp?token=${token}">link</a>

Позвольте сервлету предварительной обработки второго JSP сравнитьэто с тем, что в сеансе

String token = (String) session.getAttribute("token");
session.removeAttribute("token");

if (token != null && token.equals(request.getParameter("token"))) {
    // Valid, continue requesst.
} else {
    // Invalid, block request.
}

Это была базовая концепция, предполагающая один постраничный разговор.Чтобы охватить несколько страниц / вкладок браузера, вы вместо этого хотели бы использовать Set<String> или, возможно, Map<String, Set<String>> в качестве токена (с URI в качестве ключей и токенов в качестве значений).

0 голосов
/ 16 марта 2011

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

Идея состоит в том, что в возвращаемом jsp обновляется свойство "последняя посещенная страница" в текущем сеансе. Затем в начале обработки страницы, проверка на «последний Страница посещена »свойство сделано.

Конечно, это не работает между веб-серверами, если они не настроены для обмена информацией о сеансе.

...