mcpField
S
security-protocol

security-protocol

github.com/noobygains安全11558 次安装3 天前更新
代码仓库

关于 security-protocol

security-protocol 是面向处理外部数据和敏感操作的开发者的安全编码技能,涵盖边界验证、访问控制、注入、机密信息及常见 Web 风险。

主要功能

  1. 01识别信任边界并验证输入
  2. 02检查授权与资源所有权
  3. 03防止查询和命令注入
  4. 04保护机密信息和敏感数据
  5. 05检查常见 Web 安全风险

适用场景

  1. 01构建接收用户输入的端点
  2. 02处理查询、文件或系统命令
  3. 03管理身份验证、授权或机密信息

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/noobygains/godmode --skill security-protocol

安装后在 Claude Code 中输入/security-protocol确认已加载。

详细介绍

安全协议

概述

安全不是事后附加的一个阶段。每一行代码都是一项安全决策。

**核心原则:**绝不信任信任边界之外的数据。每次跨越边界时都要进行验证。

没有例外。没有变通方法。没有捷径。

首要原则

NO EXTERNAL DATA REACHES A SYSTEM CALL, QUERY, OR OUTPUT WITHOUT VALIDATION AND SANITIZATION

数据跨越信任边界时,必须先经过验证才能使用。这是绝对原则。

适用场景

编写以下代码时必须遵守:

  • 接受用户输入(表单、URL、标头、上传的文件)
  • 构造数据库查询
  • 渲染用户提供的内容
  • 管理身份验证或授权
  • 处理机密信息或凭据
  • 调用外部 API
  • 操作文件路径
  • 执行系统命令
  • 设置 HTTP 响应标头
  • 处理文件上传

**这不是可自行决定的。**安全意识应融入开发过程,而不是事后才应用。

入口协议

BEFORE shipping ANY code that handles external data:

1. IDENTIFY: Where does data enter the system? (Trust boundary)
2. VALIDATE: Is input validated at the boundary?
3. SANITIZE: Is output encoded for its target context?
4. AUTHORIZE: Is access control verified before the action?
5. PROTECT: Are secrets, tokens, and keys managed safely?

Omit any step = vulnerability shipped

OWASP Top 10 精简指南

A01:访问控制失效

每个端点都必须验证:这个用户能否对这个资源执行这个操作?

# VULNERABLE: Checks authentication but not authorization
GET /api/accounts/456/profile  # User 123 views user 456's private data

# SECURE: Verify resource ownership
if resource.owner_id != authenticated_user.id:
    return 403 Forbidden
验证项方法
身份验证用户是否确实是其声称的身份?
授权是否允许此用户执行此操作?
资源所有权此用户是否拥有此特定资源?
角色执行在服务端检查角色;绝不信任客户端提供的角色声明

**默认策略:拒绝。**如果没有明确规则授予访问权限,则拒绝访问。

A02:加密失效
必须采用的做法禁止的做法
使用 bcrypt/scrypt/argon2 哈希密码使用 MD5、SHA1、SHA256 处理密码
全程使用 TLS(HTTPS)对任何敏感内容使用 HTTP
使用密码学安全的随机数生成器生成令牌使用 Math.random() 生成安全令牌
对静态存储的敏感数据进行加密以明文存储敏感数据
使用成熟的加密库自行实现加密算法
A03:注入

绝不将外部输入拼接到查询、命令或模板中。

注入类型防范方法
SQL 注入使用参数化查询/预处理语句。务必如此。
NoSQL 注入检查输入类型;使用 ODM 查询构造器
命令注入避免执行 shell 命令。如果无法避免:使用允许列表限制参数,绝不进行插值
LDAP 注入转义特殊字符;使用参数化查询
模板注入使用自动转义的模板引擎
-- VULNERABLE: String concatenation
SELECT * FROM users WHERE email = '" + userInput + "'

-- SECURE: Parameterized query
SELECT * FROM users WHERE email = $1

这是不可妥协的。任何情况下,都不能接受在查询中使用字符串拼接。

A04:不安全设计
  • 对身份验证端点实施速率限制
  • 创建账户时使用 CAPTCHA 或工作量证明
  • 在服务端验证业务逻辑约束(绝不能仅在客户端验证)
  • 针对滥用情形进行设计,而不只是针对预期用法
A05:安全配置错误
检查项操作
默认凭据部署前替换所有默认凭据
调试功能在生产环境中禁用调试模式、管理控制台和详细错误信息
错误信息详细程度绝不向用户暴露堆栈跟踪、SQL 错误或内部路径
目录列表在所有 Web 服务器上禁用
安全标头设置安全标头(参见“安全标头”部分)
CORS 策略限定为特定来源;对于携带凭据的请求,绝不使用 *
A06:易受攻击的组件
BEFORE adding any dependency:

1. Is it actively maintained? (Last commit within 6 months)
2. Are known vulnerabilities published? (npm audit, snyk, dependabot)
3. Is it widely adopted? (Download counts and stars are signals, not guarantees)
4. Is it actually necessary? (Do not add a dependency for a single utility function)

定期执行 npm audit / pip audit / cargo audit。立即修复严重和高危问题。

A07:身份验证失败
要求实现
密码存储使用 bcrypt/scrypt/argon2,并为每个密码生成唯一盐值
会话令牌使用经过加密安全处理的随机值,并设置 httpOnly、secure、sameSite 标志
暴力破解防护连续失败 5-10 次后锁定账户
多因素身份验证敏感应用至少支持 TOTP
密码策略至少 8 个字符;与泄露数据库交叉比对
会话生命周期设置会话过期时间;密码更改时使会话失效
A08:数据完整性失败
  • 验证软件更新和 CI/CD 流水线的完整性
  • 使用签名工件和校验和
  • 切勿自动反序列化不可信数据(不要对用户输入使用 eval() 或 pickle.loads())
A09:日志记录和监控失败
记录切勿记录
身份验证尝试(成功和失败)密码或身份验证令牌
授权拒绝完整的信用卡号码
输入验证失败未出于特定目的而记录的个人身份信息
系统错误加密密钥或机密
A10:服务器端请求伪造(SSRF)
  • 在发起服务器端请求前验证 URL 并将其加入允许列表
  • 切勿允许用户控制服务器端抓取所用的 URL
  • 阻止对内部网络的请求(169.254.x.x、10.x.x.x、127.x.x.x、192.168.x.x)

安全标头

在每个 HTTP 响应中设置以下标头:

Content-Security-Policy: default-src 'self'; script-src 'self'
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
Strict-Transport-Security: max-age=31536000; includeSubDomains
Referrer-Policy: strict-origin-when-cross-origin
Permissions-Policy: camera=(), microphone=(), geolocation=()

先采用严格限制,仅在特定需求要求时才放宽。

机密管理

NEVER:
- Embed secrets in source code
- Commit .env files to version control
- Write secrets to log output
- Transmit secrets in URL query parameters
- Store secrets in client-side code

ALWAYS:
- Use environment variables or dedicated secret managers
- Add .env to .gitignore BEFORE the first commit
- Rotate secrets on a defined schedule
- Use distinct secrets per environment
- Audit secret access

输入验证检查清单

对于每个输入字段:

  • 验证类型(字符串、数字、电子邮件、URL)
  • 限制长度(最小值和最大值)
  • 验证格式(对结构化数据使用正则表达式)
  • 检查范围(数字、日期)
  • 尽可能使用允许列表(枚举值、已知选项)
  • 针对输出上下文进行净化(HTML、SQL、shell)
  • 文件上传:通过检查内容而非扩展名来验证类型,并限制大小

认知陷阱

自我安慰事实
“这是内部工具,没有攻击者”内部工具也会遭到入侵。内部用户也会犯错。内部威胁确实存在。
“我们以后再加安全措施”安全不是一项功能。事后补上安全措施的成本是从一开始就做好安全措施的 10 倍。
“框架会处理这些问题”框架也有可绕过的机制。要确切了解框架会保护什么、不会保护什么。
“输入验证太过了”历史上的每一次注入攻击都始于未经验证的输入。
“这只是一个原型”原型会变成生产系统。从一开始就做好安全措施。
“太复杂了,会拖慢开发”数据泄露会永久拖慢开发。
“没人会那么做”攻击者恰恰会那么做。假设所有输入都带有恶意。

防护措施 -- 立即停止并修复

  • 在 SQL 查询中拼接字符串
  • 对用户提供的数据使用 eval() 或 exec()
  • 在源代码或已提交的配置文件中存放机密
  • 端点缺少授权检查
  • 未经编码就呈现用户输入
  • 在携带凭据时使用通配符 * CORS 策略
  • 对涉及身份验证或敏感数据的任何内容使用 HTTP
  • 仅进行客户端验证,没有对应的服务器端验证
  • 禁用 CSRF 防护
  • 在已部署的环境中使用默认凭据

此列表中的每一项都是安全漏洞。上线前必须修复。

集成

互补技能:

  • godmode:system-design -- 身份验证策略和数据流设计
  • godmode:quality-enforcement -- 将安全检查设为自动化质量门禁
  • godmode:completion-gate -- 上线前进行安全验证
  • godmode:test-first -- 编写以安全为重点的测试用例

总结

Trust boundary crossed -> validate input, sanitize output, verify authorization

没有例外。不要说“我们以后再加”。安全措施必须随代码一同交付,否则代码就不能交付。

评论

支持 Markdown