13

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

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

4

2 回答 2

28

使用rack_csrf宝石。安装它

gem install rack_csrf

rack_csrfgem 有一个Sinatra示例。以下是改编自此页面的更简单示例(似乎离线。存档版本):

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_token在您看来,您可以使用andRack::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>
于 2012-07-12T11:51:36.390 回答
0

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

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

于 2018-02-08T06:52:22.627 回答