Struts框架

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)完成的。

ESAPI

  1. HTML编码
    String ESAPI.encoder().encodeForHTML(string)<br />
    原理:空格,字母,数字不进行编码,如果有特殊字符在HTML中的替代品,就使用替代的方式,如引号(")可以被 &quot;替代,大于号(>)可以被&gt;替换

  2. HTML属性编码
    String ESAPI.encoder().encodeForHTMLAttribute(string)<br />
    原理与HTML编码相同,唯一不同的就是不编码空格

  3. JavaScript编码
    String ESAPI.encoder().encodeForJavaScript(String)<br />
    原理:如果是数字,字母,直接返回,如果是小于256的字符,就使用\xHH的编码方式,如果是大于256的字符则使用\uHHHHH方式编码

  4. CSS编码
    String ESAPI.encoder().encodeForCSS(String)<br />
    原理:反斜杠()加上十六进制数进行编码

  5. URL编码
    String ESAPI.encoder().encodeForURL(String)200489251863
    原理:先将字符串转换为UTF-8,对转换之后的字符串用%加上十六进制数的方式编码

源链接

Hacking more

...