网络应用程序安全指南/XML 和内部数据转义
外观
在内部数据表示中也需要转义。例如,XML 中错误转义的字符串可能允许攻击者关闭其包含标签并注入任意 XML。
XML 是一种非常复杂的格式,可能会带来许多令人不快的意外。
为了防止这种类型的攻击
- 如果可能,避免使用 XML。
- 对于 XML,请使用经过良好测试的高质量库,并密切关注文档。了解您的库 - 一些库具有允许您在不知情的情况下绕过转义的功能。
- 如果您解析 (读取) XML,请确保您的解析器不会尝试加载外部引用(例如实体和 DTD)。
- 对于数据的其他内部表示,请确保应用了正确的转义或过滤。如果可能,尝试使用经过良好测试的高质量库,即使这似乎更困难。
- 如果手动进行转义,请确保它以安全的方式处理空字节、意外字符集、无效 UTF-8 字符等。
基本原理
XML 是一种非常复杂的格式,具有许多令人惊讶的功能 - 您知道 XML 可以通过 HTTP 加载其他内容吗?如果您只是想存储/传递一些结构化值,XML 的强大功能通常是不必要的。JSON 是一种不太复杂的替代方案,但 需要其自身的安全措施(例如避免顶层数组和十六进制编码可能被损坏的浏览器解释的特殊字符)。
XML 太复杂,无法“快速”编写代码来正确安全地处理所有可能性。不要依赖“自制”最小库的安全性。即使一些“官方”XML 库也被发现存在一些函数中的转义问题,或者明确允许将内容传递到 XML 中而不进行转义。(值得注意的是,PHP 的 SimpleXML 中的 addChild 方法执行部分转义,请参阅 PHP 错误 36795 的注释)库也可能包含严重问题。仔细阅读库的文档,并考虑在互联网上搜索已知问题。如果您不确定,至少快速测试一些基本情况。
XML 具有允许加载外部数据(如实体和 DTD)的功能。一些解析器默认情况下启用此功能。如果您解析不可信的 XML 文件(请记住,来自用户的任何内容都是不可信的),这可能会被用来读取本地文件,向防火墙外部无法访问的内部系统发出请求,在某些情况下甚至 执行代码。有关详细信息,请参阅 OWASP 文章。
手动进行转义非常难以做到正确,因为需要考虑所有有问题的案例(例如部分 UTF8 字符或不同的字符集)。编写一个能够正确处理正常输入的解决方案可能很快且容易,但是编写一个能够正确处理任何故意格式错误的输入的解决方案则很困难。