【问题标题】:Testing a sinatra route with csrf protection使用 csrf 保护测试 sinatra 路由
【发布时间】:2015-01-17 09:08:31
【问题描述】:

我正在尝试测试基本 sinatra 应用程序的路由,但由于 csrf 保护错误Rack::Csrf::InvalidCsrfToken,我的测试请求失败。 这些路由通常由客户端应用程序命中,其中包括通过 <meta> 标记的 csrf 令牌。 我尝试通过 Rack::Csrf.token 访问 csrf 令牌,但我无法访问 env(或者至少我不知道如何在我的 rpsec 测试中访问 env),并且有没有经历过成功。

app.rb

use Rack::Csrf, raise: true

put '/api/events/:id' do
  # ... code that updates an event ...
end

example_spec.rb

it "adds an event to the current user" do
  user = Helpers.authorized_user
  session = {user_id: user.id}

  put '/events/1/join', {}, {'rack.session' => session, :xhr => true}
do

在测试这些路由时如何规避/安抚 Rack:CSRF?

【问题讨论】:

    标签: rspec sinatra rack


    【解决方案1】:

    通过创建和传递一个秘密的 HTTP 标头变量很容易做到。 Check the docs

    use Rack::Csrf, :skip_if => lambda { |request|
      if settings.development?
          request.env.key?('HTTP_X_VERY_SPECIAL_HEADER')
      else
          false # Don't skip outside of testing
      end
    }
    
    put '/api/events/:id' do
        # ... code that updates an event ...
    end
    

    【讨论】:

    • 感谢您的回答!我想如果我在开发环境中,我只能在我的应用程序中设置skip_if,我更喜欢在测试框架中执行此操作而不是我的应用程序代码本身。对此有什么想法吗?
    • @NickTomlin 在测试框架内执行此操作会产生技术债务,因此这可能不是最好的方法(恕我直言)。我已经更新了我的答案,如果您在开发模式下运行,则只跳过 CSRF 检查,这可能不是您想要的,但希望可以为您指明正确的方向
    • 我已经在测试环境中禁用了 csrf,而不是使用特殊的 csrf 密钥,但想法基本相同。谢谢!
    • use Rack::Csrf, raise: true, skip_if: ->(req) { req.env['rack.test'] } 为我工作
    猜你喜欢
    • 2015-03-11
    • 2021-03-02
    • 2013-11-19
    • 2013-03-27
    • 2019-11-12
    • 2016-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多