保护客户端调用API端点的最佳实践

5
我正在构建一个应用程序,在客户端前端应用程序中需要向外部API发出请求,但我不知道如何使其最大程度地安全,以便只有有效的请求可以转发到此外部API,而不是任何人都可以发送的请求。
作为安全性的第一步,我已经将其设置为客户端应用程序无法直接与外部API通信,而必须命中我们自己的服务器端API,然后代理请求到外部API,以便用于命中外部API的凭据仅存储在服务器端,而不是客户端上。
然而,这也导致了同样的根本问题-如何保护我从客户端应用程序向我们自己的服务器端应用程序发出的请求所使用的任何凭据/身份验证系统?
问题在于这是一个在线餐厅订餐服务,因此我们不希望用户必须通过用户名和密码对自己进行身份验证才能下订单,因此触发外部API调用的订单放置并没有被任何用户名/密码方案所限制,并且必须对前端应用程序的所有消费者可用。
这里的安全最佳实践是什么?我至少启用了CORS白名单,以使我们的服务器端API终结点理论上仅允许来自我们自己域的请求,但如果有人选择伪造来源URL,CORS就会轻松绕过。
还有哪些可用的选项?我肯定只是漏了一些微不足道的东西,因为这必须是一个已经建立了最佳实践的非常常见的问题,但我却无法找到它。
谢谢!
2个回答

9
作为API和移动安全的开发者倡导者,看到一个真正关心他们应用程序安全的开发者总是让我感到高兴,特别是当他们已经做出了一些努力来保护它时,因此请接受我的祝贺。
我的回答背景
我正在构建一个应用程序,在其中需要在客户端前端应用程序中向外部API发出请求,但我有点不知道如何使其最大程度地安全,以便只有有效的请求可以转发到该外部API,而不是任何人想要的东西。
所以,您没有详细说明这是一个Web应用程序还是移动应用程序,由于我的专业知识依赖于移动和API安全,因此我将假设这是一个移动应用程序。
挑战
问题是这是一个在线餐厅订购服务,因此我们不希望用户必须通过用户名和密码进行身份验证才能下订单,因此触发外部API调用的订单放置没有被任何用户名/密码方案所限制,并且必须对前端应用程序的所有消费者开放。
您面临着一个复杂的挑战,因为您有一个向公众开放的应用程序,没有任何用户身份验证/识别,但需要访问底层资源的访问规则,就像它在用户身份验证和授权后面一样,但即使是这样,它仍然容易被滥用。
要理解为什么我需要澄清通常在任何资深开发人员中都会发现的误解,即关于谁和什么正在访问API服务器之间的区别。
我撰写了一系列关于API和移动安全性的文章,在文章Why Does Your Mobile App Need An Api Key?中,您可以详细阅读谁和什么正在访问您的API服务器之间的区别,但我将从中提取主要内容。

什么是向API服务器发出请求的东西。它是您移动应用程序的真正实例,还是机器人、自动化脚本或攻击者手动使用像Postman这样的工具探测您的API服务器?

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

视为您的API服务器将能够对数据进行身份验证和授权访问的用户,并将什么视为代表用户发出请求的软件。

因此,在您的情况下,您无法确定请求中的,因此您需要一个解决方案,该解决方案能够向API后端提供非常高的信心,即请求确实来自它所期望的什么,即您应用程序的真实未修改实例。

可能的解决方案

我正在构建一个应用程序,在客户端前端应用程序中需要向外部API发出请求,但我不知道如何使其最大程度地安全,以便只有有效的请求可以转发到此外部API,而不是任何人想要的东西。
这需要非常先进的解决方案才能得到适当的保护,因此并不像您可能认为的那样容易实现:
我确定我一定只是错过了一些微不足道的东西,因为这必须是一个非常普遍的问题,具有已建立的最佳实践,但我某种方式未能找到它。
是的,这是一个常见的问题,通常被忽视或未能得到适当解决,解决它的第一步是清楚地了解请求中“谁”与“什么”的区别,否则设计的解决方案将无法正确解决该问题。
对于移动应用程序:
我建议您阅读我对“如何保护移动应用的REST API?”问题给出的答案,特别是“加强和保护移动应用程序”、“保护API服务器”和“可能更好的解决方案”部分。

这个答案将向您展示几种解决方案,例如WAF和UBA,但最终推荐使用移动应用程序认证概念。

简而言之,移动应用认证将允许API后端有很高的信心,确保请求确实来自于它所期望的、真实且被修改的移动应用程序实例。

对于Web应用程序

您可以学习一些有用的技术,帮助您的API后端仅响应来自您期望的真实Web应用程序的请求。为此,我邀请您阅读我的回答,了解如何保护API服务器的相关部分。

您想更进一步吗?

在回答安全问题时,我总是喜欢引用OWASP基金会的优秀工作。

针对APIs

OWASP API安全前10名

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

针对移动应用程序

OWASP 移动安全项目 - 前 10 大风险

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

OWASP - 移动安全测试指南:

移动安全测试指南 (MSTG) 是一本全面的手册,用于移动应用程序安全开发、测试和反向工程。

针对 Web 应用程序

Web 安全测试指南:

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


这是一个非常详细和有帮助的答案 - 非常感谢您抽出时间来写下这篇文章!令人难以置信地感激。这是一个响应式Web应用程序 - 很抱歉没有提到 - 我们希望人们主要在手机上使用它,但我们不想让人们通过下载本机应用程序来增加额外的麻烦,所以我们选择了响应式Web应用程序的路线。知道这不是像预期的那样琐碎,真的很令人振奋,您提供的资源正是我希望得到的。非常有帮助,再次感谢! - Intenex

1

最终,您的客户需要对第三方API执行某些操作。

因此,我们知道应该允许某些操作,并且根据您的描述,我们也知道不应该允许每个操作。

因此,您的安全性应该基于这个前提。不要创建一个愚蠢的代理,转发每个请求,而是您的中间API应该只特定允许您想要它允许的操作,基于您设置的规则。

如果您没有用户名和密码,则可能仍然有其他种类的规则来识别人员(电子邮件/电话号码?),这意味着您可以创建身份验证系统。

或者,也可能只有在用户使用信用卡完成订单后才应调用您的第三方服务,在您的API上需要存在该逻辑。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接