我正在开发一个宁静的Web应用程序,该应用程序在后端使用了一些流行的Web框架,例如(rails,sinatra,flask,express.js)。理想情况下,我想使用Backbone.js开发客户端。如何仅让我的javascript客户端与这些API调用进行交互?我不希望这些API调用是公开的,而不是通过curl
浏览器上的链接输入或仅通过输入链接即可调用。
我正在开发一个宁静的Web应用程序,该应用程序在后端使用了一些流行的Web框架,例如(rails,sinatra,flask,express.js)。理想情况下,我想使用Backbone.js开发客户端。如何仅让我的javascript客户端与这些API调用进行交互?我不希望这些API调用是公开的,而不是通过curl
浏览器上的链接输入或仅通过输入链接即可调用。
Answers:
作为首要原则,如果您的JS客户端使用了您的API,则必须假定它是公共的:一个简单的JS调试器会将攻击者置于一个位置,在该位置,攻击者可以从攻击者发送逐字节的相同请求。他选择的工具。
就是说,如果我正确地阅读了您的问题,那不是,您要避免的是:您真正不希望发生的事情是,在不涉及JS客户端的情况下(定期)消耗了API。以下是一些有关如何强制执行(至少鼓励使用客户端)的想法:
我确定,您的API具有某种身份验证字段(例如,在客户端上计算的哈希)。如果不是,请查看This SO问题。确保您使用基于会话(自动编码的Aot)分配给JS客户端的盐(甚至API密钥)。这样,未经授权使用您的API的消费者将被迫进行更多工作。
加载JS客户端时,请记住一些HTTP标头(想到的是用户代理)和IP地址,如果它们发生更改,请重新进行身份验证,并为通常的可疑对象使用黑名单。这迫使攻击者再次更加彻底地完成作业。
在服务器端,请记住最后几个API调用,并在允许另一个API调用之前,检查业务逻辑是否现在允许新的API调用:这使攻击者无法将其许多会话集中到与服务器的一个会话中:结合其他措施,这将使施虐者容易被发现。
我可能没有以必要的明确性来这么说:我认为不可能使滥用者完全不可能使用您的服务,但是您可以使它变得如此艰难,这不值得麻烦。
您应该实现某种身份验证系统。处理此问题的一种好方法是定义一些预期的标头变量。例如,您可以进行auth / login API调用,以返回会话令牌。随后对API的调用将期望在HTTP标头变量中设置会话令牌,并使用“ your-api-token”之类的特定名称。
或者,许多系统使用某种api帐户系统创建预期的访问令牌或密钥(例如youtube,facebook或twitter)。在这种情况下,您的客户将不得不以某种方式将其存储在客户中。
然后,只需将会话检查添加到REST框架中并引发异常即可。如果可能的话,状态码(要保持安静)将是401错误。
现在有一个开放标准,称为“ JSON Web令牌”,
参见https://jwt.io/和https://en.wikipedia.org/wiki/JSON_Web_Token
JSON Web令牌(JWT)是基于JSON的开放标准(RFC 7519),用于创建声明某些声明的令牌。例如,服务器可以生成一个令牌,该令牌具有“以管理员身份登录”的声明,并将其提供给客户端。然后,客户端可以使用该令牌来证明他们以管理员身份登录。令牌由服务器的密钥签名,因此服务器能够验证令牌是合法的。令牌被设计为紧凑的,URL安全的,并且尤其在Web浏览器单点登录(SSO)上下文中可用。JWT声明通常可用于在身份提供商和服务提供商之间传递经过身份验证的用户的身份,或者用于业务流程所需的任何其他类型的声明。[1] [2] 令牌也可以进行身份验证和加密。[3] [4]
对不起,@ MarkAmery和Eugene,但这是不正确的。
您可以将在浏览器中运行的js + html(客户端)应用设置为排除未经授权直接调用API的方法,如下所示:
- 第一步:设置API以要求身份验证。该客户端必须通过服务器(或其他安全服务器)首先验证自身例如要求人类用户提供正确的密码。
身份验证之前,不接受对API的调用。
在身份验证期间,将返回“令牌”。
验证后,将仅接受带有验证“令牌”的API调用。
当然,在此阶段,只有拥有密码的授权用户才能访问API,尽管如果他们是调试应用程序的程序员,则他们可以出于测试目的直接访问它。
现在,为了使用您的API,他们必须首先下载客户端并在浏览器中实际运行它。只有在成功接收到回调并在短时间内输入用户之后,API才会接受调用。
因此,您不必担心这可能是没有凭据的未经授权的用户。
(问题的标题为“如何保护REST API调用”,从您的大部分观点出发,这是您的主要担忧,而不是字面意义上的如何调用您的API的问题,而是由WHOM正确的吗? )