【发布时间】:2016-02-13 11:03:26
【问题描述】:
我正在使用 java servlet 和 jsps 开发一个 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
在jsp中:
// 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");
谁能建议如何解决它?在设置到请求之前是否需要对authParam 值进行编码?
【问题讨论】:
-
设置和获取请求的属性永远不会导致任何 XSS 问题。重要的是您对该属性所做的事情,而我们无法从您发布的内容中知道这一点。我们唯一可以推断的是,您的 JSP 中有 Java 代码,这本身就是一种不好的做法。
-
你好@JBNizet,谢谢你的建议。请注意 cmets(cmets from tool),例如“它将污染数据作为请求属性”。
-
让我们做一个汽车类比。如果你在路上用它做愚蠢的事情,汽车可能会很危险,对吧。所有工具都在告诉您,现在是“当心:您将汽车存放在车库中”。这根本不是问题。当您开始在路上驾驶汽车时,问题可能会出现。打个比方:当您开始使用 authParam 在 JSP 生成的 HTML 中打印它时,问题可能会出现。但由于我们不知道您在使用 authParam 做什么,因此我们无法提供任何信息。
-
嗨@JBNizet,抱歉细节不完整,我们不会在任何地方打印 authParam,在将请求设置为属性后,我们会将其作为输入隐藏变量并显示 jsp 页面(登录)和当用户输入详细信息并通过相同的 jsp 页面(登录)提交到服务器时,我们需要相同的 authParam。如果您仍然不清楚,请告诉我
-
如果您将其用作隐藏的输入值,您将在生成的 HTML 中打印它。仅仅因为用户在浏览器中看不到它并不意味着它不是 HTML 的一部分。你了解什么是 XSS 攻击吗?为什么不贴出相关代码?
标签: java security web-applications servlet-3.0