修复J2EE漏洞:3. XSS漏洞
字数 973 2025-08-29 08:31:47
J2EE XSS漏洞防护与编码技术详解
1. Struts框架中的XSS防护机制
1.1 Struts1的防护机制
在Struts1框架中,<bean:write>标签提供了XSS防护功能:
<%
String test="<script>alert(1)</script>";
request.setAttribute("test",test);
%>
<bean:write name="test"/></BR>
<bean:write name="test" filter="false"/>
- filter属性:默认值为
true,会将输出内容中的特殊HTML符号作为普通字符串显示 - 当
filter="false"时,会禁用HTML转义,可能导致XSS漏洞
1.2 Struts2的防护机制
在Struts2框架中,<s:property>标签默认提供XSS防护:
<s:property value="%{name}" />
标签实现的关键属性:
public class PropertyTag extends ComponentTagSupport {
private boolean escapeHtml = true; // 默认开启HTML转义
private boolean escapeJavaScript = false;
private boolean escapeXml = false;
private boolean escapeCsv = false;
// ...
}
- 底层实现依赖于
commons-lang3包中的StringEscapeUtils.escapeHtml4(String)
2. ESAPI编码技术详解
2.1 HTML编码
String ESAPI.encoder().encodeForHTML(string)
原理:
- 空格、字母、数字不进行编码
- 特殊字符使用HTML实体替代:
- 引号(
") →" - 大于号(
>) →> - 小于号(
<) →<
- 引号(
2.2 HTML属性编码
String ESAPI.encoder().encodeForHTMLAttribute(string)
原理:
- 与HTML编码基本相同
- 关键区别:不编码空格
2.3 JavaScript编码
String ESAPI.encoder().encodeForJavaScript(String)
编码规则:
- 数字、字母直接返回
- 小于256的字符 →
\xHH格式(H为十六进制) - 大于256的字符 →
\uHHHH格式
2.4 CSS编码
String ESAPI.encoder().encodeForCSS(String)
编码规则:
- 使用反斜杠(
\)加十六进制数进行编码
2.5 URL编码
String ESAPI.encoder().encodeForURL(String)
编码过程:
- 将字符串转换为UTF-8编码
- 对转换后的字符串使用
%加十六进制数的方式编码
3. 防御XSS的最佳实践
-
输出编码:根据输出上下文选择合适的编码方式
- HTML内容 →
encodeForHTML - HTML属性 →
encodeForHTMLAttribute - JavaScript →
encodeForJavaScript - CSS →
encodeForCSS - URL →
encodeForURL
- HTML内容 →
-
框架特性:
- Struts1中确保
<bean:write>的filter属性为true(默认值) - Struts2中
<s:property>默认安全,避免设置escapeHtml="false"
- Struts1中确保
-
内容安全策略(CSP):作为深度防御措施
-
输入验证:虽然不能替代输出编码,但可以作为额外防护层