繁体   English   中英

在Java中转义html

[英]Escaping html in Java

我如何确保两次逃脱?

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

我假设您正在使用JSP。

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

例如

<input type="text" name="foo" value="<c:out value="${param.foo}" />">

不需要在输入期间转义。 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传递给浏览器并在发送之前屏蔽它。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM