JSP验证用户来自上一页

时间:2011-03-16 14:45:46

标签: java http jsp reference spoofing

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

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

然后将refhttp://myapplication.com/foo.jsp

进行比较

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

我想这是在SO之前出现过的。 谢谢

PR

2 个答案:

答案 0 :(得分: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作为键和标记作为值)。

答案 1 :(得分:0)

真正确保的唯一方法是在会话中存储“访问过的最后一页”。这样它就不会传输到客户端,或者可能被请求的负责人欺骗。

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

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