为什么 web 模板框架 HTML 默认不转义所有数据?

信息安全 网页浏览器 xss javascript html
2021-09-03 21:24:08

我最近在使用 JSP 呈现页面的应用程序中发现了一个 XSS 漏洞。JSP 中的易受攻击代码如下所示:

<td>${customer.notes}</td>

通过转义用户控制的输入来修复它,生成的代码如下所示:

<td><c:out value="${customer.notes}"/></td>

JSP 和我使用过的其他模板框架始终默认仅在特别请求时转义动态数据,并且默认情况下不转义。

与此相反显然是一个更安全的默认值,即。所有动态数据都被转义,除非你明确告诉框架不要。

有没有以这种方式工作的框架?改变未来的框架以这种方式运行是否存在重大问题?显然,您会承担转义数据的开销,这些数据可能不一定是用户控制的,但如果遇到性能问题,您可以在安全的地方禁用它。有什么我想念的吗?

1个回答

有没有以这种方式工作的框架?

当然。Twig 或 Django 就是两个例子。

与此相反显然是一个更安全的默认值,即。所有动态数据都被转义,除非你明确告诉框架不要。

是的,这更安全。

有什么我想念的吗?

一个缺点是 XSS 是上下文相关的。默认编码可能不够[*],因此可能会导致错误的安全感。

另一方面,只有 HTML-encoding ', ", <, and>将捕获绝大多数 XSS 漏洞,所以我想说默认编码并提供一个选项以在需要时默认禁用编码总是一个好主意。

为什么 web 模板框架 HTML 默认不转义所有数据?

例如,JSP 是从 1999 年开始的。XSS 直到 2000 年才被称为 XSS。我的感觉是较新的引擎更有可能默认编码,因为 XSS 的突出性更高,并且更加关注安全性(默认情况下) . 较旧的引擎可能不想破坏向后兼容性,因此不会改变现有行为。

[*] 非常简单的例子:<script>var x = foo.[USERINPUT]();</script>.