
ECC 规则体系中的 Ruby/Rails 安全基线从 CSRF、参数化查询到依赖审计的纵深防御【免费下载链接】ECCThe agent harness performance optimization system. Skills, instincts, memory, security, and research-first development for Claude Code, Codex, Opencode, Cursor and beyond.项目地址: https://gitcode.com/GitHub_Trending/ev/ECC本文以 docs/ja-JP/rules/ruby/security.md 为骨架结合 ECCThe agent harness performance optimization system仓库中对应的 英文源规则、公共安全指南、security-review 技能 与 security-reviewer 代理 进行源码级扩充。它服务于在 Claude Code、Codex、Opencode、Cursor 等 harness 中开发或评审 Ruby / Rails 代码的场景帮助读者掌握一套默认安全secure-by-default的 Rails 应用加固清单、可落地的命令与可复用的评审工作流。规则定位与适用范围该安全规则是 ECC 规则体系rules/与docs/ja-JP/rules/中 Ruby 语言栈的组成部分。规则文件头部通过 YAML frontmatter 声明了它的自动生效范围与 英文源文件 一致paths: - **/*.rb - **/*.rake - **/Gemfile - **/Gemfile.lock - **/config/routes.rb - **/config/credentials*.yml.enc这意味着只要 Agent 触碰 Ruby 源码、Rake 任务、依赖清单、路由文件或加密凭据文件这条规则就会被加载。它的定位是以 common/security.md 为基础、叠加 Ruby 与 Rails 特有内容的扩展层——公共层负责全局的强制检查清单无硬编码密钥、输入校验、SQL 注入防护、XSS 防护、CSRF 保护、认证/授权验证、端点限流、错误信息不泄露敏感数据Ruby 层则把这些原则翻译成 Rails 生态的具体写法。Rails 默认安全设置先守住框架内置的防线规则首先强调能用 Rails 框架默认能力解决的就不要自己发明轮子。具体包括三条硬性要求对改变状态的浏览器请求保持 CSRF 保护开启。Rails 默认通过protect_from_forgery与csrf_meta_tags在表单/非 GET 请求中校验令牌规则要求不要为了便利而关闭它。这与 security-review 技能 中CSRF 令牌 SameSiteStrict Cookie的通用要求相互印证——Rails 的config/initializers与 Cookie 策略SameSite就是这一原则在服务端渲染场景下的落地载体。在批量赋值mass assignment之前使用 strong parameters 或类型化边界对象。即控制器中通过params.require(:user).permit(:name, :email)显式白名单字段而不是把整个 params 直接喂给User.create(...)从而防止攻击者通过注入admintrue之类的参数提权。从仓库的 Ruby 模式规则 看这一思路与其优先 Rails MVC 与 Active Record 约定、在模型/控制器边界职责过重时才引入 form object 等边界对象的取向一致。密钥存放在 Rails credentials、环境变量或密钥管理器中。明文密钥、令牌、私有凭据以及复制粘贴的.env值一律不得提交进版本库。这对应公共安全指南 common/security.md 中的NEVER hardcode secrets、ALWAYS use environment variables or a secret manager、启动时校验必需密钥存在、暴露过的密钥立即轮换四条规定也对应 frontmatter 中专门把config/credentials*.yml.enc纳入规则生效范围的设计意图——被版本化的只允许是 Rails 加密凭据文件而不是其明文。SQL 与 Active Record把注入面关死规则对数据库访问给出三层约束优先使用 Active Record 查询 API 与参数化 SQL。Model.where(email: user_input)、find_by、find_by_sql 占位符等写法属于安全基线字符串拼接 SQL 属于明确禁止项。绝不把请求、Cookie、Header、后台任务或 Webhook 的值插值进 SQL 字符串。这些来源全部被视为不可信输入即便它们看起来来自内部。这一点在 ECC 的 security-review 技能 中被标记为 CRITICAL 级别的代码模式String-concatenated SQL → Parameterized queries并且 security-reviewer 代理 的 OWASP Top 10 检查第一项就是 Injection查询是否参数化、用户输入是否消毒、ORM 是否被正确使用。模型回调callbacks的作用域要小心设定。安全敏感的副作用必须显式声明并覆盖测试。也就是说after_save/before_validation中如果存在写日志、发通知、改状态这类有安全影响的行为不能隐晦地藏在回调链深处而应有明确的测试证明其行为与边界。认证与会话生成器优先Devise 按需引入认证选型是 Ruby 规则中最具版本指向性的一条简单会话认证优先使用 Rails 8 认证生成器bin/rails generate authentication它开箱即出会话登录、密码重置所需的模型/迁移/控制器。当需求涉及 OAuth、MFA、confirmable、lockable、多模型认证或项目已有大量 Devise 约定时再引入 Devise。换言之Devise 不是默认项而是能力超出 Rails 8 生成器覆盖范围时的合理升级路径。这一选型逻辑与 Ruby 模式规则 中认证章节的表述完全一致说明 ECC 内部各规则文件之间保持着同一口径。会话生命周期管理还有两条硬规则登录成功与权限变更之后轮换会话session rotation防止会话固定session fixation攻击。账户恢复流程密码重置/找回必须由有效期、一次性令牌、速率限制与审计日志四件套保护。其中速率限制呼应公共规则中所有端点限流的要求而审计日志则对应 security-reviewer 代理 OWASP 检查项中的Insufficient Logging。依赖安全锁文件变更即触发审计规则要求在锁文件变化时执行依赖安全检查日文版给出的是bundle audit check --update bundle exec brakeman --no-pager英文源文件 rules/ruby/security.md 中对应写法为bundle exec bundle-audit check --update与bundle exec brakeman --no-progress。两种写法反映的是同一工具链bundler-audit检查已知 CVE 与过期依赖版本brakeman面向 Rails 应用做静态安全分析。具体使用哪种命令取决于项目安装方式gem 是否以bundle-audit或 bundler 插件形式提供项目 hooks 规则 在配置 PostToolUse 钩子时采用的是bundle exec bundle-audit check --update与bundle exec brakeman --no-progress可作为工程化落地的参考变体。除运行审计命令外规则还要求对新引入的 gem 做四维评估维护者活跃度是否还在维护、社区反馈如何原生扩展风险是否编译 C/Rust 扩展、构建链是否可信传递依赖transitive dependencies面是否可控能否用 Rails 核心能力实现相同行为——如果可以优先不引入新 gem这与整个规则文件Rails 默认优先的哲学一脉相承。Web 安全转义、上传与不可信边界模板输出默认转义html_safe、raw与自定义 sanitizer 一律按安全敏感代码对待。这意味着使用这些方法时必须有意识地确认数据来源与消毒逻辑不能当作普通渲染便利设施。这与 security-review 技能 的 XSS 章节框架自动转义、用户 HTML 必须消毒、CSP 严格起步互为印证。文件上传从内容类型、扩展名、大小与存储目标四个维度校验。规则没有给出具体阈值因为不同业务差别很大security-review 技能 中给出了一个可复制的通用示例5MB 大小上限、MIME 白名单image/jpeg|image/png|image/gif、扩展名白名单可在 Rails 的 Active Storage 校验或 CarrierWave 配置中套用。后台任务、Webhook、Action Cable 消息与 Turbo Stream 输入全部视为不可信边界。这是 Rails 特有的一条即使数据来自自己的系统只要经过了队列、推送通道或外部回调就必须按外部输入重新校验。这与 SQL 章节不插值 job/webhook 值的规定形成呼应——同样的价值观贯穿持久层与传输层。在 ECC 中的工程化落地技能、代理与钩子该规则并非孤立文档它在 ECC 仓库中有一条完整的规则 → 技能 → 代理 → 钩子落地链路规则 → 技能规则末尾明确指向security-review技能skills/security-review/SKILL.md该技能提供 10 大类的完整安全清单密钥管理、输入校验、SQL 注入、认证授权、XSS、CSRF、限流、敏感数据暴露、区块链安全、依赖安全以及自动化安全测试示例验证 401/403/400/429 状态码的测试模式。规则 → 代理公共安全指南 common/security.md 规定发现问题时立即停止 → 使用 security-reviewer 代理 → 修复 CRITICAL → 轮换密钥 → 全库复查。代理定义见 agents/security-reviewer.md其职责是检测 OWASP Top 10、硬编码密钥、未消毒输入与越权访问并内置了常见误报清单如.env.example中的占位值、测试文件中的测试凭据以避免过度告警。规则 → 钩子/CIRuby hooks 规则 建议在 PostToolUse 阶段自动执行bundle exec rubocop -A、bundle exec brakeman --no-progress、针对改动文件的bin/rails test/bundle exec rspec并在Gemfile/Gemfile.lock变化时运行 bundler-audit同时要求对提交的debugger/binding.pry/binding.irb/puts/pp调用发出警告对关闭 CSRF、扩大批量赋值、新增未参数化裸 SQL 的改动给出警告。CI 门禁建议为bundle exec rubocop、bundle exec brakeman --no-progress、bin/rails test、bundle exec rspec——但只使用项目实际存在的命令不擅自安装新钩子依赖。小结把默认安全写进评审流程纵观 docs/ja-JP/rules/ruby/security.md 全文它的核心方法论可以浓缩为一句话凡是框架能兜底的CSRF、转义、strong parameters、参数化查询一律交给框架默认行为凡是框架管不到的会话轮换、恢复流程、依赖审计、上传校验、不可信边界一律显式加固并用测试锁定。对于在 ECC harness 中编写或评审 Ruby / Rails 代码的 Agent 而言这意味着一条可执行的检查顺序先确认是否动用了**/*.rb、Gemfile、config/routes.rb、config/credentials*.yml.enc范围内的文件再依次过 Rails 默认项 → SQL 层 → 认证会话 → 依赖 → Web 安全五道关卡最后用bundle audit/brakeman与security-review技能、security-reviewer代理完成自动化的收尾验证。相关资源规则本体docs/ja-JP/rules/ruby/security.md日文、rules/ruby/security.md英文公共安全基线docs/ja-JP/rules/common/security.md、rules/common/security.md评审工具security-review 技能、security-reviewer 代理配套规则Ruby hooks、Ruby patterns、Ruby testing【免费下载链接】ECCThe agent harness performance optimization system. Skills, instincts, memory, security, and research-first development for Claude Code, Codex, Opencode, Cursor and beyond.项目地址: https://gitcode.com/GitHub_Trending/ev/ECC创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考