rest - 保护 SPA 后面的 REST API 免受数据窃贼的侵害
问题描述
我正在为 Angular SPA 编写一个 REST Api 网关,我遇到了保护 SPA 的 API 公开的数据免受“数据窃贼”侵害的问题。我知道我对 HTML 抓取无能为力,但至少我不想为这些数据窃贼提供用户体验和我们发送到 SPA 的 JSON 的全部功能。
大多数“教程”和有关该主题的线程之间的区别在于,我将这些数据公开给一个公共网站(这意味着不需要用户身份验证),该网站提供有关视频游戏的有价值的统计数据。
我对如何保护 SPA 的 Rest API 的初步想法:
到处使用 JWT。当访问者第一次打开网站时,SPA 从我的 REST Api 请求 JWT 并将其保存在 HTTPS cookie 中。对于所有请求,SPA 必须使用 JWT 来获得响应。
这种方法的问题
- 数据窃贼也可以简单地从我们的端点请求 oauth 令牌。我没有机会验证令牌实际上是从我的 SPA 还是从数据窃贼那里请求的?
- 即使我解决了攻击者可以从 HTTPS cookie 中读取保存的 JWT 并在他自己的应用程序中使用它。当然我可以为 JWT 添加过期时间
我的问题:
我的印象是这是一个常见问题,因此我想知道除了 SPA 直接访问我的 REST Api 响应之外,是否有任何好的解决方案可以防止其他人?
解决方案
从 API 的角度来看,您的 SPA 与任何其他客户端没有任何不同。您显然不能在 SPA 中包含秘密,因为它会发送给任何人并且无法受到保护。此外,它对 API 发出的请求也可以很容易地被另一个客户端嗅探和复制。
所以简而言之,正如这里多次讨论的那样,您无法验证客户端应用程序。任何人都可以根据需要创建不同的客户端。
您实际上可以做的一件事是检查请求的引用者/来源。如果客户端在浏览器中运行,它可以发出的 thr 请求会受到一定限制,其中一个限制是referer 和 origin 标头,它们始终由浏览器控制,而不是 javascript。因此,您实际上可以确保当(且仅当!)客户端在未经修改的浏览器中运行时,它是从您的域下载的。顺便说一句,这是浏览器中的默认设置,因此如果您不发送 CORS 标头,那么您已经这样做了(实际上,浏览器会这样做)。但是,这并不能阻止攻击者构建和运行非浏览器客户端并伪造他喜欢的任何引用者或来源,或者只是无视相同的来源策略。
您可以做的另一件事是定期更改 API,足以阻止恶意客户端工作(并同时更改您的客户端)。显然,这根本不安全,但对于攻击者来说可能已经够烦人了。如果一次下载所有数据是一个问题,那么这又没有任何帮助。
你应该考虑的一些真实的事情是:
真的有人想下载你的数据吗?这个值多少钱?大多数时候,没有人想创建一个不同的客户端,也没有人对数据那么感兴趣。
如果这很有趣,您至少应该实施用户身份验证,并通过以下几点和/或在您的合同中合法地承担剩余的风险。
您可以实施限制以不允许批量下载。例如,如果典型用户每 5 秒访问 1 条记录,总共访问 10 条,您可以根据客户端 IP 构建规则,例如合理限制用户访问。请注意,尽管速率限制必须基于客户端不能任意修改的参数,并且没有身份验证,这几乎只是客户端 IP,并且您将面临 NAT 后面的用户的问题(例如,公司网络)。
同样,您可以实施监控以发现是否有人正在下载比正常或必要的数据更多的数据。但是,如果没有用户身份验证,您唯一的选择就是禁止客户端 IP。所以再次归结为知道用户是谁,即。验证。
推荐阅读
- regex - 结合两个正则表达式的方法是什么?
- c# - UserManager 的 CreateAsync 方法不起作用(身份)
- javascript - 选择具有相同id和不同属性jquery的元素
- angular - 从 API 获取数据
- windows - 在 Windows 上使用带有 PyTorch 的 CUDA 时,GPU 使用率显示为零
- ajax - 喊我取消 componentWillMount() 中的每个 ajax 请求?
- gdb - 在 GDB 中,如何打印具有特殊字符的符号的内容?
- python - 如何使用 exchangelib 将电子邮件添加到现有日历条目?
- python - PySide2 UI在显示后进入while循环时停止响应
- sql - 将不在表中组的前 x 行中的行加到“其他”行中?