JSP中三种编码标签写法的正确性及差异咨询
先明确前提:我们用到的标签库声明为
<%@ taglib uri="/WEB-INF/tlds/security/esapi.tld" prefix="en"%>
其中en标签库的作用是对特殊字符做安全编码,下面直接分析三种写法的对错和差异:
写法1:
<td class="input" title="<en:encodeForHTML><c:out value="${employeeName}" /></en:encodeForHTML>">
这是冗余且错误的用法。<c:out>本身就会默认转义HTML特殊字符(比如<、>、"这些),之后再套一层en:encodeForHTML就会做双重编码,最终输出的内容会被转义两次,比如原本的引号会变成&quot;,导致页面显示异常,完全没必要这么写。写法2:
<td class="input" title="<en:encodeForHTML>${employeeName}</en:encodeForHTML>">
这是正确的标准用法。直接用ESAPI的encodeForHTML标签对EL表达式取出的employeeName值做一次安全编码,既能有效防范XSS攻击,又不会出现编码过度的问题。而且title属性属于HTML属性上下文,encodeForHTML完全适配这个场景,符合ESAPI标签库的设计初衷。写法3:
<td class="input" title="<c:out value="${employeeName}" />">
这种写法只能满足基础需求,存在安全局限性。<c:out>的转义规则是JSP默认的HTML转义,虽然能处理常规特殊字符,但面对一些特殊Unicode字符、复杂的XSS攻击向量时,它的防护能力远不如专门的ESAPI标签库。在安全要求较高的系统里,这种写法存在风险。
内容的提问来源于stack exchange,提问作者RBP

