如何防御表单中 JSP 属性值中存储的 XSS

How to defend against stored XSS inside a JSP attribute value in a form

问题 如何防御表单中 JSP 属性值中存储的 XSS?

初始代码就像

<form ..>
    <input value="<c:out value="${name}"/>" type="text" />
</form>

使用c:out:

<input value="<c:out value="${name}"/>" type="text" />

或esapi:encodeForHTMLAttribute?

<%@ taglib prefix="esapi" uri="http://www.owasp.org/index.php/Category:OWASP_Enterprise_Security_API" %>
<input value="<esapi:encodeForHTMLAttribute>${name}</esapi:encodeForHTMLAttribute>" type="text" />

我的第一个想法 据我所见,esapi编码是最安全的方式。当我们写一个属性的值时,我认为 c:out 不够安全。基于 Owasp cheat sheet to prevent xss 转义应该根据使用该值的上下文 - 在这种情况下为属性值来完成。 c:out 只转义 HTML 个敏感字符,因此只有这些字符:& < > " ' /.

漏洞示例:可能有人误删除了属性值周围的字符 " 或 '。页面仍然有效 HTML 并且运行良好。但是如果要插入的值属性是 something onclick=alert(1) 然后,因为 c:out 不会转义任何东西,我们将有 html <input value=something onclick=alert(1) ... 将在单击时执行 javascript。

感谢@avgvstvs 确认此方法。所以安全的方法确实是 encodeForHTMLAttribute