You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ruby Cuba框架CSRF:表单使用及路由传值示例讲解

Ruby Cuba框架的CSRF防护与路由传参示例

一、表单中启用CSRF防护

Cuba框架通过Cuba::Safe模块提供内置的CSRF防护支持,步骤如下:

  1. 启用相关模块
    在你的Cuba应用中,先加载Cuba::Safe和模板渲染模块(以Cuba::Render为例),示例代码:

    require "cuba"
    require "cuba/safe"
    require "cuba/render"
    require "erb"
    
    Cuba.plugin Cuba::Safe
    Cuba.plugin Cuba::Render
    
    Cuba.define do
      # 路由定义写在这里
    end
    
  2. 在表单中插入CSRF令牌字段
    在ERB模板里,使用csrf.form_tag辅助方法,它会自动生成包含CSRF令牌的隐藏input字段。示例表单:

    <form action="/submit" method="POST">
      <%= csrf.form_tag %>
      <input type="text" name="content" placeholder="输入内容">
      <button type="submit">提交</button>
    </form>
    

    渲染后生成的HTML会包含类似这样的隐藏字段:

    <input type="hidden" name="_csrf" value="随机生成的CSRF令牌字符串">
    
  3. 自动验证机制
    当处理POST/PUT/DELETE等非GET请求时,Cuba::Safe会自动校验请求中的CSRF令牌是否与会话中的令牌匹配。不匹配时直接返回403 Forbidden响应,无需手动编写验证逻辑。

二、向路由传递数据的简单示例

1. 动态路由参数传递

通过定义带占位符的路由,直接获取URL中的参数:

Cuba.define do
  # 渲染表单页面
  on get, "form" do
    res.write render("form.erb")
  end

  # 接收表单提交的POST请求,获取表单参数
  on post, "submit" do
    content = req.params["content"]
    res.write "你提交的内容是:#{content}"
  end

  # 动态路由:传递用户ID参数
  on get, "user/:id" do |user_id|
    res.write "当前查看的用户ID:#{user_id}"
  end
end

2. 向模板传递数据

如果需要在路由中处理数据后传递给模板渲染,可通过局部变量实现:

# 路由定义
on get, "greet/:name" do |name|
  res.write render("greet.erb", name: name)
end

# greet.erb模板内容
<h1>你好,<%= name %>!</h1>

内容的提问来源于stack exchange,提问作者user29559775

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 05:05:57