review-security
Installation
SKILL.md
代码安全性评审
语言要求
所有输出内容必须使用中文,包括安全评审报告、问题描述、安全建议、修复方案等。
功能说明
专注于代码安全性评审,识别和防范常见的安全漏洞,确保代码符合安全最佳实践。
参考文档
进行安全评审时,可参考 OWASP Top 10 安全风险清单。
使用方式
当用户提供待评审的代码(单个接口、模块或系统关键路径),并可选说明关注重点时,执行安全评审。
安全评审清单
1. 注入攻击防护
SQL 注入
- 是否使用参数化查询或预编译语句
- 是否直接拼接 SQL 语句
- ORM 框架使用是否正确
- 动态 SQL 是否安全
NoSQL 注入
- MongoDB 查询是否安全
- Redis 命令是否可被注入
命令注入
- 是否执行外部命令
- 命令参数是否经过验证
- 是否使用白名单验证
LDAP/XPath 注入
- LDAP 查询是否安全
- XPath 表达式是否可控
2. 跨站脚本(XSS)
反射型 XSS
- 用户输入是否经过转义
- HTML 输出是否编码
- JavaScript 上下文是否安全
存储型 XSS
- 存储的用户内容是否过滤
- 富文本编辑器是否配置白名单
- 文件上传内容是否检查
DOM 型 XSS
- DOM 操作是否安全
- innerHTML 使用是否正确
3. 认证与授权
身份认证
- 密码是否加密存储(使用 bcrypt/PBKDF2)
- 是否使用安全的会话管理
- Token 是否有过期时间
- 是否防止暴力破解
- 是否实现账号锁定机制
权限控制
- 是否实现细粒度权限控制
- 是否检查垂直越权
- 是否检查水平越权
- 默认权限是否最小化
- 敏感操作是否二次验证
4. 敏感数据保护
数据加密
- 敏感数据是否加密存储
- 传输是否使用 HTTPS
- 加密算法是否安全(避免 MD5/SHA1)
- 密钥管理是否安全
数据脱敏
- 日志中是否包含敏感信息
- 错误信息是否泄露敏感数据
- 接口返回是否脱敏
5. 会话管理
- Session ID 是否安全生成
- 是否设置 HttpOnly Cookie
- 是否设置 Secure Cookie
- 是否设置 SameSite 属性
- 会话超时是否合理
- 注销是否清除会话
6. 文件操作安全
文件上传
- 是否验证文件类型
- 是否限制文件大小
- 是否检查文件内容
- 上传路径是否可控
- 文件名是否过滤
文件下载
- 是否验证文件路径
- 是否防止路径遍历
- 是否检查文件权限
7. 业务逻辑漏洞
- 是否存在越权访问
- 是否有重放攻击风险
- 是否有条件竞争
- 是否有业务流程绕过
- 是否有金额篡改风险
8. 配置安全
- 敏感配置是否加密
- 默认密码是否修改
- 调试信息是否关闭
- 错误详情是否隐藏
常见安全问题示例
1. SQL 注入
// ❌ 不安全的代码
String sql = "SELECT * FROM user WHERE username = '" + username + "'";
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql);
// ✅ 安全的代码
String sql = "SELECT * FROM user WHERE username = ?";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, username);
ResultSet rs = pstmt.executeQuery();
// ✅ 使用 MyBatis
@Select("SELECT * FROM user WHERE username = #{username}")
User selectByUsername(@Param("username") String username);
2. XSS 攻击
// ❌ 不安全的代码
String content = request.getParameter("content");
response.getWriter().write(content);
// ✅ 安全的代码
String content = request.getParameter("content");
String safeContent = StringEscapeUtils.escapeHtml4(content);
response.getWriter().write(safeContent);
3. 密码安全
// ❌ 不安全的代码
String password = request.getParameter("password");
String md5Password = DigestUtils.md5Hex(password);
user.setPassword(md5Password);
// ✅ 安全的代码
String password = request.getParameter("password");
String hashedPassword = BCrypt.hashpw(password, BCrypt.gensalt(12));
user.setPassword(hashedPassword);
4. 权限控制
// ❌ 不安全的代码
@GetMapping("/user/{id}")
public User getUser(@PathVariable Long id) {
return userService.getById(id); // 未检查权限
}
// ✅ 安全的代码
@GetMapping("/user/{id}")
public User getUser(@PathVariable Long id) {
Long currentUserId = SecurityUtils.getCurrentUserId();
if (!id.equals(currentUserId) && !SecurityUtils.isAdmin()) {
throw new ForbiddenException("无权访问其他用户信息");
}
return userService.getById(id);
}
安全评审报告格式
# 安全评审报告
## 概览
- 评审文件:xxx.java
- 评审时间:2024-xx-xx
- 风险等级:🔴 高风险 / 🟠 中风险 / 🟢 低风险
## 发现的安全问题
### 🔴 高危漏洞(x 个)
1. **SQL 注入漏洞**
- 位置:UserService.java:45
- 风险:攻击者可执行任意 SQL 命令
- 影响:数据泄露、数据篡改、权限提升
- 修复建议:使用 PreparedStatement
- 示例代码:[...]
### 🟠 中危漏洞(x 个)
...
### 🟢 低危问题(x 个)
...
## 安全加固建议
1. 实施输入验证白名单机制
2. 启用 HTTPS 强制跳转
3. 配置安全响应头
4. 实施日志审计
5. 定期安全扫描
## 合规性检查
- [ ] OWASP Top 10 检查
- [ ] 等保要求检查
- [ ] 企业安全规范检查
OWASP Top 10 检查清单
- A01:2021 – 访问控制失效
- A02:2021 – 加密机制失效
- A03:2021 – 注入攻击
- A04:2021 – 不安全设计
- A05:2021 – 安全配置错误
- A06:2021 – 易受攻击和过时的组件
- A07:2021 – 身份识别和身份验证失效
- A08:2021 – 软件和数据完整性失效
- A09:2021 – 安全日志和监控失效
- A10:2021 – 服务器端请求伪造(SSRF)
注意事项
- 全面性:覆盖所有常见安全漏洞类型
- 深度:不仅检查表面问题,还要分析潜在风险
- 实用性:提供可操作的修复建议
- 优先级:按风险等级排序问题
- 验证:建议进行安全测试验证
Weekly Installs
2
Repository
sundny8/hydpromptkitFirst Seen
Feb 28, 2026
Security Audits
Installed on
qoder2
gemini-cli2
antigravity2
codebuddy2
claude-code2
github-copilot2