在我的 JSP webapp 中,我想验证用户是否来自我的特定页面,http://myapplication.com/foo.jsp
. 在进行检查的页面上,我可以这样做:
String ref = request.getHeader("referer");
然后ref
比较http://myapplication.com/foo.jsp
但是,这种验证很容易被欺骗。还有哪些其他技术可以验证客户端是否来自预期的 URL?
我想这在SO中已经出现过。谢谢
公关
让第一个 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 作为键和令牌作为值)。
真正确保的唯一方法是将“访问的最后一页”存储在会话中。这样它就不会被传输到客户端,也不会被请求的头部欺骗。
这个想法是在返回的 jsp 中,它更新当前会话中的“最后访问的页面”属性。然后在页面的早期处理中,对“最后访问的页面”属性进行检查。
当然,这在 Web 服务器之间不起作用,除非它们被配置为共享会话信息。