【发布时间】: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_origins 和origin_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