【问题标题】:Sinatra how use Rack::Protection::AuthenticityToken except for certain api routesSinatra 如何使用 Rack::Protection::AuthenticityToken 除了某些 api 路由
【发布时间】:2020-09-30 09:59:41
【问题描述】:

我正在尝试将经典的 Sinatra 2.0.8.1 应用程序(“www.example.com”)配置为在某些但不是所有路由上使用Rack::Protection,尤其是Rack::Protection::AuthenticityToken

内部表单(在应用程序内)工作正常。每个表单都有一个隐藏的 CSRF 真实性令牌,因此应用程序 in 的表单可以 POST 数据到应用程序 in 的路由。

但是,我找不到任何文档,如何为某些路线排除或跳过 AuthenticityToken,以便 外部 应用可以将数据发布到此应用。

在这种情况下,我们有几个路由,我们的其他两个应用程序('foo.example.com' 和 'bar.example.com')将数据发送到这些路由。但是当我们实现 Rack::Protection::AuthenticityToken 时,所有这些路由现在在发布到时都会返回 403。

我已经尝试了各种方法,例如permitted_originsorigin_whitelist,如下所示,但是除非我为整个应用禁用Rack::Protection::AuthenticityToken,否则任何外部应用都无法向 Sinatra 应用发布数据。

# foo.example.com
# doesnt work:
require 'rack/protection'
use Rack::Protection, permitted_origins: ["https://foo.example.com", "https://bar.example.com"]
set :protection, :origin_whitelist => ['https://foo.example.com', 'https://bar.example.com'], except: [:remote_token, :frame_options, :path_traversal] 
use Rack::Protection::AuthenticityToken
use Rack::Protection::RemoteReferrer

肯定有一些机制可以“省略”某些路由上对 CSRF 令牌的要求,例如接收 POST 数据的 api 路由?

【问题讨论】:

    标签: sinatra rack csrf-token


    【解决方案1】:

    虽然这个解决方案让我觉得很脏,但它确实奏效了:

    1. 将所有路由放在它们自己的文件/类中(有点像 Rails 中的控制器)

    2. 我不想使用 CSRF 令牌的 (api) 路由,我在进行机架保护初始化之前use THAT 类文件。

    3. 包含我想要保护免受 CSRF 影响的(正常)路由的类在 Rackprotection 初始化之后得到use

    use Rack::Protection
    set :protection,  except: [:path_traversal]
    
    # FIRST LOAD ROUTES *NOT* PROTECTED BY Rack::Protection::AuthenticityToken
    
    use ApplicationController
    use ApipostController # external POST routes to omit 
    
    # NOW enable the AuthenticityToken protection
    
    Rack::Protection::AuthenticityToken
    use Rack::Protection::AuthenticityToken
    use Rack::Protection::RemoteReferrer
    
    # now LOAD NORMAL ROUTES TO BE PROTECTED BY Rack::Protection::AuthenticityToken
    
    use FooController 
    use BarController 
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-07
      • 2012-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-22
      • 2021-07-02
      • 1970-01-01
      相关资源
      最近更新 更多