【发布时间】:2019-02-19 17:31:01
【问题描述】:
问题如何防范表单中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。
【问题讨论】:
-
您已经在这里回答了自己的问题。是的,您将使用
encodeForHTMLAttribute正是因为您指定的原因:根据属性,某人可以添加脚本事件。