如何保护RESTAPI调用?

如何保护RESTAPI调用?,rest,security,web-applications,backbone.js,restapi,Rest,Security,Web Applications,Backbone.js,Restapi,我正在开发restful web应用程序,它在后端使用一些流行的web框架,比如rails、sinatra、flask、express.js。理想情况下,我希望使用Backbone.js开发客户端。如何只让javascript客户端与这些API调用交互?我不希望这些API调用是公开的,被curl调用,或者仅仅通过在浏览器上输入链接来调用。作为第一个原则,如果你的API被你的JS客户端使用,你必须假设它是公开的:一个简单的JS调试器将攻击者置于一个位置,他可以从他选择的工具发送一个字节对一个字节相

我正在开发restful web应用程序,它在后端使用一些流行的web框架,比如rails、sinatra、flask、express.js。理想情况下,我希望使用Backbone.js开发客户端。如何只让javascript客户端与这些API调用交互?我不希望这些API调用是公开的,被
curl
调用,或者仅仅通过在浏览器上输入链接来调用。

作为第一个原则,如果你的API被你的JS客户端使用,你必须假设它是公开的:一个简单的JS调试器将攻击者置于一个位置,他可以从他选择的工具发送一个字节对一个字节相同的请求

也就是说,如果我正确地阅读了你的问题,这不是你想要避免的:你真正不想发生的是,你的API在没有JS客户端参与的情况下(定期)被使用。以下是关于如何在不强制执行的情况下,至少鼓励使用您的客户的一些想法:

  • 我确信,您的API具有某种身份验证字段(例如,在客户端计算的哈希)。如果没有,请查看。确保您使用的salt(甚至API密钥)是在会话基础上提供给JS客户端的(a.o.t.硬编码)。这样,API的未经授权使用者将被迫进行更多的工作

  • 在加载JS客户机时,记住一些HTTP头(我想到的是用户代理)和IP地址,如果它们发生变化,则要求重新验证,对常见的可疑对象使用黑名单。这迫使攻击者再次更彻底地完成作业

  • 在服务器端,记住最后几个API调用,在允许另一个API调用之前,现在检查业务逻辑是否允许新的API调用:这使攻击者无法将其许多会话集中到与服务器的一个会话中:结合其他措施,这将使攻击者易于检测


我可能不必用必要的明晰说:我认为它是“强不可能的< /强”使滥用者完全不可能消耗你的服务,但你可以使它变得如此困难,它可能不值得麻烦。< /P> < P>你应该实施某种认证系统。处理这个问题的一个好方法是定义一些预期的头变量。例如,您可以使用一个auth/login API调用来返回会话令牌。对API的后续调用将期望在HTTP头变量中设置会话令牌,该变量具有特定名称,如“您的API令牌”

或者,许多系统使用某种api帐户系统创建预期的访问令牌或密钥(如youtube、facebook或twitter)。在这些情况下,您的客户机必须以某种方式将这些存储在客户机中


然后,只需在REST框架中添加会话检查并抛出异常。如果可能的话,状态代码(restful)将是401错误。

对不起@MarkAmery和Eugene,但这是不正确的

您在浏览器中运行的js+html(客户端)应用程序可以设置为排除对API的未经授权的直接调用,如下所示:

  • 第一步:设置API以要求身份验证。客户端必须首先通过服务器(或其他安全服务器)进行身份验证。例如,要求人工用户提供正确的密码
  • 在进行身份验证之前,不接受对API的调用。

    在身份验证期间,将返回一个“令牌”

    身份验证后,只接受带有身份验证“令牌”的API调用

    当然,在这个阶段,只有拥有密码的授权用户才能访问API,尽管如果他们是调试应用程序的程序员,他们可以出于测试目的直接访问API

  • 第二步:现在设置一个额外的安全API,即在最初从服务器请求客户端js+html应用程序后的短时间内调用。此“回调”将告诉服务器客户端已成功下载。仅当最近成功请求客户端时,才限制REST API调用工作
  • 现在,为了使用您的API,他们必须首先下载客户端并在浏览器中实际运行它。只有在成功接收回调后,然后在短时间内接收用户条目,API才会接受调用

    因此,您不必担心这可能是一个没有凭据的未经授权的用户


    (问题的标题是“如何保护REST API调用的安全”,从您所说的大部分内容来看,这是您主要关心的问题,而不是API如何调用的字面问题,而是由谁调用的问题,对吗?

    现在有一个开放标准,名为“JSON Web令牌”

    见,

    JSON Web令牌(JWT)是一个基于JSON的开放标准(RFC 7519),用于 创建断言一定数量声明的令牌。例如,一个 服务器可以生成声明为“以管理员身份登录”的令牌 并提供给客户。然后,客户机可以使用该令牌 证明他们以管理员身份登录。令牌由 服务器的密钥,以便服务器能够验证令牌是否正确 合法的。令牌设计为紧凑、URL安全和可用 特别是在web浏览器单点登录(SSO)环境中。JWT声称可以 通常用于在 身份提供商和服务提供商,或任何其他类型的索赔 根据业务流程的要求。[1][2]代币也可以 经过身份验证和加密。[3][4]

  • 当客户端首次加载
    index.html
    (或
    backbone.js
    等)时,在服务器上设置会话变量

  • 在服务器端的每个API调用上检查此var

  • 另外,这不是一个“安全”解决方案!!!这只是为了减轻服务器上的负载,这样人们就不会滥用它或从其他网站“热链接”您的API