struts1中的<bean:write>
标签:该标签中有个属性filter默认值为true,会将输出内容中的特殊HTML符号作为普通字符串来显示
<%
String test="<script>alert(1)</script>";
request.serAttribute("test",test);
%>
<bean:write name="test"/></BR>
<bean:write name="test" filter="false"/>
struts2中的<s:property>
标签:该标签默认情况下,会自动进行html编码
<s:property value="%{name}" />
该标签部份源码如下:
public class PropertyTag extends ComponentTagSupport {
private static final long serialVersionUID = 435308349113743852L;
private String defaultValue;
private String value;
private boolean escapeHtml = true;
private boolean escapeJavaScript = false;
private boolean escapeXml = false;
private boolean escapeCsv = false;
public Component getBean(ValueStack stack, HttpServletRequest req, HttpServletResponse res) {
return new Property(stack);
}
protected void populateParams() {
super.populateParams();
Property tag = (Property) component;
tag.setDefault(defaultValue);
tag.setValue(value);
tag.setEscape(escapeHtml);
tag.setEscapeJavaScript(escapeJavaScript);
tag.setEscapeXml(escapeXml);
tag.setEscapeCsv(escapeCsv);
}
最底层的实现是依赖于commons-lang3包中的StringEscapeUtils.escapeHtml4(String)
完成的。
HTML编码
String ESAPI.encoder().encodeForHTML(string)<br />
原理:空格,字母,数字不进行编码,如果有特殊字符在HTML中的替代品,就使用替代的方式,如引号(")可以被 "
替代,大于号(>)可以被>
替换
HTML属性编码
String ESAPI.encoder().encodeForHTMLAttribute(string)<br />
原理与HTML编码相同,唯一不同的就是不编码空格
JavaScript编码
String ESAPI.encoder().encodeForJavaScript(String)<br />
原理:如果是数字,字母,直接返回,如果是小于256的字符,就使用\xHH的编码方式,如果是大于256的字符则使用\uHHHHH方式编码
CSS编码
String ESAPI.encoder().encodeForCSS(String)<br />
原理:反斜杠()加上十六进制数进行编码
URL编码
String ESAPI.encoder().encodeForURL(String)200489251863
原理:先将字符串转换为UTF-8,对转换之后的字符串用%加上十六进制数的方式编码