我正在为我的应用程序设计一个小型API。我的目标是允许外部域使用POST请求查询API,我预计该请求最常见的是通过客户端协议(如AJAX)执行。
我想将对我的API的访问权限限制为预先授权的用户,我想知道如何最好地支持此功能。
我的第一个想法是为用户存储一个密钥表。我需要在访问我的API时提供一个密钥;在每个API请求期间,都将对照我的授权密钥表来检查此密钥,并且仅在找到匹配项时才执行查询。但这并不安全:由于大多数用户会通过AJAX等客户端协议访问我的API,因此他们的代码会公开密钥,恶意用户可能会盗用该密钥。
我的第二个想法是存储一个键和引用者表。每个授权的引荐来源网址都有其自己的唯一密钥。当用户尝试使用其私钥访问我的API时,我会拉该用户的HTTP_REFERER并检查以确保引荐域与提供的密钥匹配。但是,这也是可以利用的:恶意用户可以轻松地使用cUrl欺骗引荐来源并利用系统。
是否有任何方法可以构造只能由授权用户访问但可以通过客户端协议(例如AJAX)访问的安全API?
答案 0 :(得分:1)
是否有任何方法可以构造只能由授权用户访问但可以通过客户端协议(例如AJAX)访问的安全API?
简短的回答是“否”,假设您的意思是仅使用JavaScript代码进行调用。
任何在客户端运行且需要秘密才能访问API的事物注定会以多种方式被滥用。您已经提到了一些内容,并且可以在this series of articles上阅读有关移动api安全技术的更多信息。本文将教您如何使用API密钥,用户访问令牌,HMAC,TLS固定来保护API以及如何绕过它们。这些文章更多地是针对移动应用程序的API的上下文,但它们很好地说明了您为何无法保护API免受AJAX调用的影响。
如果您需要通过移动应用程序拨打电话,那么如果您使用适当的措施,则答复为“是”,由于您的应用程序不是移动应用程序,因此在此不再赘述。如果是移动设备,请在评论中让我知道,我将编辑回复以说明您可以采取哪些措施。