防止不受信任的客户端使用 REST API 的登录/注册端点

Posted

技术标签:

【中文标题】防止不受信任的客户端使用 REST API 的登录/注册端点【英文标题】:Prevent untrusted clients to use login/register endpoints of REST API 【发布时间】:2020-08-18 16:34:11 【问题描述】:

我实际上有一个 ReactJs 中的 SPA + 一个 Flutter 中的移动应用程序 + 一个使用 SailsJs 开发的 REST API,在单独的服务器上运行。当我们使用有效信息(ID/密码)登录时,我使用 API 发回的安全会话 cookie 管理用户身份验证。

所以所有需要用户进行身份验证的端点都受到保护(除非还有其他我不知道的安全最佳实践?)。每次调用受保护的端点之一时都会检查会话 cookie 的过期和有效性。

我确实阅读了大量有关保护 REST API 的主题和博客文章。我的问题从来没有或几乎没有出现过。所以现在我的主要问题是:

我如何限制我的公共 API 端点(当前登录和注册)不需要用户进行身份验证(因为有用于实现此任务的端点......)只在我信任的情况下使用客户端应用程序(网络和移动)?

如何防止他人开发的其他应用使用这些端点?

我不希望任何人通过我的 API 登录,除非它是在我正在开发的客户端应用程序中完成的...我不希望任何人复制我的应用程序并以这种方式成功使用我的 API知道...

我看到许多带有登录 API 路由(例如 Heroku)的流行服务无法在 Postman 中使用相同的参数(403 错误代码)进行访问。所以这是可能的。但是他们是怎么做到的呢?专门论坛中没有任何内容可以处理此问题,否则我错过了一些东西!

我很难在客户端中存储一个秘密令牌来对其进行身份验证,但它实际上是通过 Web 开发人员工具公开的。

需要一些建议。

谢谢

【问题讨论】:

看看智威汤逊 请开发?每个请求一个 JWT + 会话 cookie JWT 已经在这里了吗?我怎样才能做到这一点? 您可以在您的服务器中使用 CORS 来启用只有您信任的客户端才能向您的 api 请求。 【参考方案1】:

用户身份验证不是应用身份验证

所以所有需要用户进行身份验证的端点都受到保护...

此端点仅在请求中识别、验证和授权 他的方面受到保护,但不适用于 What 正在执行请求,这不是一个主题开发人员非常了解,无论他们是初级还是高级。

访问 API 服务器的对象和对象的区别

在我写的一篇题为 Why Does Your Mobile App Need An Api Key? 的文章中,您可以更详细地阅读 什么 访问您的 API 服务器之间的区别,我在其中引用了以下:

what 是向 API 服务器发出请求的事物。它真的是您的移动应用程序的真实实例,还是机器人、自动脚本或攻击者使用 Postman 之类的工具手动绕过您的 API 服务器?

是移动应用的用户,我们可以通过多种方式进行身份验证、授权和识别,例如使用 OpenID Connect 或 OAUTH2 流。

所以 是您的 API 服务器的用户,您将能够验证和授权对数据的访问,而 什么 是发出该请求的软件代表用户、您的正版应用、被篡改的应用、自动脚本或通过 cURL、Postman 或类似工具手动使用您的 API 的人。

到目前为止,我希望您有足够的知识来理解为什么用户(who)身份验证与应用(what)身份验证不同。

将 API 服务器锁定到应用程序

如何限制我的公共 API 端点(当前登录和注册)不需要用户进行身份验证(因为有用于实现此任务的端点......)仅用于我受信任的客户端应用程序(网络和移动)?

我认为,到目前为止,您可能已经清楚,需要保护的不仅仅是登录和注册端点,以免 什么 正在执行请求。

如何防止其他人开发的其他应用使用这些端点? 我不希望任何人通过我的 API 登录,除非它是在我正在开发的客户端应用程序中完成的......我不希望任何人在不知情的情况下复制我的应用程序并以 0 保护的方式成功使用我的 API。 ..

这对于网络应用来说是极难实现的,但是当移动应用证明概念被实施时,移动应用可以高度自信地做到这一点。

对于网络应用程序

由于网络构建方式的性质,检查网络应用程序只需按 F12 或检查页面源,然后搜索您需要从其他工具访问 API 服务器的任何内容。

您可以学习一些有用的技术来帮助您的 API 服务器尝试仅响应来自您所期望的什么的请求,您的真正网络应用程序,为此我邀请您阅读 @987654322 @ 问题从应用程序的调用中保护 api 数据,特别是专门用于保护 API 服务器的部分

对于移动应用程序

要了解如何将 API 服务器锁定到移动应用程序,我建议您阅读 my answer 到 关于保护 API 服务器可能的更好解决方案部分的问题如何保护移动应用程序的 API REST?

要保护的端点

因此,所有需要对用户进行身份验证的端点都受到保护(除非还有其他我不知道的安全最佳实践?)。

如果您只想增强登录和注册端点的安全性,这取决于您,但我的建议是您增强所有这些端点的安全性,以检测 什么 正在访问它们。

邮递员与 Heroku 等人

我看到许多带有登录 API 路由(例如 Heroku)的流行服务无法在 Postman 中使用相同的参数(403 错误代码)进行访问。所以这是可能的。但是他们是怎么做到的呢?专门论坛中没有任何东西可以处理这个问题,否则我错过了一些东西!

我从未使用过 Heroku,但是当我使用在 Postman 中不起作用但在其他客户端中起作用的 API 时,例如从 cURL 中,然后我禁用 Postman 发送它自己的 user-agent 并且通常 API 会开始接受请求。

如果没有,那么他们可能正在做device fingerprinting:

设备指纹或机器指纹是为识别目的而收集的有关远程计算设备的软件和硬件的信息。通常使用指纹算法将信息同化为简短的标识符。浏览器指纹是通过与设备的网络浏览器交互而专门收集的信息。

指纹识别可以在主动或被动模式下完成。在主动模式下,一些 javascript 在客户端上运行以收集一些数据以发送回 API 服务器,而在被动模式下,它使用服务器中请求的可用信息,例如 http 标头和请求参数。

虽然这提高了伪造 什么 正在执行请求的门槛,但可以通过观察受信任的客户端如何发送请求并模仿它来绕过它。对于攻击者来说,枚举所有变体然后自动化它们只是多一点工作。

您想加倍努力吗?

我确实阅读了大量有关保护 REST API 的主题和博客文章。

首先,我祝贺您付出了如此多的努力来教育自己保护您的 API。

我不知道您是否已经阅读了我将要链接的一些 OWASP 资源,但在回答安全问题时,我总是喜欢参考 OWASP 基金会的出色工作;)

对于网络应用程序

OWASP Web Top 10 Risks

OWASP Top 10 是一个强大的 Web 应用程序安全意识文档。它代表了对 Web 应用程序最关键的安全风险的广泛共识。项目成员包括来自世界各地的各种安全专家,他们分享了他们的专业知识来制作此列表。

The Web Security Testing Guide:

OWASP Web 安全测试指南包括用户可以在自己的组织中实施的“最佳实践”渗透测试框架和描述测试最常见 Web 应用程序和 Web 服务安全问题的技术的“低级”渗透测试指南。

对于移动应用

OWASP Mobile Security Project - Top 10 risks

OWASP 移动安全项目是一个集中资源,旨在为开发人员和安全团队提供构建和维护安全移动应用程序所需的资源。通过该项目,我们的目标是对移动安全风险进行分类并提供开发控制以减少其影响或被利用的可能性。

OWASP - Mobile Security Testing Guide:

移动安全测试指南 (MSTG) 是移动应用安全开发、测试和逆向工程的综合手册。

对于 APIS

OWASP API Security Top 10

OWASP API 安全项目旨在通过强调不安全 API 中的潜在风险并说明如何降低这些风险,为软件开发人员和安全评估人员提供价值。为了实现这一目标,OWASP API 安全项目将创建和维护一份 API 安全风险前 10 名文档,以及一个文档门户,用于在创建或评估 API 时提供最佳实践。

【讨论】:

非常感谢您抽出宝贵时间,这可能是我在 SO 上看到的最佳答案...如果在阅读完您的所有链接后还有其他问题,我会回来。

以上是关于防止不受信任的客户端使用 REST API 的登录/注册端点的主要内容,如果未能解决你的问题,请参考以下文章

防止不受信任的 C# 代码启动新线程或黑名单/白名单 API

登录失败。该登录名来自不受信任的域,不能与 Windows 身份验证一起使用。

SQL Server 2008 Windows 身份验证登录错误:登录来自不受信任的域

保护/清理不受信任的客户端对服务器的远程调用

需要带有 Nodejs 示例的 RESTful MongoDB

Youtube IFrame API 不受信任的来源