rest - 具有 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 漏洞之外,还有其他方法可以避免这种情况吗?
解决方案
无状态防伪令牌
第一个问题是关于在没有服务器端状态的情况下防止CSRF 。当前用于无状态防伪令牌的方法是双重提交 cookie模式。
CSRF 攻击依赖于浏览器自动将 API 自己的 cookie 发送回它,而不管请求来自何处。攻击者没有或不需要访问 cookie 内容。他们只需要欺骗用户加载恶意 HTML。双cookie模式增加了一个新要求:攻击者必须知道并单独发送防伪cookie的内容。
攻击者有办法用自己的方法覆盖防伪 cookie。因此,您可能希望针对这种方法查看一些额外的安全强化。特别是 HMAC 对防伪令牌进行签名以防止令牌替换。使用 HSTS 和__Host
cookie 前缀来确保传输安全性和正确的 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 攻击等技术危险,还针对社交危险。人类的弱点是最广为人知且最容易被利用的。
最后,对您的情况风险/后果低的缓解措施进行投资是没有意义的。所以不要把这里的所有东西都当作需求清单。无论如何,这不是一个完整的列表。专注于对您当前情况重要的事情。定期重新评估。
推荐阅读
- javascript - Three.js - 如何将对象组合成单个对象/几何?
- javascript - Javascript 日期对象:startDate < nowDate 逻辑由于客户端上的时区差异而无法正常工作
- socket.io - 在sails 中响应socket.io post 函数的正确方法是什么?
- sveltekit - 在 SvelteKit 中全局导入图像 url
- python - 'str' 对象没有属性 'text'| 美丽汤
- php - 从 PHP 运行 node.js 脚本时无法访问文件
- c++ - 模板化检查是否存在类成员函数模板特化?
- python - 诱变剂问题无法使用字典中的信息
- git - 使用启动脚本克隆私有 Github 存储库?
- amazon-cognito - AWS Cognito:您应该为 UID 创建自定义属性吗?