Java中的转义html

Java中的转义html,java,jsp,xss,escaping,Java,Jsp,Xss,Escaping,我如何确保我不会两次逃脱 我听说在从表单接收值时转义值是一种很好的做法,在输出值时也转义值。这样,您就有两次机会捕获某些内容。当您将某些内容输出到浏览器时,您应该只对其进行html编码。这可以防止XSS攻击。在将表单插入数据库之前,从表单收集数据时所做的转义不是html编码。它转义特殊的数据库字符(最好使用参数化查询)。其目的是防止SQL注入攻击。因此,不存在双重编码。我假定您使用的是JSP 仅在显示期间退出。有一个标签是完全合适的。默认情况下,它会转义HTML实体。使用它来显示每个用户控制的输

我如何确保我不会两次逃脱


我听说在从表单接收值时转义值是一种很好的做法,在输出值时也转义值。这样,您就有两次机会捕获某些内容。

当您将某些内容输出到浏览器时,您应该只对其进行html编码。这可以防止XSS攻击。在将表单插入数据库之前,从表单收集数据时所做的转义不是html编码。它转义特殊的数据库字符(最好使用参数化查询)。其目的是防止SQL注入攻击。因此,不存在双重编码。

我假定您使用的是JSP

仅在显示期间退出。有一个标签是完全合适的。默认情况下,它会转义HTML实体。使用它来显示每个用户控制的输入,例如请求URL、请求头和请求参数

例如


在一个上下文中无害的内容在另一个上下文中可能是危险的。避免注入攻击的最佳方法是在将内容传递到另一个上下文之前准备内容。在您的情况下,html文本在传递到浏览器时会更改其上下文。服务器不呈现html,但浏览器呈现。因此,在发送之前,请确保不向浏览器传递恶意html并屏蔽它


这样做的另一个理由是,攻击代码可能是由两个或多个输入在应用程序中组装而成的。每一个输入都是无害的,但它们加在一起可能会变得危险。

Joel Spolsky的《使代码看起来错误》一文正是关于这类问题的。我真的很喜欢那篇文章:)我现在确信,在显示过程中,我只需逃跑。我想知道为什么Spring在表单中有
defaultHtmlEscape
?这不是默认设置“htmlescape”的选项吗。。。htmlescape意味着它将把值写入最终的html表单中?通常的做法是仅在显示/输出过程中对其进行转义。您不想弄乱输入数据。Spring的
defaultHtmlEscape
只是一个全局设置,使所有Spring MVC表单标记的行为类似于JSTL
c:out
does:escaping HTML实体。我不使用Spring MVC,但我认为它默认为“true”,就像
c:out
escapeXml
属性一样。这确实是一个适当的时间问题。仅当您实际需要时(即,在从一个上下文传递到另一个上下文的过程中,它可能变得恶意)才进行转义。不幸的是,你所说的在糟糕的项目中是可以识别的。您所能做的最好的事情是检查整个代码并删除任何不必要/错误的转义。祝你好运。这个标签不太合适。它将全部转义5个字符,而OWASP用户将列出更多应转义的5个字符。我不相信c:out,我也不推荐使用它。
<input type="text" name="foo" value="<c:out value="${param.foo}" />">
create = connection.prepareStatement("INSERT INTO user (username, password) VALUES (?, MD5(?))");
create.setString(1, username);
create.setString(2, password);
create.executeUpdate();