如何清理 HttpServletRequest 中 getCookies()、getRequestURL() 的返回值?

Posted

技术标签:

【中文标题】如何清理 HttpServletRequest 中 getCookies()、getRequestURL() 的返回值?【英文标题】:how to sanitize the return values of getCookies(), getRequestURL() in HttpServletRequest? 【发布时间】:2012-03-05 16:46:25 【问题描述】:

在我的 Java EE 项目中,我在 web.xml 文件中设置了一个过滤器,它将使用 Class MyHttpServeltRequestWrapper (extends HttpServletRequestWrapper)。我正在覆盖其中的方法 getParameter/getParametervalues 方法,以防止任何 XSS 攻击。

我正在对参数值执行 html 转义。

有人可以告诉我重新定义方法是否是个好主意

getRequestURL(), getRequestURI(), getQueryString(), getCookies() 放入 XSS 预防逻辑的方法。

我可以在getRequestURL()getRequestURI()getQueryString() 返回的值上使用URLEncoder 吗?

那么 getCookies 方法呢?如果我不清理我的 getcookies() 方法,它会以何种方式使我的页面容易受到攻击?

【问题讨论】:

【参考方案1】:

您在 XSS 预防方面走错了路。 XSS 不会损害服务器端代码。它只会损害生成的 HTML 输出。如果您在现有 HTML 源代码中内联用户控制的输入未转义,以便浏览器将其解释为真实 HTML 源代码的一部分,则会造成伤害。您需要将<> 等 HTML 特殊字符替换为<> 等,以便它们按原样显示。

仅在视图端 (JSP) 中执行。只需在重新显示用户控制输入的任何地方使用 JSTL <c:out>fn:escapeXml()。它们将转义 HTML 特殊字符。

例如

<c:out value="$someBean.someUserControlledValue" />
<c:out value="$cookie.cookiename" />
<c:out value="$header.headername" />
<c:out value="$param.paramname" />
<input type="text" name="foo" value="$fn:escapeXml(param.foo)" />

另见:

XSS prevention in JSP/Servlet web application

【讨论】:

但是在一些jsp页面使用的Java类中,我需要使用getQueryString()方法,对此我无法进行转义。对于某些情况,我该怎么办,例如.. out.println("somesite.com" + request.getQueryString() + "\">");你认为 URLEncoder.encode(request.getQueryString(), "UTF-8") 是个好主意吗?它会正常工作吗?如果我在 java 代码的某处使用 getCookies() 方法,请建议我可以做什么。 您需要编写一个帮助方法来转义 HTML 特殊字符,以便您可以执行例如out.println("&lt;a href=\"somesite.com/"; + escape(request.getQueryString()) + "\"&gt;");。但是,首先,这个应用程序显然从一开始就设计得很糟糕。 Java 代码不属于 JSP 文件,HTML 代码也不属于 Java 类。另请参阅 ***.com/questions/3177733/… 以了解如何正确设计它。

以上是关于如何清理 HttpServletRequest 中 getCookies()、getRequestURL() 的返回值?的主要内容,如果未能解决你的问题,请参考以下文章

server中HttpServletRequest如何获得json中的数据?

如何在 @service 类中获取 HttpServletRequest 对象

如何在一个类中获取HttpServletRequest 对象

Spring:如何将 HttpServletRequest 注入到请求范围的 bean 中?

如何在我的 spring bean 中获取 HttpServletRequest?

如何获取httpservletrequest