Sinatra CSRF真品令牌

sla*_*ote 13 ruby csrf sinatra

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

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

Pat*_*ity 27

使用rack_csrf宝石.安装它

gem install rack_csrf
Run Code Online (Sandbox Code Playgroud)

rack_csrf宝石有西纳特拉例子.下面是一个从这个页面改编的更简单的例子(似乎离线.存档版本):

require "rack/csrf"

configure do
  use Rack::Session::Cookie, :secret => "some unique secret string here"
  use Rack::Csrf, :raise => true
end
Run Code Online (Sandbox Code Playgroud)

在大多数情况下使用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
Run Code Online (Sandbox Code Playgroud)

使用辅助方法的小例子:

<form method="post" action="/tweet">
  <%= csrf_tag %>
  <input type="text" name="message"/>
  <input type="submit" value="Submit a tweet!"/>
</form>
Run Code Online (Sandbox Code Playgroud)

  • 应该注意的是,`enable:sessions`与`use Rack :: Session :: Cookie`不相似但不相同.前者会为您设置一个自动的,无需思考的会话,而后者可以让您在会话上设置过期.请务必选择最适合您的方案的选项.也就是说,他们都会在这个问题的答案中完成这项工作.http://www.sinatrarb.com/faq.html#sessions (3认同)