SuperAPI AI 工具集

security

安全与审计

查看项目

更新于 10-15 13:50

技能介绍

Rails Security Expert 是一个面向 Ruby on Rails 应用的安全编码技能,目标是让开发者(以及 AI 代理)默认写出安全的代码,避免 XSS、SQL 注入等能瞬间危及全部用户的危险错误。资料给出的核心理念包括:默认安全(Rails 自带优秀防护,未经明确且书面的理由不得禁用)、纵深防御(叠加多层保护)、白名单优先于黑名单(输入校验、URL 协议、HTML 标签、重定向目标均优先用允许列表)、永不信任用户输入(每个参数、请求头、Cookie 与 URL 片段在证明安全前都视为攻击者可控)、失败即拒绝(授权不明确时拒绝访问,输入可疑时拒绝)、最小暴露(少记日志、少暴露、少存储)。

【适用场景】资料列出的使用时机包括:添加认证或授权逻辑;编写接收用户输入的控制器;在视图中渲染用户生成内容;构建 API 端点;处理文件上传或下载;配置会话、Cookie 或 CSRF 防护;管理密钥与凭据;设置 HTTP 安全头或 CSP;审查代码中的安全漏洞;修复已报告的 CVE 或安全问题。

【使用方式】技能以分步指令形式组织,每步都配有可运行的命令或代码示例。 第一步:审计现有安全状况。先用 rg 检索 protect_from_forgery、params.permit/require、.html_safe/raw、字符串插值 SQL、redirect_to 携带 params、content_security_policy、force_ssl、filter_parameters、credentials 等配置,避免在改动时无意削弱既有防护。 第二步:CSRF 防护。强调绝不禁用 CSRF,Rails 默认开启;所有非 GET 请求需要真实性令牌,布局 head 中需包含 csrf_meta_tags;仅在不使用 Cookie 会话的纯 Token 认证 API 控制器中可跳过,浏览器会话控制器上使用 skip_forgery_protection 属于错误做法。 第三步:XSS 防护。Rails 默认自动转义 ERB 输出;raw、html_safe、<%== 会绕过转义,应避免;渲染可信 HTML 前需先 sanitize 并显式指定允许标签与属性;绝不把 .html_safe 用在用户输入或包含用户数据的插值字符串上;在 helper 中构建 HTML 应使用 tag 构建器或 content_tag,必要时手动 ERB::Util.html_escape。 第四步:SQL 注入防护。禁止把用户输入插值进 SQL 字符串;应使用参数化查询(? 占位、命名参数、Hash 条件);LIKE 查询需用 sanitize_sql_like 处理通配符;order、pluck、select、group、having、joins、find_by_sql、connection.execute、Arel.sql 等方法也会把字符串直接传给 SQL,其中 order 排序应使用允许列名与 asc/desc 方向的白名单。 第五步:批量赋值保护。每个模型写入都应使用 strong parameters;绝不允许从用户输入中 permit :role、:admin、:is_admin、:verified 等权限属性;嵌套属性需显式允许。 第六步:认证。无密码邮件验证码认证建议参考 magic-link-auth 技能,不要使用 Rails 8 密码生成器;基于密码的应用从 bin/rails generate authentication 生成器出发;应使用 has_secure_password 与具备时序安全的 authenticate_by;登录后调用 reset_session 防止会话固定;修改密码或邮箱需验证当前密码;错误信息应统一为“邮箱或密码无效”;可用 rate_limit 限制登录尝试。 第七步:授权。查询应限定到当前用户,例如 Current.user.projects.find;也可使用 Pundit 等策略对象;每个动作都要检查授权,建议在 ApplicationController 中使用默认拒绝的 before_action,再对公开页面选择性 skip_before_action。 第八步:会话安全。生产环境设置 force_ssl = true;会话 Cookie 建议 secure、httponly、same_site: :lax;会话中只存 ID;登录后 reset_session;实现绝对与空闲超时。 第九步:密钥与凭据。使用 Rails credentials 或环境变量;用 credentials:edit 编辑(可指定环境);用 credentials.some_api_key! 在缺失时大声失败;绝不提交 master.key 或 credentials/*.key;生产使用 ENV["RAILS_MASTER_KEY"];避免在日志或错误信息中暴露凭据;疑似泄露后立即轮换。 第十步:内容安全策略。在初始化文件中配置 default_src、font_src、img_src、object_src、script_src、style_src、connect_src、frame_ancestors、report_uri;使用 nonce 替代 'unsafe-inline';布局 head 中包含 csrf_meta_tags、csp_meta_tag,并为 script/javascript_include_tag、stylesheet_link_tag 加 nonce: true。 第十一步:日志安全。在 filter_parameter_logging 中追加 :passw、:secret、:token、:_key、:crypt、:salt、:certificate、:otp、:ssn、:credit_card、:card_number、:cvv、:authorization 等过滤项;避免记录密码、令牌、API 密钥、信用卡号、SSN 等 PII 以及可能含敏感数据的完整请求体。 第十二步:重定向安全。禁止 redirect_to params[:return_to] 这类开放重定向;应只允许内部路径,可用 safe_redirect_path 校验(相对路径且以 / 开头),或直接使用 Rails 7+ 的 url_from(params[:return_to]) || root_path。 第十三步:文件上传安全。校验内容类型与文件扩展名,限制大小(示例为小于 10MB),生产环境不通过应用域名提供上传文件,不使用用户提供的文件名存储,上传文件不执行,图像处理异步进行,敏感应用做恶意软件扫描。

【参考与检查】文档提供了一组危险模式检索命令,用于查找 .html_safe/raw/<%==、字符串插值 where、order(params、params.permit!、redirect_to 携带 params、skip_forgery_protection、硬编码密钥、system/exec 与反引号命令注入等;还指出 Ruby 正则中 ^ 与 $ 匹配行边界而非字符串边界,校验 URL 应使用 \A 与 \z。资料最后列出反模式清单,每条对应一种漏洞:用户输入上的 html_safe(XSS)、SQL 字符串插值(SQL 注入)、params.permit!(可设管理标志与角色)、浏览器控制器上 skip_forgery_protection(CSRF)、redirect_to params[:url](开放重定向)、源码中硬编码密钥、Kernel#open 接收用户输入(命令注入,应改用 File.open、URI.open 或 IO.open)、生产环境禁用 force_ssl、记录敏感数据、信任客户端校验。

【限制】资料未提供该技能的安装命令、版本号、收费方式、授权许可或平台支持范围等信息,这些内容暂未提供;技能说明主要面向 Rails 应用安全实践,未涉及非 Rails 技术栈。