在 Java 中转义 html

2022-09-04 08:25:45

如何确保我不会两次逃避某些内容?

我听说,在从窗体接收值时转义值,并在输出时转义值,这是一种很好的做法。这样你就有两次机会抓住一些东西。


答案 1

我假设你正在使用JSP。

仅在显示期间转义。对于JSTL<c:out>标签是完全合适的。默认情况下,它对 HTML 实体进行转义。使用它来显示每个用户控制的输入,例如请求 URL、请求标头和请求参数。

例如:

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

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

如果你想知道在输入过程中要转义什么,那就是SQL注入。在这种情况下,只要你想在数据库中保存任何用户控制的输入,就使用ReadyStatement而不是常规。Statement

例如:

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

答案 2

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