谁在调用我的HttpServletRequest?

Ste*_*eve 4 java security jquery jsp servlets

我有一个jsp包含一个jquery帖子到我的tomcat服务器上的servlet创建一个HttpServletRequest.我想确保只处理我对我的servlet的jsp调用,并且忽略源自除jsp以外的源的任何请求.是否有保证的方式来查看调用我的服务器的引用页面是什么?我已经读过使用request.getHeader("referer")可以欺骗,所以我知道我不能依赖它.

Bal*_*usC 5

生成一个唯一的字符串作为标记,将其存储在会话中并将其作为隐藏的输入值嵌入到JSP的POST形式中,并最终检查servlet是否有效.

基本上:

在会话创建时(HttpSessionListener#sessionCreated()例如):

Set<String> tokens = new HashSet<String>();
event.getSession().setAttribute("tokens", tokens);
Run Code Online (Sandbox Code Playgroud)

关于JSP请求的预处理(HttpServlet#doGet()例如):

String token = UUID.randomUUID().toString();
Set<String> tokens = (Set<String>) request.getSession().getAttribute("tokens");
tokens.add(token);
request.setAttribute("token", token);
Run Code Online (Sandbox Code Playgroud)

在处理JSP本身时:

<input type="hidden" name="token" value="${token}" />
Run Code Online (Sandbox Code Playgroud)

关于表单提交的后处理(HttpServlet#doPost()例如):

String token = request.getParameter("token");
Set<String> tokens = (Set<String>) request.getSession().getAttribute("tokens");

if (!tokens.remove(token)) {
    response.sendError(HttpServletResponse.SC_BAD_REQUEST);
    return;
}

// ...    
Run Code Online (Sandbox Code Playgroud)

我当然假设你的jQuery.post()函数是以一种不引人注目的方式编写的,$.post(form.action, form.serialize(), callback)因此它模拟了正常的同步请求(换句话说,你的表单在禁用JS的情况下工作得很好).