首页 > 解决方案 > 具有 CSRF 和 XSS 保护的无状态 REST API

问题描述

是否可以保护无状态 REST API 免受 XSS 和 CSRF 攻击?

目前,我正在使用存储在安全/httpOnly cookie 中的 JWT 令牌进行无状态身份验证。这应该可以保护 API 免受最常见的 XSS 攻击:使用注入 XSS 的 JavaScript 窃取 cookie 并将它们发送给攻击者。

但是,这并不能保护 API 免受 CSRF 攻击,攻击者会欺骗经过身份验证的用户点击指向特定 Web API 调用的链接,以代表受害者执行不利交易。如何在不引入服务器端状态的情况下保护 API 免受这种攻击?

此外,在以下情况下,XSS 漏洞是否会继承允许 CSRF 类型攻击:注入的 JavaScript 将从客户端状态、DOM 或浏览器存储中检索 CSRF 令牌,并准备对服务器的恶意 ajax 调用。浏览器仍会自动包含同一来源请求的 httpOnly cookie。除了首先防止 XSS 漏洞之外,还有其他方法可以避免这种情况吗?

标签: restsecurityjwtxsscsrf

解决方案


无状态防伪令牌

第一个问题是关于在没有服务器端状态的情况下防止CSRF 。当前用于无状态防伪令牌的方法是双重提交 cookie模式。

CSRF 攻击依赖于浏览器自动将 API 自己的 cookie 发送回它,而不管请求来自何处。攻击者没有或不需要访问 cookie 内容。他们只需要欺骗用户加载恶意 HTML。双cookie模式增加了一个新要求:攻击者必须知道并单独发送防伪cookie的内容。

攻击者有办法用自己的方法覆盖防伪 cookie。因此,您可能希望针对这种方法查看一些额外的安全强化。特别是 HMAC 对防伪令牌进行签名以防止令牌替换。使用 HSTS 和__Hostcookie 前缀来确保传输安全性和正确的 cookie 范围。并让客户端在自定义标头中提供防伪令牌。

自定义标头确保请求必须从 JS 发送,因为基于 HTML 标记的 CSRF 攻击无法设置自定义标头。从 JS 发送也会触发额外的保护。对于跨域请求,它会触发浏览器上的SOP和服务器上的CORS验证。服务器还可以进行基本的Origin 验证

关于 CSRF 攻击的范围,这里是顶部 OWASP CSRF 链接的注释。

强迫受害者检索数据对攻击者没有好处,因为攻击者没有收到响应,而受害者却收到了。因此,CSRF 攻击针对状态更改请求。

跨站脚本问题

是的,XSS攻击可能会以这种方式发生。一旦将恶意脚本加载到 JS 中,就可以自由支配使用 Javascript 可访问的任何内容。包括应用程序代码/内存、浏览器存储和 cookie。即使 HttpOnly cookie 不可读,它们仍然可以在请求中发送。非目标攻击可能会在流行框架使用的位置中寻找关键数据。并且可能会尝试在服务器上探查流行/可发现的 API 框架。有针对性的攻击意味着攻击者花时间为您的特定系统创建有效负载。

XSS 的主要载体是外部数据(用户输入、数据库值等),这些数据在使用前没有经过清理。要防止 XSS,请查看OWASP 中的这些指南。值得注意的是,Angular、React、Svelte、Vue 等前端框架都内置了这种 XSS 保护。但是如果不小心,你仍然可以用不同的方式把它搞砸。

XSS 攻击也可能来自外部资源。可能是受损的 CDN 或 NPM 脚本。注意 NPM 审计警告。一种攻击模式是附加一个小型加载程序(更容易被忽视),它将在运行时获取攻击载荷。CSP策略可以帮助防止这种情况。指定允许的资源列表(您的应用资产和 API URL)并阻止所有其他资源。这也有助于防止数据泄露。

对于 CSRF 和 XSS

对于对 API 的攻击,您还可以使用服务器端缓解措施。基于 IP 的限制/临时禁令、异常活动灰名单和警报等。

对于特别敏感的操作,一种策略是使用升级授权。这可以采取要求用户重新验证或使用第二个因素(如一次性密码)的形式。这可以阻止自动攻击,因为它需要主动的用户干预。

为了缓解使用现有升级授权(也可能在 cookie 或应用程序内存中)的攻击者,他们可以有很短的过期时间,并且仅限于特定操作。更进一步,可以签署批准的操作+相关数据。这将防止恶意脚本重用升级以对不同数据执行相同类型的操作。更进一步,这些敏感操作可以是幂等的。因此,如果攻击者确实重新发送已经执行的操作,它们不会导致系统发生任何变化。

缩小

尝试将您的系统设计为对黑客尽可能不感兴趣。使用受信任的外部服务来满足信用卡和凭证等敏感需求。理想情况下(从安全角度来看),黑客风险将降低为数据破坏/丢失。因此,在发生违规的最坏情况下,它几乎不会产生长期影响。它可以通过常见的做法来恢复,包括定期测试的备份。然后为所使用的特定攻击添加了进一步的缓解措施。

在进行用户与用户交互时要特别小心。因为这为黑客增加了更多的目标和支点——你的用户群。最有安全意识的眼睛应该在这些作品上。不仅针对用户对用户 XSS 攻击等技术危险,还针对社交危险。人类的弱点是最广为人知且最容易被利用的。

最后,对您的情况风险/后果低的缓解措施进行投资是没有意义的。所以不要把这里的所有东西都当作需求清单。无论如何,这不是一个完整的列表。专注于对您当前情况重要的事情。定期重新评估。


推荐阅读