SzymonnSowula/safecoder
GitHub: SzymonnSowula/safecoder
为 AI 编码代理提供安全防护栏的工具,将安全审查规范以 Markdown 指令形式注入代理工作流,确保 AI 生成的代码默认遵循安全最佳实践。
Stars: 1 | Forks: 0
# 🛡️ SafeCoder
AI 代理交付的是**能运行**的应用,而不是**安全**的应用。SafeCoder 将每一次构建转化为结构化的安全审查 —— 速率限制、电子邮件验证、密钥管理、XSS/CSRF/CSP 加固、SQL/命令/路径注入预防、提示注入防御、授权、安全的 CI/CD 等。
专为 **Claude Code**、**Codex**、**OpenCode**、**Hermes Agent** 以及任何读取 Markdown 指令的编码代理而构建。
## 它可以防范什么
| 风险 | 为什么重要 | 默认防护措施 |
|------|---------------|-------------------|
| 无速率限制 | 垃圾注册、联系表单滥用、暴力破解 | 默认使用基于 IP 的速率限制 |
| 无电子邮件验证 | 任何人都可以使用他人的电子邮件进行注册 | 账号激活前必须验证电子邮件 |
| 前端包含 API 密钥 | 审查元素 → 免费获取你的 Firebase/Supabase/OpenAI 密钥 | 密钥仅保留在后端 |
| XSS | 用户输入被当作代码渲染 | 输出编码,CSP,清理 HTML |
| 提示注入 | LLM 因用户输入而忽略系统指令 | 指令边界,允许列表,输出验证 |
| SQL 注入 | 数据库被盗,数据丢失 | 参数化查询 / ORM |
| 命令注入 | 服务器被入侵 | Shell 命令中不包含用户输入 |
| 路径遍历 | 未经授权的文件访问 | 验证路径,随机文件 ID |
| 不安全的文件上传 | 恶意软件,RCE | 允许列表的 MIME/类型,大小限制,沙箱 |
| 缺少 authz | 用户相互访问对方的数据 | 资源级别的所有权检查 |
| 不安全的 headers | 点击劫持,MIME 嗅探,来源泄露 | 默认开启安全 headers |
| 错误的 CORS | 跨站已认证请求 | 精确来源允许列表 |
| Git 中泄露的机密 | 密钥永久暴露 | Pre-commit 钩子 + `.env.example` 模式 |
| 不安全的 CI/CD | 工作流中包含机密,未审查的部署 | 机密管理器 + 分支保护 |
## 快速开始
### Hermes Agent — 一行代码安装
```
bash <(curl -fsSL https://raw.githubusercontent.com/SzymonnSowula/safecoder/main/install.sh)
```
或通过 npm 安装(推荐):
```
npm install @szymonsdev/safecoder
npx safecoder install
```
这会添加 skill 和别名:
```
hermes-web # hermes -s safecoder
hermes-app # hermes -s safecoder
hermes-api # hermes -s safecoder
```
启动一个新的终端,然后在构建任何 Web 项目之前运行 `hermes-web`。
### Vercel Skills / open agent skills
SafeCoder 兼容 `npx skills`:
```
npx skills add SzymonnSowula/safecoder@safecoder
```
### 初始化项目
```
npx safecoder init
```
在项目中创建:
- `AGENT_SECURITY.md`
- `.env.example`
- `scripts/security-audit.sh`
- `SECURITY.md`
- `.github/workflows/security-audit.yml` (如果存在 `.github/workflows`)
### 与 Claude Code / Codex / OpenCode 配合使用
将 `skills/safecoder/SKILL.md` 作为 `AGENT_SECURITY.md` 复制到你的项目中,并告诉代理:
或者将 `skills/safecoder/templates/PROMPT.md` 中的简短提示词粘贴到上下文中。
## 包含内容
```
safecoder/
├── README.md
├── LICENSE
├── package.json # npm package + CLI
├── install.sh # One-line installer for Hermes
├── init-project.sh # Adds SafeCoder files to a project
├── bin/
│ └── cli.js # npx safecoder install / init
├── scripts/
│ └── sync-vercel-skill.sh # Syncs skill layout for Vercel Skills
├── .github/workflows/security-audit.yml # CI workflow
├── skills/safecoder/ # Vercel Skills layout
│ ├── SKILL.md
│ ├── references/
│ ├── templates/
│ └── scripts/
└── skills/software-development/safecoder/ # Hermes skill layout
├── SKILL.md
├── references/
│ ├── security-checklist.md
│ ├── rate-limiting-patterns.md
│ ├── xss-prevention.md
│ ├── prompt-injection-defense.md
│ ├── auth-patterns.md
│ ├── jwt-oauth2-patterns.md
│ ├── file-upload-security.md
│ ├── cors-guide.md
│ ├── logging-monitoring.md
│ ├── ci-cd-security.md
│ ├── api-design-security.md
│ └── owasp-top-10-for-ai-apps.md
├── templates/
│ ├── env.example
│ ├── security-config.yaml
│ ├── security-decision-record.md
│ ├── SECURITY.md
│ └── PROMPT.md
└── scripts/
└── security-audit.sh
```
## 发布前安全检查清单
每个使用此 skill 的项目在合并前都必须通过以下检查:
- [ ] 在身份验证、注册、联系、密码重置和 API 端点上存在速率限制
- [ ] 速率限制由 IP(不仅是电子邮件)强制执行,并为已认证的路由提供用户回退机制
- [ ] 账户执行特权操作前必须进行电子邮件验证
- [ ] 前端包中不存在任何 API 密钥、数据库 URL 或私有 token
- [ ] 所有机密信息均在后端从环境变量中读取
- [ ] 用户输入在服务器端进行验证,在输出时进行转义,并在允许 HTML 时进行清理
- [ ] 数据库查询使用参数化语句或 ORM 方法
- [ ] 没有用户输入到达 shell、eval、exec 或原始 SQL
- [ ] 文件上传使用允许列表的 MIME/类型、随机 ID 和大小限制
- [ ] 内容安全策略阻止内联脚本并限制脚本来源
- [ ] 设置了安全 headers(`X-Frame-Options`、`X-Content-Type-Options`、`Referrer-Policy` 等)
- [ ] CORS 限制已认证端点的来源(不使用 `*`)
- [ ] LLM 系统提示与用户内容隔离,并且输出根据 schema 进行验证
- [ ] AI API 调用受到速率限制和成本上限控制
- [ ] 资源访问检查确认已登录用户拥有所请求的资源
- [ ] `.env` 文件包含在 `.gitignore` 中,并且提交了 `env.example`
- [ ] 在代码到达 GitHub 之前,由 Pre-commit 钩子或 CI 扫描机密信息
- [ ] 在 CI 中扫描依赖项的已知漏洞
完整版本位于 [`references/security-checklist.md`](skills/software-development/safecoder/references/security-checklist.md)。
## 示例:基于 IP 的速率限制
```
from slowapi import Limiter, _rate_limit_exceeded_handler
from slowapi.util import get_remote_address
from slowapi.errors import RateLimitExceeded
from fastapi import FastAPI, Request
limiter = Limiter(key_func=get_remote_address)
app = FastAPI()
app.state.limiter = limiter
app.add_exception_handler(RateLimitExceeded, _rate_limit_exceeded_handler)
@app.post("/auth/signup")
@limiter.limit("5/minute")
def signup(request: Request):
...
```
更多模式请参见 [`references/rate-limiting-patterns.md`](skills/software-development/safecoder/references/rate-limiting-patterns.md)。
## 示例:将机密信息排除在前端之外
❌ **绝不这样做:**
```
const supabase = createClient(
"https://your-project.supabase.co", // public URL is fine
"eyJhbG...VCJ9..." // NEVER put service-role key here
);
```
✅ **请改为这样做:**
- 前端仅获取开启了 RLS 的 **anon/public** 密钥
- 后端 service-role 密钥保留在服务器上的 `SUPABASE_SERVICE_ROLE_KEY` 中
- 所有特权操作都通过你的 API 进行,绝不直接从浏览器进行
## 本地审计
将 `scripts/security-audit.sh` 复制到你的项目根目录并运行:
```
bash scripts/security-audit.sh
```
它会检查:
- 提交的 `.env` 文件
- 缺失的 `.gitignore` 条目
- 源代码中可能存在的机密
- 前端路径中的后端机密
- 危险的函数(`eval`、`innerHTML` 等)
- SQL 字符串格式化
- 通配符 CORS
- 依赖项漏洞
## 为什么会有这个项目
AI 编码代理追求的是“它能运行吗?”,而不是“它安全吗?”。SafeCoder 为每一个生成的功能增加了一个安全层,这样你就不会一觉醒来面对 5,000 美元的 OpenAI 账单、充满垃圾信息的数据库或泄露的客户数据。
它是刻意为之的:
1. **默认安全** —— 显式关闭保护,而不是意外关闭。
2. **代理可读** —— 以 LLM 可以遵循的指令形式编写。
3. **框架无关** —— 适用于 Next.js、FastAPI、Node、Rails、Laravel、Tauri 等。
4. **可操作** —— 每条规则都附带代码示例和验证步骤。
## 发布到 npm
发布为 [`@szymonsdev/safecoder`](https://www.npmjs.com/package/@szymonsdev/safecoder)。
要发布新版本:
1. 在 `package.json` 中更新 `version`。
2. 运行:
npm publish --access=public
如需自动发布,请将 `NPM_TOKEN` 机密添加到仓库设置中。`.github/workflows/npm-publish.yml` 中的 GitHub Action 将在每次 GitHub 发布时进行发布。
## 许可证
MIT
标签:AI编程助手, DevSecOps, MITM代理, 上游代理, 代码安全, 安全规范, 暗色界面, 漏洞枚举, 漏洞防御, 防御加固