Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.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 如何修复请求属性的跨站点脚本?_Java_Security_Web Applications_Servlet 3.0 - Fatal编程技术网

Java 如何修复请求属性的跨站点脚本?

Java 如何修复请求属性的跨站点脚本?,java,security,web-applications,servlet-3.0,Java,Security,Web Applications,Servlet 3.0,我正在使用Javaservlet和JSP开发一个web应用程序。我想确保我的应用程序是安全的,这就是为什么我运行了一些工具和 得到了关于跨站点脚本的报告。请查找以下代码: SampleServlet.java: String key = ExternalAuthentication.startExternalAuthentication(request); request.setAttribute("authParam", authParam); out.write("<!D

我正在使用Javaservlet和JSP开发一个web应用程序。我想确保我的应用程序是安全的,这就是为什么我运行了一些工具和 得到了关于跨站点脚本的报告。请查找以下代码:

SampleServlet.java:

String key = ExternalAuthentication.startExternalAuthentication(request);
request.setAttribute("authParam", authParam);       
out.write("<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\"> \n");
        out.write("<html><body onload=\"document.forms[0].submit()\">\n");
        out.write("<form method=\"POST\" action=\"" + request.getContextPath() + targetPage + "\">\n");
        out.write("<input type=\"hidden\" name=\"actionUrl\" value=\"" + actionUrlBuilder.toString() + "\"/>\n");
        out.write("<input type=\"hidden\" name=\"authParam\" value=\"" + request.getAttribute("authParam") + "\"/>\n");
        out.write("</form>\n</body>\n</html>\n");

The above `setAttribute` will be used in JSP by saying 
有人能建议如何修复它吗?在设置到请求中之前,是否需要对
authParam
值进行编码

我们将此作为输入隐藏变量并显示jsp页面(登录)

请尝试使用以下任一选项:

  • c:out:
  • JSTL EL-fn:escapeXml方法:
    ${fn:escapeXml(authParam)}
这两种转义数据都是上下文或上下文的转义数据。值
authParam
将首先从JSP页面范围中搜索,然后从请求属性中搜索。如果只想搜索请求属性,请在前面加上
requestScope
,例如
requestScope.authParam
,以防在页面范围中设置变量


然而,你的问题是重复的。我没有足够的重复次数来进行标记。

设置并从请求中获取属性永远不会导致任何XSS问题。重要的是你对属性做了什么,我们无法从你发布的内容中知道这一点。我们唯一可以推断的是,JSP中有Java代码,这本身就是一种不好的做法。请注意注释(来自工具的注释),如“它将污染数据作为请求属性保存”。让我们做一个汽车类比。如果你在路上用汽车做傻事,它可能有潜在的危险,对吧。所有的工具都在告诉你,现在是“当心:你在车库里存放了一辆车”。这根本不是问题。当你开始在路上开车时,问题可能会出现。留下类比:当您开始在JSP生成的HTML中使用authParam(如打印它)执行某些操作时,问题可能会出现。但是,因为我们不知道您在使用authParam做什么,所以我们什么也说不出来。您好@JBNizet,很抱歉不完整的详细信息,我们不会在任何地方打印authParam,在将请求设置为属性后,我们将此作为输入隐藏变量并显示jsp页面(登录)当用户输入详细信息并通过相同的jsp页面(登录)提交到服务器时,我们需要相同的authParam。请让我知道,如果你仍然不清楚如果你使用它作为一个隐藏的输入值,你是打印在生成的HTML。仅仅因为用户在浏览器中看不到它并不意味着它不是HTML的一部分。你知道什么是XSS攻击吗?为什么不发布相关的代码呢?我在servlet中编写jsp代码,只是在上面显示的代码中使用PrintWriter,我应该在servletOK中使用EL吗?我误解了。您需要使用转义/编码库。您当前正在将数据输出到HTML双引号属性中。这些应该是有效的:,
// I am referring to the request attributes that have been contaminated. - comment from tool
//for context HTML double quoted is not properly sanitized for attribute, request.getAttribute ( "authParam" ) linked to an
//HTML page of There is a risk that lead to cross-site scripting - comment from tool
request.getAttribute("authParam");