在Java中转义html

我如何确保两次逃脱?

我听说它是​​一种很好的做法,可以在从表单中获取值时转义值,并在输出时转义。 这样你有两次抓住机会的机会。

我认为你正在使用JSP。

只在展示期间逃脱。 JSTL 标签非常适用。 默认情况下,它会转义HTML实体。 使用它来显示每个用户控制的输入,例如请求URL,请求标头和请求参数。

例如

 "> 

不需要在输入期间转义。 XSS不会损害原始Java代码或SQL数据库。 另一方面,您还希望在数据库中保存未修改的数据,以便您仍然可以看到用户实际输入的内容,以便您可以在必要时对邮件用户执行社交操作。

如果您想知道在输入期间要逃避什么,那将是SQL注入 。 在这种情况下,只要您想在数据库中保存任何用户控制的输入,只需使用PreparedStatement而不是常规Statement

例如

 create = connection.prepareStatement("INSERT INTO user (username, password) VALUES (?, MD5(?))"); create.setString(1, username); create.setString(2, password); create.executeUpdate(); 

在向浏览器输出内容时,您应该只进行html编码。 这可以防止XSS攻击。 在将表单中的数据插入数据库之前从表单中收集数据时所执行的转义类型不是 html编码。 它正在逃避特殊的数据库字符(最好使用参数化查询)。 其目的是防止SQL注入攻击。 所以没有双重编码。

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

这样做的另一个论点是,攻击代码可能来自两个或更多输入的应用程序。 每个输入都是无害的,但它们一起变得危险。