将Rails 4中的GET路由限制为仅适用于应用程序

时间:2016-05-18 18:24:46

标签: ruby-on-rails ruby

我们有一个JSON哈希,后端处理并提供给我们的前端来计算地图。 JSON哈希是从GET请求呈现的,并且不断更新(不缓存)。

我们需要一种方法来锁定路由,以便只有应用程序本身可以连接到它(阻止机器人ping ping URL以获取哈希值)。前端和后端在一个Rails应用程序中绑定在一起(没有单独的服务)。

我的问题是ActionController :: RequestForgeryProtection :: ClassMethods不支持GET和ActionController :: HttpAuthentication :: Token是过度的,因为我需要将JSON哈希限制到应用程序(而不是特定用户)。 Request.referrer可以被欺骗,所以我在检查时犹豫不决。

如果不是应用程序发出请求,我会很感激如何拒绝向控制器发出外部GET请求。

Rails:4.2.6

1 个答案:

答案 0 :(得分:2)

您将无法阻止任意程序(即:“用户代理”)对您的服务器发出HTTP请求。但是,您可以拒绝回复有用的内容,除非用户代理可以证明它是您的应用程序。

您要做的是在客户端应用中对您的请求进行加密签名,然后在响应之前验证服务器上的签名。我不知道有任何Ruby / Rails库可以做到这一点(我在粗略搜索时找不到任何东西),但它可以从现有的库中构建。这是一个快速而肮脏的实现概念:

  1. 将密钥嵌入客户端应用程序。
  2. 每当客户端应用发出请求时,它都会:
    1. 生成一次只能使用一次的UUID。 (“nonce”)。
    2. 通过使用密钥对nonce进行散列来生成签名。
    3. 将随机数和签名与请求一起传递(可能是HTTP标头)
  3. 当服务器收到请求时,它会根据传入的现时和密钥(它已经知道)生成签名。如果签名匹配, nonce之前已经从未使用,则服务器返回内容。如果其中任何一个条件不成立,那么服务器无法保证它是您的客户端应用程序发出请求,因此应该响应失败。
  4. 免责声明:

    1. 这完全取决于客户端应用程序中嵌入的密钥的安全性。如果密钥被黑客攻击(并且攻击者会给予足够的努力),那么这个方案就会崩溃。
      1. 如果您对所有客户端应用程序使用相同的密钥(并且您很可能需要,具体取决于您的应用程序架构),那么如果一个客户端应用程序安装被黑客入侵,您将失去所有应用程序的安全性你的装置。
    2. 这只是一般原则的说明,而不是完全成熟的安全实施。我不是安全专家,也没有完成这个计划的所有潜在攻击向量。
    3. 我还建议您阅读OAuth的工作原理。它解决了类似的问题,您可以根据自己的需要进行调整。