保存数据和显示时如何防御xss
How to defend against xss when saving data and when displaying it
假设我有一个简单的 CRUD 应用程序,其中包含一个用于添加新对象和编辑现有对象的表单。从安全的角度来看,我想防御跨站点脚本。拳头我会验证服务器上提交的数据的输入。但在那之后,我会转义视图中显示的值,因为我的数据库中可能有多个应用程序写入(某些开发人员将来会错误地在数据库中插入未经验证的数据)。所以我要这个 jsp:
<%@ taglib prefix="esapi" uri="http://www.owasp.org/index.php/Category:OWASP_Enterprise_Security_API" %>
<form ...>
<input name="myField" value="<esapi:encodeForHTMLAttribute>${myField}</esapi:encodeForHTMLAttribute>" />
</form>
<esapi:encodeForHTMLAttribute>
与 <c:out>
做几乎相同的事情,它 HTML 转义 < > "
等敏感字符
现在,如果我加载一个以某种方式保存在数据库中的对象 myfield=abc<def
,输入将正确显示值 abc<def
,而后面的 html 中的值将是abc<def
.
问题是当用户在不更改值的情况下提交此表单时,服务器收到值abc<def
而不是页面中可见的值[=15] =].所以这是不正确的。这种情况下应该如何实现保护?
The problem is when the user submits this form without changing the values, the server receives the value abc<def
instead of what is visible in the page abc
简单。在这种情况下 HTML 解码值,然后验证。
尽管如一些评论所述,您应该了解我们如何使用 OWASP ESAPI-Java project。默认情况下,我们总是规范化数据,这意味着我们 运行 一系列解码器来检测 multiple/mixed 编码,并创建一个安全的字符串以使用正则表达式进行验证。
然而,对于真正保证保护的部分,您通常希望将原始文本存储在服务器上——而不是包含 HTML 个字符的任何内容,因此您 可能 希望存储未转义的字符串,只要您可以在将其发送回用户时安全地对其进行编码即可。
编码是 XSS 的最佳 保护,如果出于某种原因必须选择,我实际上会在输入验证之前推荐它。
我说 可能 因为我认为通常存储更改后的数据是一种不好的做法。它可以使故障排除成为一件苦差事。如果您使用的是浏览器中的富文本编辑器 TinyMCE 之类的技术,这可能会更加复杂。它还呈现 html ,所以它就像在浏览器中处理浏览器一样。
假设我有一个简单的 CRUD 应用程序,其中包含一个用于添加新对象和编辑现有对象的表单。从安全的角度来看,我想防御跨站点脚本。拳头我会验证服务器上提交的数据的输入。但在那之后,我会转义视图中显示的值,因为我的数据库中可能有多个应用程序写入(某些开发人员将来会错误地在数据库中插入未经验证的数据)。所以我要这个 jsp:
<%@ taglib prefix="esapi" uri="http://www.owasp.org/index.php/Category:OWASP_Enterprise_Security_API" %>
<form ...>
<input name="myField" value="<esapi:encodeForHTMLAttribute>${myField}</esapi:encodeForHTMLAttribute>" />
</form>
<esapi:encodeForHTMLAttribute>
与 <c:out>
做几乎相同的事情,它 HTML 转义 < > "
等敏感字符
现在,如果我加载一个以某种方式保存在数据库中的对象 myfield=abc<def
,输入将正确显示值 abc<def
,而后面的 html 中的值将是abc<def
.
问题是当用户在不更改值的情况下提交此表单时,服务器收到值abc<def
而不是页面中可见的值[=15] =].所以这是不正确的。这种情况下应该如何实现保护?
The problem is when the user submits this form without changing the values, the server receives the value
abc<def
instead of what is visible in the page abc
简单。在这种情况下 HTML 解码值,然后验证。
尽管如一些评论所述,您应该了解我们如何使用 OWASP ESAPI-Java project。默认情况下,我们总是规范化数据,这意味着我们 运行 一系列解码器来检测 multiple/mixed 编码,并创建一个安全的字符串以使用正则表达式进行验证。
然而,对于真正保证保护的部分,您通常希望将原始文本存储在服务器上——而不是包含 HTML 个字符的任何内容,因此您 可能 希望存储未转义的字符串,只要您可以在将其发送回用户时安全地对其进行编码即可。
编码是 XSS 的最佳 保护,如果出于某种原因必须选择,我实际上会在输入验证之前推荐它。
我说 可能 因为我认为通常存储更改后的数据是一种不好的做法。它可以使故障排除成为一件苦差事。如果您使用的是浏览器中的富文本编辑器 TinyMCE 之类的技术,这可能会更加复杂。它还呈现 html ,所以它就像在浏览器中处理浏览器一样。