我正在尝试使用API密钥和客户端的网站URL保护我的API路由。
我正在使用元组(api_key, website_url)
来授予对我的API的访问权限。实际上,网站URL是在请求中发送的。示例:使用Angular httpClient
this.restPost(this.endpoint,body,options)
选项包括:API密钥和网站URL。
如何检查选项中插入的website_url
是否与请求发送者的URL相匹配?我在后端使用Flask微框架。
答案 0 :(得分:1)
您要的是不可能的。
从根本上讲,如果请求是通过公共Internet向您发送的,则您 无法知道向您发送请求的应用程序的身份。
您可以对远程客户端进行有根据的猜测。但是,由于远程客户端在您无法控制的平台上运行,因此,没有什么可以阻止攻击者对它的工作方式进行逆向工程,然后向您发送相同的请求。如果攻击者足够熟练,您将无法分辨出差异。
有一些工具可以帮助您检测和阻止恶意客户端,但是也有一些工具可以使恶意客户端逃避检测(只需搜索Stack Overflow即可找到许多反向问题的示例)。这是一场军备竞赛,如果要赢得胜利,您将需要投入比另一方更多的时间和金钱。
此问题的常规解决方案是使其成为您的客户的问题。向他们收取一定数量的API请求,如果超出请求,则向他们收费。然后,如果他们与其他人共享API密钥,那么他们还需要为他们支付账单。这样一来,您就不必在乎它的API密钥是什么:无论哪种方式,您都能获得报酬。
如果您无法向他们收费(例如,如果这是一项免费服务),那么下一件最好的事情就是限制价格。单个API密钥的请求每秒不得超过10个请求。
如果您对这种事情很认真,则可能不想重新发明轮子。那里有云规模的API网关服务。选择一个并使用它来处理所有API密钥身份验证和客户端限制。