Web 应用程序安全指南/XML、JSON 和通用 API 安全
API 可能带来额外的安全挑战。同时,不能忽视基本的安全规则(如输出转义)。
为了防止这种类型的攻击
- 确保对 API 进行适当的访问控制
- 不要忘记你需要正确转义所有输出以防止 XSS 攻击,像 XML 这样的数据格式需要特别考虑,并且在许多情况下需要针对跨站请求伪造 (CSRF)的保护。
- 使用具有经过验证的库的标准数据格式,例如 JSON,并正确使用它们。这可能会满足您所有转义需求。
- 确保浏览器不会错误地解释您的文档或允许跨站点加载
- 确保您的文档格式正确
- 发送正确的 Content-Type
- 使用
X-Content-Type-Options: nosniff
标头 - 对于 XML,提供字符集并确保攻击者无法插入任意标签
- 对于 JSON,确保顶级数据结构是对象,并且所有在 HTML 中具有特殊意义的字符都已转义
基本原理
某些操作通常仅限于具有适当权限的用户。但是,一些开发人员忘记适当地限制他们的 API,从而允许没有适当权限的用户执行这些操作。确保 API 适当地执行访问控制。请记住,您仍然需要 CSRF 保护!一个单独的客户端可以轻松地获取令牌(但需要用户的凭据才能这样做),而恶意 JavaScript 却不能(由于同源策略)。
即使您的应用程序未显示 API 输出,攻击者也可以通过直接链接到它来利用它进行 XSS 攻击。为此,您必须遵循适当的转义规则 *并* 阻止浏览器错误地解释您的输出。
如果您使用标准数据格式,例如 JSON,您可以使用经过许多专业人员彻底检查的标准库。这将使您更容易正确地转义内容,并节省您大量时间(和潜在的安全问题)。
某些浏览器喜欢将任何看起来像是 HTML 的内容都解释为 HTML。对于 XML 文档(它也可能表示其他带脚本的格式,如 SVG)尤其如此。发送格式正确的文档并设置正确的 Content-Type 使浏览器猜测的可能性降低。X-Content-Type-Options: nosniff
标头将阻止浏览器尝试猜测 Content-Type(最重要的是,它将禁用 Internet Explorer 中的积极猜测)。
在 XML 中提供正确的字符集非常重要,因为不同的字符集会导致对数据的完全不同的解释。例如,在 UTF-8 或其他常见字符集中无害的文本可以在 UTF-7 中变成脚本标签。
JSON 使用 JavaScript 语法,可能使用 <script>
标签跨域边界加载。结合对 Array 原型的创造性修改,这可以在过时的浏览器中访问数据(绕过同源策略)。传递对象而不是数组可以防止这种情况(截至 2013 年)。
建议对 JSON 中的特殊字符进行转义,以避免内容嗅探。在 PHP 中,可以通过将 JSON_HEX_TAG
标志传递给 json_encode
来实现这一点。