【问题标题】:How to fix Cross-site scripting for request attributes?如何修复请求属性的跨站点脚本?
【发布时间】: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


【解决方案1】:

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

尝试使用以下任一方法:

  • c:out : &lt;c:out value="${authParam}" /&gt;
  • JSTL EL fn:escapeXml 方法:${fn:escapeXml(authParam)}

data state 上下文或 HTML double-quoted attribute 上下文的这两种转义数据。值 authParam 将首先从 JSP 页面范围内搜索,然后是请求属性。如果您只想搜索请求属性,请以requestScope为前缀,例如requestScope.authParam,以防您还在页面范围内设置了变量。

但是,您的问题与this question 重复。我没有足够的代表来标记。

【讨论】:

  • 我在上面显示的代码中只使用 PrintWriter 在 servlet 中编写 jsp 代码,我应该在 servlet 中使用 EL
  • 好吧,我误会了。您需要使用转义/编码库。您当前正在将数据输出到 HTML 双引号属性中。这些应该可以工作:Spring HtmlUtils.htmlEscapeCoverity Escape.htmlOWASP ESAPI
猜你喜欢
  • 1970-01-01
  • 2018-05-25
  • 1970-01-01
  • 1970-01-01
  • 2011-02-16
  • 1970-01-01
  • 2020-09-20
  • 2018-06-14
  • 2013-01-02
相关资源
最近更新 更多