保存数据和显示时如何防御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&lt;def.

问题是当用户在不更改值的情况下提交此表单时,服务器收到值abc&lt;def而不是页面中可见的值[=15] =].所以这是不正确的。这种情况下应该如何实现保护?

The problem is when the user submits this form without changing the values, the server receives the value abc&lt;def instead of what is visible in the page abc

简单。在这种情况下 HTML 解码值,然后验证。

尽管如一些评论所述,您应该了解我们如何使用 OWASP ESAPI-Java project。默认情况下,我们总是规范化数据,这意味着我们 运行 一系列解码器来检测 multiple/mixed 编码,并创建一个安全的字符串以使用正则表达式进行验证。

然而,对于真正保证保护的部分,您通常希望将原始文本存储在服务器上——而不是包含 HTML 个字符的任何内容,因此您 可能 希望存储未转义的字符串,只要您可以在将其发送回用户时安全地对其进行编码即可。

编码是 XSS 的最佳 保护,如果出于某种原因必须选择,我实际上会在输入验证之前推荐它。

我说 可能 因为我认为通常存储更改后的数据是一种不好的做法。它可以使故障排除成为一件苦差事。如果您使用的是浏览器中的富文本编辑器 TinyMCE 之类的技术,这可能会更加复杂。它还呈现 html ,所以它就像在浏览器中处理浏览器一样。