如何在自定义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("<"); break; case '>': sb.append(">"); break; case '&': sb.append("&"); break; case '"': sb.append("""); break; case '\'': sb.append("'"); break; default: sb.append(c); } } return sb.toString(); }遍历用户列表时调用该方法处理login值后再输出即可。
关键注意点:所有从用户输入获取的内容,只要是通过自定义标签输出到页面的,都必须逐一转义,不能只依赖页面层的处理。
内容的提问来源于stack exchange,提问作者DoWhileFor
相关产品推荐
相关产品推荐

