Ruby 提供了 CGI::Cookie
处理 HTTP Cookie,允许 Web 应用存储用户状态、会话信息等。本文介绍 Ruby CGI 中 Cookie 的创建、读取、修改和删除,并包含 代码示例和注意事项。
📌 目录
- 🔹 什么是 Cookie?
- 🔹 CGI::Cookie 简介
- 🔹 设置 Cookie
- 🔹 读取 Cookie
- 🔹 修改 Cookie
- 🔹 删除 Cookie
- 🔹 Cookie 选项说明
- 🔹 Cookie 实践示例
- 🔹 参考资料
🔹 什么是 Cookie?
Cookie 是 Web 服务器 存储在 浏览器 端的小型文本数据,可用于:
- 身份验证(如 Session ID)
- 保存用户偏好(如语言、主题)
- 跟踪用户行为(如统计分析)
在 Ruby 的 CGI 编程中,CGI::Cookie
允许 Web 应用管理 Cookie。
🔹 CGI::Cookie 简介
Ruby 提供 CGI::Cookie
类用于创建、读取、修改和删除 Cookie。
语法
CGI::Cookie.new(name: "cookie_name", value: "cookie_value", expires: Time.now + 3600)
参数说明
参数 | 说明 |
---|---|
name | Cookie 名称 |
value | Cookie 值(字符串或数组) |
expires | 过期时间(默认 nil ,会话 Cookie) |
path | Cookie 作用路径(默认 / ) |
domain | 作用域(如 .example.com ,默认 nil ) |
secure | 是否仅限 HTTPS 传输(true /false ) |
httponly | 是否禁止 JavaScript 访问(防止 XSS) |
🔹 设置 Cookie
服务器端通过 cgi.header
发送 Cookie 给客户端。
1. 发送单个 Cookie
require 'cgi'
cgi = CGI.new
cookie = CGI::Cookie.new("name" => "user", "value" => "RubyUser", "expires" => Time.now + 3600)
puts cgi.header("cookie" => cookie)
puts "<h1>Cookie 设置成功</h1>"
响应头
Set-Cookie: user=RubyUser; expires=Wed, 03-Apr-2024 12:00:00 GMT; path=/
2. 发送多个 Cookie
cookie1 = CGI::Cookie.new("name" => "user", "value" => "RubyUser")
cookie2 = CGI::Cookie.new("name" => "session", "value" => "123ABC")
puts cgi.header("cookie" => [cookie1, cookie2])
🔹 读取 Cookie
浏览器每次请求时,都会自动附带 Cookie
,可用 cgi.cookies
读取。
require 'cgi'
cgi = CGI.new
cookies = cgi.cookies
user_cookie = cookies["user"] # 读取名为 user 的 Cookie
session_cookie = cookies["session"]
puts "Content-type: text/html\n\n"
puts "<h1>读取 Cookie</h1>"
puts "<p>User: #{user_cookie}</p>"
puts "<p>Session: #{session_cookie}</p>"
示例请求头
Cookie: user=RubyUser; session=123ABC
🔹 修改 Cookie
修改 Cookie 需要 重新发送 Set-Cookie 头部。
require 'cgi'
cgi = CGI.new
cookie = CGI::Cookie.new("name" => "user", "value" => "UpdatedUser", "expires" => Time.now + 3600)
puts cgi.header("cookie" => cookie)
puts "<h1>Cookie 已修改</h1>"
新响应
Set-Cookie: user=UpdatedUser; expires=Wed, 03-Apr-2024 13:00:00 GMT; path=/
🔹 删除 Cookie
要删除 Cookie,需将 expires
设为 过去的时间。
cookie = CGI::Cookie.new("name" => "user", "value" => "", "expires" => Time.at(0))
puts cgi.header("cookie" => cookie)
puts "<h1>Cookie 已删除</h1>"
删除响应
Set-Cookie: user=; expires=Thu, 01-Jan-1970 00:00:00 GMT; path=/
🔹 Cookie 选项说明
Ruby 支持多种 Cookie 选项,可增强 安全性和作用范围。
1. 设定 Cookie 作用路径(Path)
cookie = CGI::Cookie.new("name" => "session", "value" => "123ABC", "path" => "/admin")
puts cgi.header("cookie" => cookie)
🔹 仅在 /admin
下有效,/user
访问不到。
2. 设定 Cookie 作用域(Domain)
cookie = CGI::Cookie.new("name" => "user", "value" => "Ruby", "domain" => ".example.com")
puts cgi.header("cookie" => cookie)
🔹 子域(sub.example.com
)也能访问。
3. 设定 Secure 仅 HTTPS 传输
cookie = CGI::Cookie.new("name" => "secure_cookie", "value" => "SecretData", "secure" => true)
puts cgi.header("cookie" => cookie)
🔹 浏览器仅在 HTTPS 连接时发送此 Cookie。
4. 设定 HttpOnly 防止 XSS 攻击
cookie = CGI::Cookie.new("name" => "session", "value" => "abc123", "httponly" => true)
puts cgi.header("cookie" => cookie)
🔹 JavaScript 不能读取此 Cookie,有效防止 XSS。
🔹 Cookie 实践示例
📌 完整示例:设置、读取和删除 Cookie
#!/usr/bin/env ruby
require 'cgi'
cgi = CGI.new
action = cgi['action']
puts "Content-type: text/html\n\n"
case action
when "set"
cookie = CGI::Cookie.new("name" => "user", "value" => "RubyUser", "expires" => Time.now + 3600)
puts cgi.header("cookie" => cookie)
puts "<p>Cookie 已设置</p>"
when "read"
cookies = cgi.cookies
user = cookies["user"]
puts "<p>读取 Cookie: #{user}</p>"
when "delete"
cookie = CGI::Cookie.new("name" => "user", "value" => "", "expires" => Time.at(0))
puts cgi.header("cookie" => cookie)
puts "<p>Cookie 已删除</p>"
end
访问
- 设置 Cookie:
http://localhost/cgi-bin/cookie.rb?action=set
- 读取 Cookie:
http://localhost/cgi-bin/cookie.rb?action=read
- 删除 Cookie:
http://localhost/cgi-bin/cookie.rb?action=delete
🔹 参考资料
✅ 总结
CGI::Cookie.new
创建 Cookiecgi.header("cookie" => cookie)
发送 Cookiecgi.cookies
读取 Cookieexpires = Time.at(0)
删除 Cookiesecure: true
仅限 HTTPS,httponly: true
防 XSS
💡 Ruby CGI Cookie 适用于 用户登录、会话管理、个性化设置 🚀
发表回复