ruby - 如何让 Sinatra 使用 CSRF 真实性 token ?

标签 ruby sinatra csrf

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

我要去的地方: 好吧,我知道我需要 csrf 的 token ,但我不确定我是否需要自己生成它们,或者 Sinatra 是否可以为我生成它们 - 我已经查看了文档,他们说 Sinatra 正在使用机架保护,但是,我找不到它的任何示例代码,而且似乎无法弄清楚如何让它继续 - 任何帮助表示赞赏 - 谢谢!

最佳答案

使用 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 ... 在大多数情况下也可以工作(参见 Bill 的评论)。

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

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>

关于ruby - 如何让 Sinatra 使用 CSRF 真实性 token ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11451161/

相关文章:

javascript - 如何在 JS 中为我​​的 ruby​​ 应用程序定义 clientWidth?

ruby-on-rails - 在 Ruby 中为 S3 Bucket 生成预签名 URL 的推荐方法

ruby - 类内的路由处理程序

nginx - 无法使用 --from-code 选项创建 OpenShift 应用程序

python - 程序员可能想要使用 csrf_exempt 的例子有哪些?

字符串中的 Ruby 日期时间转换为以毫秒为单位的日期时间

ruby - 如何循环处理大文件作为另一个文件的输入

ruby sqlite3 sinatra 无法执行 db :Migrate

node.js - 注销并获取 new/csrfToken 后 SailsJS CSRF 不匹配

python - 手动CSRF验证