Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 世卫组织';What’正在调用我的HttpServletRequest?_Java_Jquery_Jsp_Servlets_Security - Fatal编程技术网

Java 世卫组织';What’正在调用我的HttpServletRequest?

Java 世卫组织';What’正在调用我的HttpServletRequest?,java,jquery,jsp,servlets,security,Java,Jquery,Jsp,Servlets,Security,我有一个jsp,其中包含一个jquery post到tomcat服务器上的一个servlet,该servlet创建了一个HttpServletRequest。我希望确保只处理jsp对servlet的调用,并且忽略来自jsp以外的源的任何请求。 有没有一种方法可以确保查看调用我的服务器的引用页面是什么?我已经读到使用request.getHeader(“referer”)可能会被欺骗,所以我知道我不能依赖它 生成一个唯一字符串作为令牌,将其存储在会话中,并将其作为隐藏输入值嵌入JSP的POST表单

我有一个jsp,其中包含一个jquery post到tomcat服务器上的一个servlet,该servlet创建了一个
HttpServletRequest
。我希望确保只处理jsp对servlet的调用,并且忽略来自jsp以外的源的任何请求。
有没有一种方法可以确保查看调用我的服务器的引用页面是什么?我已经读到使用
request.getHeader(“referer”)
可能会被欺骗,所以我知道我不能依赖它

生成一个唯一字符串作为令牌,将其存储在会话中,并将其作为隐藏输入值嵌入JSP的POST表单中,最后检查servlet中的令牌是否有效

基本上:

创建会话时(例如,在中):

在处理JSP本身时:


对表单提交进行后处理时(例如,在中):

String-token=request.getParameter(“token”);
Set tokens=(Set)request.getSession().getAttribute(“tokens”);
如果(!tokens.remove(token)){
senderError(HttpServletResponse.SC\u BAD\u请求);
返回;
}
// ...    

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

您可以向JSP呈现一个安全令牌,并将其包含在对Servlet的Ajax调用中,在那里您可以验证它。这也不能保证Ajax调用是使用浏览器和Javascript进行的,但至少需要有人在调用之前从JSP获取安全令牌


建议使用类似的概念来缓解问题。

您可以为jsp创建一个随机cookie,然后将其附加到POST表单中,并且只接受具有正确cookie值的请求。

只是一点语义。请求通常从显示JSP的浏览器创建。您不能阻止另一个程序请求您的JSP并使用您提供给他们的任何信息来再次请求

您可以阻止正在用户浏览器中查看的另一个网页执行对您站点的请求。这就是所谓的。您可以缓解这种情况


因此,CSRF解决方案可能适合您,具体取决于您试图阻止的内容。您可以从web服务器中找到预制解决方案。例如,这里是

这实际上比其他提到的解决方案更安全。Upvoting.@Perception:注意HTTP会话本身已经有了“随机cookie”的支持。@BalusC-通常是这样的(有些使用URL重写)。我的主要观点是,与嵌入HTML页面中的令牌相比,未经授权的客户端更难欺骗cookie。@感知:如果一个人知道如何欺骗会话cookie,那么欺骗另一个cookie也同样容易。@BalusC-true,但您只需执行“查看源代码”即可查看所有隐藏的输入字段。非常感谢您的回复。我必须承认我是jquery新手,所以我不确定这种方法是否适用于我的问题。在我的jsp中,我有这样的[代码]。。。var aMap={“action”:“getdata”}$.getJSON(“/MyServlet”,aMap,function(json){//dosomething with the json result});[/code]。因此,我不清楚如何传递您描述的令牌。谢谢。哦,您正在使用servlet作为Web服务。这实际上并不是你在问题中提到的“jQuery帖子”。这只是一个GET请求。这究竟是什么时候被调用的?在页面加载期间仅一次?或者多次与用户交互?很抱歉造成混淆。它实际上是基于javascript计时器(在循环中使用setTimeout方法)调用的。每隔这么多秒,就会调用“$.getJSON…”以根据返回的json对象更新jsp上的状态。然后,您可以将令牌作为JS变量进行维护,并将其作为请求参数发送(作为“aMap”的另一个属性,您在那里有)。谢谢。有没有办法从“查看源”隐藏JS变量?在jsp的java部分中定义令牌并将其传递给JS?
Set<String> tokens = new HashSet<String>();
event.getSession().setAttribute("tokens", tokens);
String token = UUID.randomUUID().toString();
Set<String> tokens = (Set<String>) request.getSession().getAttribute("tokens");
tokens.add(token);
request.setAttribute("token", token);
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;
}

// ...