转义 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" %>
使用<c:out value="$someString"/>
标签显示字符串。 <c:out>
转义 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】:
您还可以使用<spring:htmlEscape defaultHtmlEscape="true" />
在页面级别控制此行为
【讨论】:
看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 标签被转义,怎么处理?
spring boot jsp:java.lang.NoClassDefFoundError:org / apache / tomcat / util / security / Escape(示例代码