跳过内容

C4:编码和转义数据

该控制措施的新版本已发布!

您正在查看 OWASP 十大主动控制措施的旧版 2018 年版本。您可以在 OWASP 十大主动控制措施 2024 中的 C3:验证所有输入并处理异常 中找到相同控制措施的信息!

描述

编码和转义是旨在阻止注入攻击的防御技术。编码(通常称为“输出编码”)涉及将特殊字符转换为在目标解释器中不再危险的不同但等效的形式,例如在写入 HTML 页面时将 < 字符转换为 &lt; 字符串。转义涉及在字符/字符串之前添加特殊字符以避免其被误解,例如,在 "(双引号)字符之前添加 \ 字符,使其被解释为文本而非字符串的结束符。

输出编码最好在内容传递给目标解释器之前立即应用。如果这种防御在请求处理的早期执行,那么编码或转义可能会干扰程序其他部分对内容的使用。例如,如果您在将数据存储到数据库之前对内容进行 HTML 转义,并且 UI 自动对该数据进行第二次转义,那么由于双重转义,内容将无法正确显示。

上下文输出编码

上下文输出编码是阻止 XSS 所需的关键安全编程技术。这种防御是在构建用户界面时,在不受信任的数据动态添加到 HTML 之前的最后一刻对输出执行的。编码类型将取决于数据在文档中显示或存储的位置(或上下文)。用于构建安全用户界面的不同编码类型包括 HTML 实体编码、HTML 属性编码、JavaScript 编码和 URL 编码。

Java 编码示例

有关 OWASP Java Encoder 提供上下文输出编码的示例,请参阅:OWASP Java Encoder 项目示例

.NET 编码示例

从 .NET 4.5 开始,反跨站脚本库是框架的一部分,但默认未启用。您可以使用 web.conf 设置将此库中的 AntiXssEncoder 指定为整个应用程序的默认编码器。应用时,重要的是要对输出进行上下文编码——这意味着要使用 AntiXSSEncoder 库中适用于文档中数据相应位置的正确函数。

PHP 编码示例

Zend Framework 2

在 Zend Framework 2 中,可以使用 Zend\Escaper 进行输出编码。有关上下文编码示例,请参阅 使用 Zend-Escaper 进行上下文特定转义

其他类型的编码和注入防御

编码/转义可用于中和内容以防御其他形式的注入。例如,在将输入添加到操作系统命令时,可以中和某些特殊的元字符。这被称为“OS 命令转义”、“shell 转义”或类似名称。这种防御可用于阻止“命令注入”漏洞。

还有其他形式的转义可用于阻止注入,例如阻止各种形式的 XML 和 XML 路径注入的 XML 属性转义,以及可用于阻止各种形式的 LDAP 注入的 LDAP 识别名转义。

字符编码与规范化

Unicode 编码是一种用于存储多字节字符的方法。凡是允许输入数据的地方,都可以使用 Unicode 输入数据,以伪装恶意代码并允许各种攻击。RFC 2279 引用了许多文本编码方式。

规范化是一种系统将数据转换为简单或标准形式的方法。Web 应用程序通常使用字符规范化来确保所有内容在存储或显示时都具有相同的字符类型。

要安全地防御与规范化相关的攻击,意味着应用程序在输入格式错误的 Unicode 和其他格式错误的字符表示时也应是安全的。

防止的漏洞

参考资料

工具