【问题标题】:How can I make Sinatra use CSRF Authenticity tokens?如何让 Sinatra 使用 CSRF Authenticity 令牌?
【发布时间】:2012-07-12 03:55:29
【问题描述】:

我正在使用 Sinatra 框架在 ruby​​ 中构建一个简单的应用程序。它主要基于“获取” - 大多数请求将用于列出数据。但是,应用程序中有几个关键屏幕可以收集用户输入。我想确保应用程序尽可能安全,并且目前正在尝试找到如何实现您在 Rails 表单中获得的那种真实性令牌?

我要去的地方: 好吧,我知道我需要 csrf 的令牌,但我不确定我是否需要自己生成它们,或者 Sinatra 是否可以为我生成它们 - 我查看了文档,他们说 Sinatra 正在使用 Rack Protection,但是,我找不到它的任何示例代码,而且似乎无法弄清楚如何让它运行 - 感谢任何帮助 - 谢谢!

【问题讨论】:

标签: ruby sinatra csrf


【解决方案1】:

使用rack_csrf gem。安装它

gem install rack_csrf

rack_csrf gem 有一个Sinatra example。下面是改编自this page 的一个更简单的示例(似乎离线。Archived version):

require "rack/csrf"

configure do
  use Rack::Session::Cookie, :secret => "some unique secret string here"
  use Rack::Csrf, :raise => true
end

在大多数情况下,使用enable :sessions 代替use Rack::Session::Cookie ... 也可以使用(请参阅比尔的评论)。

在您看来,您可以使用Rack::Csrf.csrf_tokenRack::Csrf.csrf_tag 方法获取令牌(或标签)。如果这看起来很长,您可能需要按照以下方式定义一个助手:

helpers do
  def csrf_token
    Rack::Csrf.csrf_token(env)
  end

  def csrf_tag
    Rack::Csrf.csrf_tag(env)
  end
end

使用辅助方法的小例子:

<form method="post" action="/tweet">
  <%= csrf_tag %>
  <input type="text" name="message"/>
  <input type="submit" value="Submit a tweet!"/>
</form>

【讨论】:

  • 这是来自 Google 缓存的链接:webcache.googleusercontent.com/…
  • @elevine 谢谢!我用帖子摘要更新了我的答案,以防它最终也从谷歌的缓存中消失。
  • Google 缓存确实下降了。感谢您将其保存在这里。
  • 需要注意的是enable :sessionsuse Rack::Session::Cookie不相似但又不一样。前者将为您设置一个自动的、无需思考的会话,后者允许您执行诸如设置会话到期之类的操作。请务必选择最适合您的方案的选项。也就是说,他们都会在这个问题的答案的背景下完成这项工作。 sinatrarb.com/faq.html#sessions
【解决方案2】:

当渲染相同的 erb 视图时,在登录时凭据无效的情况下。现在在提交时渲染后会引发错误。 Rack::Csrf::InvalidCsrfToken at /login Rack::Csrf::InvalidCsrfToken

我们是否需要做一个重定向来代替渲染来完成这项工作?因为在渲染中旧的 csrf 令牌仍然存在。在完整的重定向中,我们生成了一个新令牌。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-29
    • 1970-01-01
    • 1970-01-01
    • 2013-12-03
    • 2018-02-02
    • 2018-07-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多