You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在自定义JSP标签处理器中转义值防范XSS攻击?

在JSP自定义标签处理器中实现XSS转义的方法

你之前在页面用<c:out>或fn:escapeXml()没生效,核心原因是自定义标签<custom:userList>是通过Java代码(UserList.java)直接向页面输出内容,绕过了页面层的转义处理。必须在标签处理器内部对要输出的敏感值(比如login)做转义,以下是几种可行方案:

  • 使用Apache Commons Text工具类
    若项目已引入commons-text依赖,直接用StringEscapeUtils做HTML转义:

    @Override
    public int doStartTag() throws JspException {
        List<User> userList = (List<User>) pageContext.getAttribute("userList");
        JspWriter out = pageContext.getOut();
        try {
            for (User user : userList) {
                // 对login值进行HTML转义
                String escapedLogin = StringEscapeUtils.escapeHtml4(user.getLogin());
                // 输出转义后的内容
                out.write("<div>" + escapedLogin + "</div>");
            }
        } catch (IOException e) {
            throw new JspException("输出用户列表失败", e);
        }
        return SKIP_BODY;
    }
    
  • 使用JSP内置XmlUtil类
    Java EE环境下可直接用javax.servlet.jsp.util.XmlUtil的转义方法,无需额外依赖:

    String rawLogin = user.getLogin();
    String escapedLogin = XmlUtil.escapeXml(rawLogin);
    out.write(escapedLogin);
    
  • 手动实现转义逻辑
    不想引入外部依赖的话,自己写一个简单的HTML特殊字符转义方法:

    private String escapeHtml(String input) {
        if (input == null) return "";
        StringBuilder sb = new StringBuilder(input.length());
        for (char c : input.toCharArray()) {
            switch (c) {
                case '<': sb.append("&lt;"); break;
                case '>': sb.append("&gt;"); break;
                case '&': sb.append("&amp;"); break;
                case '"': sb.append("&quot;"); break;
                case '\'': sb.append("&#39;"); break;
                default: sb.append(c);
            }
        }
        return sb.toString();
    }
    

    遍历用户列表时调用该方法处理login值后再输出即可。

关键注意点:所有从用户输入获取的内容,只要是通过自定义标签输出到页面的,都必须逐一转义,不能只依赖页面层的处理。

内容的提问来源于stack exchange,提问作者DoWhileFor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 08:17:24