用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/shuigedeng/taotao-cloud-goods --skill security-review命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
正在显示 SKILL.md
基于 SOC 职业分类
| name | security-review |
| description | 安全审查工作流,检查 SQL 注入、越权、敏感信息泄露、依赖漏洞 |
| triggers | ["安全审查","漏洞扫描","安全审计","渗透测试"] |
适用于商品域(Goods)的安全审查,涵盖常见 Web 安全风险。
${} 替代 #{} 拼接参数Wrapper 而非字符串拼接ORDER BY 注入)// ❌ 危险:字符串拼接
String sql = "SELECT * FROM t_goods WHERE name LIKE '%" + keyword + "%'";
// ✅ 安全:参数绑定
LambdaQueryWrapper<GoodsPo> wrapper = Wrappers.lambdaQuery();
wrapper.like(GoodsPo::getName, keyword);
// ❌ 危险:排序字段未校验
queryWrapper.orderBy(true, isAsc, sortField); // sortField 来自前端
// ✅ 安全:白名单校验排序字段
private static final Set<String> ALLOWED_SORT_FIELDS = Set.of("id", "create_time", "price", "sales");
if (!ALLOWED_SORT_FIELDS.contains(sortField)) {
sortField = "id"; // 默认排序
}
storeId 归属校验)@Inner 或 IP 白名单)@PreAuthorize)// ❌ 危险:未校验卖家归属
@PostMapping("/{id}/publish")
public Result<Void> publish(@PathVariable Long id) {
goodsCommandService.publish(id); // 任何卖家都可以发布其他卖家的商品
return Result.success();
}
// ✅ 安全:校验卖家归属
@PostMapping("/{id}/publish")
public Result<Void> publish(@PathVariable Long id) {
Long storeId = SecurityUtils.getCurrentUser().getStoreId();
goodsCommandService.publish(id, storeId); // 传入 storeId 做归属校验
return Result.success();
}
// ❌ 危险:日志打印敏感信息
log.info("用户登录成功:{}", user); // user.toString() 可能包含密码
// ✅ 安全:只打印必要信息
log.info("用户登录成功:userId={}", user.getId());
// ❌ 危险:接口返回敏感字段
public class UserResult {
private String password; // 返回给前端
private String phone; // 应脱敏
}
// ✅ 安全:DTO 不包含敏感字段或做脱敏
public class UserResult {
@JsonIgnore
private String password;
private String phone; // 或使用 @Sensitive 注解脱敏
}
Content-Type)../ 攻击)# OWASP 依赖漏洞检查
./gradlew dependencyCheckAnalyze
# Checkstyle + SpotBugs + PMD 全量检查
./gradlew checkstyleMain spotbugsMain pmdMain
🔒 安全审查报告
✅ 通过:
- [项目]
⚠️ 警告:
- [项目]
❌ 漏洞:
- [严重度] [位置] [风险描述]
💡 修复建议:
- [建议]