1

在我的 JSP webapp 中,我想验证用户是否来自我的特定页面,http://myapplication.com/foo.jsp. 在进行检查的页面上,我可以这样做:

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

然后ref比较http://myapplication.com/foo.jsp

但是,这种验证很容易被欺骗。还有哪些其他技术可以验证客户端是否来自预期的 URL?

我想这在SO中已经出现过。谢谢

公关

4

2 回答 2

1

让第一个 JSP 的预处理 servlet 生成一个唯一的令牌。

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 的预处理 servlet 与会话中的进行比较

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 作为键和令牌作为值)。

于 2011-03-16T14:52:15.670 回答
0

真正确保的唯一方法是将“访问的最后一页”存储在会话中。这样它就不会被传输到客户端,也不会被请求的头部欺骗。

这个想法是在返回的 jsp 中,它更新当前会话中的“最后访问的页面”属性。然后在页面的早期处理中,对“最后访问的页面”属性进行检查。

当然,这在 Web 服务器之间不起作用,除非它们被配置为共享会话信息。

于 2011-03-16T14:52:03.527 回答