如何保护从 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 漏洞,但似乎存在一些矛盾的问题。下面举例说明:

  1. Java 服务将 return 此字符串作为响应的一部分:“John & Terri”。

  2. 我们使用 Checkmarx 扫描 XSS 漏洞并转向 Contrast。两者都报告在响应中 returning 字符串之前应该对其进行清理和转义。所以我在 returning 之前做了以下事情: String stringForResponse = StringEscapeUtils.escapeHtml("John & Terri"); //使用apache公共库。 安全扫描现在对服务器端 java 代码感到满意。

  3. Angular 现在将字符串显示为“John & Terri”。 Angular 文档中的一些研究表明 Angular 会为我们进行消毒和转义,除非我们告诉它不要这样做。因此,字符串似乎被转义了两次,然后浏览器“取消转义”了一次,因此我们得到的不是“&”而是“&”显示。 (当然,这将适用于通过字符串 util 方法转义的任何其他字符。

  4. 我们可以通过在 UI 代码中使用以下代码来解决这个问题,它告诉 Angular 你已经完成了 sanitize/escaping 和 Angular 不应该重复它: domSanitizer.bypassSecurityTrustHtml(variableThatIsDisplayedInUI); 这有效并且“John&Terri”正确显示。但是,对于在整个应用程序中将其作为我们的 XSS 方法实施,我有以下担忧:

一个。这是很多工作只是为了让安全扫描器开心,而 Angular 已经在处理 XSS 问题了。 B. Angular 文档警告这应该很少用于特殊情况。我将其翻译为“Angular 是稳定的,并且我们所有使用该框架的人都对其进行了很好的测试。怀疑你的 XSS 代码是否会如此彻底。”我同意这种观点。 C. 但是,我们的一些服务也被 Angular 框架以外的 HTTP 客户端使用。因此,如果我们不能相信那些其他客户会清理我们的响应,那么听起来我们应该清理响应中的所有内容。

建议的解决方案: 我唯一能想到的满足所有这些约束的方法是为后端 Java 服务提供两组端点:

对于我们提出的解决方案或任何替代方案,我将不胜感激。谢谢!

不要专门为 Angular 应用创建单独的 API

如果资源返回转义字符,UI 始终可以使用 [innerHtml] 来呈现此文本。 Angular 将通过删除任何脚本或潜在危险字符来清理传递给 innerHtml 的数据,但它会允许 HTML 字符实体引用,例如 &

<span [innerHtml]="responseText"></span>

如果 Angular 的清理过程 escaped/removed 需要在 UI 中显示其他文本,您可以创建一个“安全”管道来绕过这个(一旦您确定来自 API 的数据确实安全)

safe pipe

的例子