将REST API访问仅限于已注册的站点



我有一个老问题,可能在这里被问了很多次,但我们仍然在2022年,也许有更好的方法来解决这个问题。

我有一个API,它被一些网站(客户端(使用,注册在此API中,这些客户端使用此API来显示私人和公共用户的服务列表,而无需任何身份验证。

当客户端在API中注册时,在使用API之前,为每个请求提供一个个人访问令牌以发送该令牌,以限制对该API的滥用。

公共端访问令牌的问题是,任何人都可以拦截它,并在为愿望生成的网站之外使用它,这将导致大量成本。即使我把代币的使用寿命缩短到10分钟,我仍然有滥用代币的风险。

除了对每个请求的客户端进行身份验证以获得生命周期为几秒的新令牌之外,还有什么方法可以更好地保护这个API吗?

为了更好地说明上面的问题,这是一个用例:

  1. 恶意用户连接到第一个注册的站点,因为该站点向公共用户列出服务,恶意用户拦截API头中的令牌
  2. 恶意用户来到其未注册的网站并使用令牌

所有这些步骤都可能被恶意用户自动化。

编辑:我不能改变客户的实现,也不能要求他做任何改变,我搜索一些东西来减少滥用,不是100%,而是让滥用变得有点复杂,比如使用原始域名、CORS。。。

目前使用的绝大多数访问令牌都是承载令牌。这意味着,如果令牌有效,资源服务器将接受该令牌,而不关心谁发送了该令牌。你是对的,这意味着恶意用户可以窃取你的令牌并使用它来调用你的API。攻击者有更多的方法来窃取访问令牌,而不仅仅是MITM攻击(正如问题评论中所指出的,使用TLS可以大大减轻这种攻击(。如果令牌可用于Javascript应用程序,您可能会受到XSS攻击,或者浏览器中的人攻击,即令牌被浏览器中运行的恶意代码窃取。

这些攻击通常通过使用短时间访问令牌(甚至不到10分钟(和设置速率限制来缓解。这通常足以防止滥用。您总是可以添加额外的保护层,例如,如果呼叫者的IP发生变化,则丢弃令牌,等等。

如果您需要更强的保护,那么您可以查看受发件人约束的访问令牌。这些是令牌,只能由合法客户端使用。发送这样的令牌需要客户端提供额外的占有证明。然后将其与令牌本身一起进行验证。

实现发送方约束令牌有不同的可能性,例如证书绑定令牌或DPoP。

最新更新