转义 JSP/Spring MVC 中的所有字符串

Posted

技术标签:

【中文标题】转义 JSP/Spring MVC 中的所有字符串【英文标题】:Escape all strings in JSP/Spring MVC 【发布时间】:2013-07-29 00:06:38 【问题描述】:

我以这种方式在我的 JSP 中显示字符串:

$someString

当然,这个字符串可能包含特殊的 html 字符。目前可以通过 HTML 注入恶意代码(例如,如果 someString 是 javascript 包含 - <script src...>)。

如何确保所有字符串在打印前都被转义?

我正在使用 Spring MVC 和 JSP。

【问题讨论】:

您是要执行标签还是删除标签? 可能重复:***.com/questions/4948532/… @newuser 我想转义它,所以用户将<script 视为页面中的文本。 @JoshuaMN 使用 AntySami owasp.org/index.php/Category:OWASP_AntiSamy_Project 【参考方案1】:

你可以使用JSTL core:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

使用&lt;c:out value="$someString"/&gt; 标签显示字符串。 &lt;c:out&gt; 转义 HTML 字符以避免跨站点脚本,您可以通过设置属性 escapeXml=true 来指定。另一个优点是您还可以提供默认值,以防 value 评估为 null

您也可以使用fn:escapeXml() EL 功能。您需要为此添加JSTL functions。

<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>

另一种可能的方法是构建一个自定义ELResolver。

为 EL 表达式求值启用变量和属性解析行为的自定义。

This blog 提供了一个工作示例来说明如何做到这一点。


对于整个Spring MVC应用,可以在web.xml中指定转义:

<context-param>
   <param-name>defaultHtmlEscape</param-name>
   <param-value>true</param-value>
</context-param>

但是转义仅适用于spring 标签,例如:

<form:input path="formField" htmlEscape="true" />

最后,你可以试试第三方库XSSFilter。

【讨论】:

这很好,但我必须扫描我的 JSP 中的所有输出。而且一个新人可能不知道这是正确的方法。任何自动/全局解决方案? @JoshuaMN 更新了答案! 我试图在我的表单上设置htmlEscape="true",但它没有转义脚本标签,知道为什么吗? 太棒了。有了 XSSFilter,现在就没有理由使用那个臃肿的 JSF。【参考方案2】:

您还可以使用&lt;spring:htmlEscape defaultHtmlEscape="true" /&gt;在页面级别控制此行为

【讨论】:

看NINCOMPOOP的答案。 “但是转义只适用于弹簧标签。”【参考方案3】:

在 JSP/Java 中你应该使用这个代码:

在 JSP/HTML 中:

<c:out value="TR tag </tr> Script Tag <script>alert("hello Rahul")</script>" escapeXml="true" />

【讨论】:

以上是关于转义 JSP/Spring MVC 中的所有字符串的主要内容,如果未能解决你的问题,请参考以下文章

jsp spring mvc 上传时HTTP Status 405 - Request method 'GET' not supported是啥原因

AWS Elastic Beanstalk Spring Boot fat JAR:找不到jsp

使用正则表达式转义单引号字符串中的所有双引号 [重复]

MVC4.0 我使用用 HtmlHelper类的扩展方法 html 标签被转义,怎么处理?

SpringBoot入门十 ,获取配置文件信息

spring boot jsp:java.lang.NoClassDefFoundError:org / apache / tomcat / util / security / Escape(示例代码