Sinatra CSRF真品令牌

时间:2012-07-12 11:47:31

标签: ruby sinatra csrf

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

我必须去的地方: 嗯,我知道我需要csrf的令牌,但我不确定我是否需要自己生成它们或者Sinatra能否为我做这些 - 我查看了文档并且他们说Sinatra正在使用机架保护,但是,我找不到它的任何示例代码,似乎无法弄清楚如何让它继续 - 任何帮助升值 - 谢谢!

2 个答案:

答案 0 :(得分:27)

使用rack_csrf gem。用

安装
gem install rack_csrf

rack_csrf宝石有一个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 ...也会有效(请参阅Bill的评论)。

在您的视图中,您可以使用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>

答案 1 :(得分:0)

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

我们是否需要使用重定向代替渲染才能使其工作?因为在渲染中旧的csrf标记仍然存在。在完整的重定向中,我们生成了一个新令牌。