ruby-on-rails – 将Rails 4中的GET路由限制为仅限app

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

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

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

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

Rails:4.2.6

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

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

>将密钥嵌入客户端应用程序.
>每当客户端应用程序发出请求时,它:

>生成一次只能使用一次的UUID. (“nonce”).
>通过使用密钥对随机数进行散列来生成签名.
>将nonce和签名与请求一起传递(可能是HTTP头)

>当服务器收到请求时,它会根据传入的现时和密钥(它已经知道)生成签名.如果签名匹配,并且之前从未使用过nonce,则服务器返回内容.如果其中任何一个条件不成立,那么服务器无法保证它是您的客户端应用程序发出请求,因此应该响应失败.

免责声明:

>这完全取决于客户端应用程序中嵌入的密钥的安全性.如果密钥被黑客攻击(并且攻击者会给予足够的努力),那么这个方案就会崩溃.

>如果您对所有客户端应用程序使用相同的密钥(并且您很可能需要,具体取决于您的应用程序架构),那么如果一个客户端应用程序安装被黑客入侵,您将失去所有安装的安全性.

>这只是一般原则的说明,而不是完全成熟的安全实施.我不是安全专家,并没有完成此计划的所有潜在攻击向量.

我还建议您阅读OAuth的工作原理.它解决了类似的问题,您可以根据自己的需要进行调整.

点赞