skills/backend-engineering/SKILL.md
后端资深工程师技能 - 架构设计、服务端开发、中间件、错误处理、日志、配置管理、部署运维。当你涉及后端服务开发、Go/Python/Node/Java/PHP后端代码、中间件配置、服务间通信、配置管理、日志策略、进程管理、交叉编译、部署流程时必须使用此技能。即使用户只是说"写个接口"或"后端加个功能",也应触发。
npx skillsauth add 0X6C7879/aegissec backend-engineeringInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
[后端核心清单] ① 入参永远不信任客户端,服务端必须重新校验所有字段(类型/范围/长度/格式) ② 错误分层处理:参数层→业务层→基础设施层,每层有明确的错误码和用户可读消息 ③ 配置不硬编码,用环境变量/配置文件/数据库,支持热加载 [事务三禁] ❌事务内调外部HTTP(外部超时=长时间持锁,全库阻塞) ❌无WHERE的UPDATE/DELETE(一次清空全表) ❌SELECT *(新增字段意外暴露敏感数据) [健壮性铁律] 外部依赖(DB/Redis/MQ/HTTP)必须有超时+重试+熔断,非核心失败不拖垮核心流程
写/改后端代码时,强制遵守:
_ = someFunc()忽略error(忽略的error会在生产环境变成无声的数据损坏);错误向上传播时附加上下文目录结构扫描:
依赖注入与耦合度:
错误传播链检查(Grep所有error处理):
_ = func() 或只log不return)fmt.Errorf("xxx: %w", err) vs 裸传err)错误分层:
| 层级 | 错误类型 | HTTP状态码 | 处理方式 | |------|----------|-----------|---------| | 参数校验 | 格式/类型/范围错误 | 400 | 返回具体字段+原因 | | 业务逻辑 | 余额不足/已存在/不允许 | 422 | 返回业务错误码+用户消息 | | 认证授权 | 未登录/无权限 | 401/403 | 统一认证中间件处理 | | 基础设施 | DB/Redis/MQ连接失败 | 503 | 日志+告警+客户端提示重试 | | 未知错误 | 未预期异常 | 500 | 生成唯一错误ID+日志完整堆栈 |
并发安全:
资源管理:
配置审查:
环境一致性:
日志审查:
监控与告警:
部署流程:
进程管理:
## 后端工程审查报告
### 架构问题
| # | 文件:行号 | 问题 | 影响 | 修复建议 | 优先级 |
### 错误处理缺陷
| # | 文件:行号 | 问题 | 风险 | 修复方案 |
### 并发/资源风险
| # | 文件:行号 | 问题 | 场景 | 修复方案 | 严重度 |
### 配置问题
| # | 位置 | 问题 | 建议 |
### 日志/可观测性
| # | 位置 | 缺失内容 | 建议 |
### 部署/运维
| # | 问题 | 当前状态 | 建议 |
写后端代码时强制遵守,违反=出错的根源:
| 规则 | 原因 |
|------|------|
| 函数单一职责,一个函数只做一件事 | 职责混杂的函数=测试困难+修改危险+读不懂 |
| 函数体不超过50行,超过就拆 | 长函数=高认知负担,容易藏层bug且难读 |
| 强制early return,减少嵌套 | 多层if/else嵌套=可读性崩溃,边界条件先return出去 |
| 不重复自己(DRY),但不过度抽象 | 复制粘贴=改一处忘另一处;但过度抽象=改一处爆全局 |
| 变量/函数命名自解释,禁止a/b/tmp/data等无意义名 | 坏命名=读代码如解谜,改代码如赌博 |
| 错误处理不偷懒,每个error必须有明确去向 | 忽略error=生产环境的定时炸弹 |
| 禁止过早优化,先正确再快 | 过早优化=代码复杂度爆表,性能提升不可测量 |
| 配置和魔数提取为常量/配置项 | 魔数散落在代码中=改一个要搜全项目,还可能漏改 |
每写一个功能,问自己这些问题:
| # | 检查项 | 问自己 | 防御方法 | |---|---------|---------|----------| | 1 | 空值处理 | 这个变量可能为nil/null/None吗? | 所有外部输入、DB查询结果、map取值都先检查空值 | | 2 | 边界条件 | 空数组/空字符串/零值/负数/最大值时会怎样? | 每个函数的第一行应该是边界检查 | | 3 | 并发安全 | 两个请求同时执行这段代码会怎样? | 共享状态加锁,数据库用原子操作(WHERE count>0) | | 4 | 重复执行 | 这个操作执行两次会怎样? | 幂等键/唯一约束/INSERT ON DUPLICATE | | 5 | 失败回滚 | 执行到一半失败了怎么办? | 事务包裹多步操作,失败时清理已创建的资源 | | 6 | 超时处理 | 外部服务响应慢/不响应时会怎样? | 所有外部调用设超时,超时后有明确降级策略 | | 7 | 数据一致性 | 写入A表成功但写B表失败时数据还一致吗? | 事务或补偿机制 | | 8 | 资源泄漏 | 异常时连接/文件/锁会释放吗? | defer/finally/try-with-resources保证释放 | | 9 | 数值安全 | 金额/数量可能为负数/零/溢出吗? | 校验范围,金额用整数分表示禁止浮点 | | 10 | 时序依赖 | 调用顺序变了会崩吗? | 减少函数间的隐式依赖,必要时加断言/检查 | | 11 | 日志追踪 | 出问题时能通过日志定位吗? | 关键操作打日志,含请求ID/用户ID/操作类型 | | 12 | 配置变更 | 配置改了会崩吗?配置丢了有默认值吗? | 配置有默认值,缺失关键配置时拒绝启动而不是静默运行 |
错误处理:
if err != nil必须处理:return/log+return/wrap后returnfmt.Errorf("context: %w", err)附加上下文,禁止裸传err(裸err无法定位出错位置,生产排查时只看到“connection refused”不知哪里调的)defer中的error也要处理并发:
map非并发安全,并发读写用sync.Map或sync.RWMutex保护sync.WaitGroup的Add在goroutine外调用,Done用defer性能:
strings.Builder而非+循环拼接make([]T, 0, expectedLen)http.Client),不要每次请求新建项目结构(推荐):
cmd/api/main.go # 入口
internal/
config/config.go # 配置加载
handler/ # HTTP handler(入参校验+响应)
service/ # 业务逻辑
model/ # 数据模型
middleware/ # 中间件(认证/限流/CORS/日志)
安全:
eval()/exec()/system()拼接用户输入(直接远程代码执行RCE,服务器被接管)extract($_GET)/extract($_POST)(变量覆盖攻击,攻击者可覆盙任意变量包括$_SESSION)htmlspecialchars($str, ENT_QUOTES, 'UTF-8')session_regenerate_id(true)防固定类型安全:
declare(strict_types=1)严格类型==做安全比较(用===),因为PHP弱类型比较会导致"0" == false错误处理:
display_errors = Off,log_errors = On@静默错误(静默错误=问题被吐出但你看不到,最终在生产环境爆发)安全:
cursor.execute("SELECT * FROM t WHERE id=%s", (id,)))eval()/exec()处理用户输入(直接RCE,攻击者可执行任意代码)pickle.loads反序列化不可信数据(pickle可执行任意代码,RCE风险)yaml.load()用yaml.safe_load()替代(yaml.load可执行任意Python对象构造,RCE风险)类型安全:
def f(items=[])→共享变异)异步:
async/await不混用同步阻塞调用(会堵塞事件循环)except Exception禁止裸用(吃掉KeyboardInterrupt和SystemExit)安全:
eval()/new Function()处理用户输入(直接RCE,服务器被接管)child_process.exec(userInput),用execFile+参数数组(exec走shell可注入命令,execFile直接执行无shell解析)异步:
async函数必须try/catch,或调用方.catch()process.on('unhandledRejection')全局捕获性能:
fs.readFileSync)在请求处理中(阻塞事件循环)安全:
Runtime.exec(userInput),用ProcessBuilder+参数数组(exec字符串可注入shell命令,ProcessBuilder参数数组不经过shell解析)ObjectInputStream直接读不可信数据(Java反序列化可触发任意代码执行,历史CVE无数)资源管理:
ExecutorService,禁止无限创建线程(无限线程=流量峰值时OOM崩溃)并发:
synchronized/Lock/AtomicXxx保护new Thread()直接创建,用线程池(直接创建线程无法复用且无数量上限,高并发时耗尽系统资源)ConcurrentHashMap替代Collections.synchronizedMapdevelopment
WooYun-derived business-logic testing methodology for web apps and APIs. Use when the request involves 支付、退款、订单、越权、认证、授权、价格篡改或业务流程绕过 review, especially black-box probing for price tampering, account takeover, and process bypass flaws.
tools
Escalate privileges on Windows systems using service misconfigurations, DLL hijacking, token manipulation, UAC bypasses, registry exploits, and credential dumping. Use when performing Windows post-exploitation or privilege escalation.
development
Use when performing AD pentest tunneling and pivoting, especially with Ligolo-ng, Chisel, frp, proxychains, SSH forwarding, SOCKS relays, reverse tunnels, or when internal reachability is the main blocker.
development
Threat model, security audit, find vulnerabilities, check security of my app, risk assessment, penetration test prep, analyze attack surface, what could an attacker exploit. Use this skill whenever a user wants holistic security analysis of a codebase, application, or project. MUST be invoked instead of analyzing security yourself — it runs a specialized 8-phase STRIDE workflow producing professional deliverables you cannot generate alone: risk assessment reports, DFD diagrams, threat inventories, attack path validation, mitigation plans, and pentest plans. Trigger on: 威胁建模, 安全评估, 渗透测试, 安全分析, 安全审计, 安全检查, 风险评估. NOT for: fixing one specific bug, adding one security feature (rate limiting, CORS), writing tests, CI/CD setup, or debugging errors.