如何保护从 Angular 和非 Angular 客户端使用的服务免受 XSS 攻击
How to secure from XSS for services consumed from Angular and non-Angular clients
此问题适用于使用 Angular UI (v8.2.14) 调用 Spring/Java 服务的应用。我试图弄清楚如何以最有效的方式避免 XSS 漏洞,但似乎存在一些矛盾的问题。下面举例说明:
Java 服务将 return 此字符串作为响应的一部分:“John & Terri”。
我们使用 Checkmarx 扫描 XSS 漏洞并转向 Contrast。两者都报告在响应中 returning 字符串之前应该对其进行清理和转义。所以我在 returning 之前做了以下事情:
String stringForResponse = StringEscapeUtils.escapeHtml("John & Terri"); //使用apache公共库。
安全扫描现在对服务器端 java 代码感到满意。
Angular 现在将字符串显示为“John & Terri”。 Angular 文档中的一些研究表明 Angular 会为我们进行消毒和转义,除非我们告诉它不要这样做。因此,字符串似乎被转义了两次,然后浏览器“取消转义”了一次,因此我们得到的不是“&”而是“&”显示。 (当然,这将适用于通过字符串 util 方法转义的任何其他字符。
我们可以通过在 UI 代码中使用以下代码来解决这个问题,它告诉 Angular 你已经完成了 sanitize/escaping 和 Angular 不应该重复它:
domSanitizer.bypassSecurityTrustHtml(variableThatIsDisplayedInUI);
这有效并且“John&Terri”正确显示。但是,对于在整个应用程序中将其作为我们的 XSS 方法实施,我有以下担忧:
一个。这是很多工作只是为了让安全扫描器开心,而 Angular 已经在处理 XSS 问题了。
B. Angular 文档警告这应该很少用于特殊情况。我将其翻译为“Angular 是稳定的,并且我们所有使用该框架的人都对其进行了很好的测试。怀疑你的 XSS 代码是否会如此彻底。”我同意这种观点。
C. 但是,我们的一些服务也被 Angular 框架以外的 HTTP 客户端使用。因此,如果我们不能相信那些其他客户会清理我们的响应,那么听起来我们应该清理响应中的所有内容。
建议的解决方案:
我唯一能想到的满足所有这些约束的方法是为后端 Java 服务提供两组端点:
- 一组端点仅供 angular UI 使用。我们不会逃避这些端点的响应并依赖 Angular 来处理它。
- 服务的所有其他消费者的一组端点。这些端点中的每一个的逻辑将调用相应的“angular only”端点,然后在 returning 响应之前从它获取响应并转义其所有字符串字段。
当然,当代码扫描器报告我们指定供 Angular-UI 使用的端点的 XSS 问题时,我们只需要忽略它们即可。
对于我们提出的解决方案或任何替代方案,我将不胜感激。谢谢!
不要专门为 Angular 应用创建单独的 API
如果资源返回转义字符,UI 始终可以使用 [innerHtml]
来呈现此文本。 Angular 将通过删除任何脚本或潜在危险字符来清理传递给 innerHtml
的数据,但它会允许 HTML 字符实体引用,例如 &
<span [innerHtml]="responseText"></span>
如果 Angular 的清理过程 escaped/removed 需要在 UI 中显示其他文本,您可以创建一个“安全”管道来绕过这个(一旦您确定来自 API 的数据确实安全)
的例子
此问题适用于使用 Angular UI (v8.2.14) 调用 Spring/Java 服务的应用。我试图弄清楚如何以最有效的方式避免 XSS 漏洞,但似乎存在一些矛盾的问题。下面举例说明:
Java 服务将 return 此字符串作为响应的一部分:“John & Terri”。
我们使用 Checkmarx 扫描 XSS 漏洞并转向 Contrast。两者都报告在响应中 returning 字符串之前应该对其进行清理和转义。所以我在 returning 之前做了以下事情: String stringForResponse = StringEscapeUtils.escapeHtml("John & Terri"); //使用apache公共库。 安全扫描现在对服务器端 java 代码感到满意。
Angular 现在将字符串显示为“John & Terri”。 Angular 文档中的一些研究表明 Angular 会为我们进行消毒和转义,除非我们告诉它不要这样做。因此,字符串似乎被转义了两次,然后浏览器“取消转义”了一次,因此我们得到的不是“&”而是“&”显示。 (当然,这将适用于通过字符串 util 方法转义的任何其他字符。
我们可以通过在 UI 代码中使用以下代码来解决这个问题,它告诉 Angular 你已经完成了 sanitize/escaping 和 Angular 不应该重复它: domSanitizer.bypassSecurityTrustHtml(variableThatIsDisplayedInUI); 这有效并且“John&Terri”正确显示。但是,对于在整个应用程序中将其作为我们的 XSS 方法实施,我有以下担忧:
一个。这是很多工作只是为了让安全扫描器开心,而 Angular 已经在处理 XSS 问题了。 B. Angular 文档警告这应该很少用于特殊情况。我将其翻译为“Angular 是稳定的,并且我们所有使用该框架的人都对其进行了很好的测试。怀疑你的 XSS 代码是否会如此彻底。”我同意这种观点。 C. 但是,我们的一些服务也被 Angular 框架以外的 HTTP 客户端使用。因此,如果我们不能相信那些其他客户会清理我们的响应,那么听起来我们应该清理响应中的所有内容。
建议的解决方案: 我唯一能想到的满足所有这些约束的方法是为后端 Java 服务提供两组端点:
- 一组端点仅供 angular UI 使用。我们不会逃避这些端点的响应并依赖 Angular 来处理它。
- 服务的所有其他消费者的一组端点。这些端点中的每一个的逻辑将调用相应的“angular only”端点,然后在 returning 响应之前从它获取响应并转义其所有字符串字段。 当然,当代码扫描器报告我们指定供 Angular-UI 使用的端点的 XSS 问题时,我们只需要忽略它们即可。
对于我们提出的解决方案或任何替代方案,我将不胜感激。谢谢!
不要专门为 Angular 应用创建单独的 API
如果资源返回转义字符,UI 始终可以使用 [innerHtml]
来呈现此文本。 Angular 将通过删除任何脚本或潜在危险字符来清理传递给 innerHtml
的数据,但它会允许 HTML 字符实体引用,例如 &
<span [innerHtml]="responseText"></span>
如果 Angular 的清理过程 escaped/removed 需要在 UI 中显示其他文本,您可以创建一个“安全”管道来绕过这个(一旦您确定来自 API 的数据确实安全)
的例子