SecureWatch(代码安全监视器)是一个基于 IntelliJ IDEA 的代码安全检测插件,可以在编写代码时实时监控常见的安全漏洞,并提供详细的安全提示和修复建议。
- ✅ 奇安信代码审计 - 提前发现审计问题,减少整改成本
- ✅ 等保 2.0 测评 - 满足等保安全编码要求
- ✅ 安全扫描整改 - 避免上线后的紧急修复
- ✅ 团队代码规范 - 统一安全编码标准
- 🔍 实时检测 - 编码时后台自动扫描,立即标记问题
- 💡 详细提示 - 鼠标悬停显示风险说明、攻击示例、修复建议
- 🎨 柔和标记 - 统一黄色波浪线,不干扰正常编码
- 📚 完整文档 - 包含详细的使用指南和开发文档
| # | 检测规则 | 类别 | 风险级别 | 说明 |
|---|---|---|---|---|
| 1 | Fastjson 反序列化 | 安全 | 🔥 高危 | 检测 JSON.parseObject/parse/parseArray,特别关注 AutoType |
| 2 | SQL 注入 | 安全 | 🔥 高危 | 检测字符串拼接SQL、MyBatis ${} 用法 |
| 3 | Java 原生反序列化 | 安全 | 🔥 高危 | 检测 ObjectInputStream.readObject() |
| 4 | 命令注入 | 安全 | 🔥 高危 | 检测 Runtime.exec()、ProcessBuilder 字符串拼接 |
| 5 | 路径遍历 | 安全 | 检测 new File()、Paths.get() 外部输入 | |
| 6 | SSRF | 安全 | 检测 new URL() 外部输入 | |
| 7 | 资源未释放 | 质量 | 检测 InputStream 等资源未在 finally 中关闭 | |
| 8 | 系统信息泄露 | 质量 | 检测 return e.getMessage() 泄露内部信息 | |
| 9 | 不安全的随机数 | 密码 | 检测 new Random() 用于安全场景 |
专门检测 MyBatis 注解中的 ${} 用法:
// ❌ 不安全 - 显示黄色波浪线
@Select("SELECT * FROM users WHERE username = '${username}'")
User findUser(String username);
// ✅ 安全
@Select("SELECT * FROM users WHERE username = #{username}")
User findUser(String username);针对国内常用的 Hutool 工具库,可以规避检测:
- 路径遍历 → 使用
FileUtil.file()规避检查 - SSRF → 使用
URLUtil.url()规避检查
每个问题都提供:
- 🚨 风险说明 - 为什么不安全
- 💣 攻击示例 - 实际的攻击场景
- 🔧 修复建议 - 多种修复方案供选择
- 📝 示例代码 - 完整的安全代码示例
- 📊 审计标准 - 符合奇安信、等保等国内标准
- 区分安全和不安全的场景
- 识别常量和变量
- 检测 try-with-resources
- 理解业务异常和系统异常
- 识别开发和生产环境
- JDK: 17+(已配置为
D:\jdk17) - IntelliJ IDEA: 2023.2+
- Gradle: 8.0+(已包含 Wrapper)
# Windows
gradlew.bat buildPlugin
# 插件生成位置
build\distributions\SecureWatch-1.0-SNAPSHOT.zip# Windows
gradlew.bat runIde
# 会自动启动一个带插件的 IDEA 实例方法 1:手动安装
- 打开 IDEA
File→Settings→Plugins- 点击 ⚙️ →
Install Plugin from Disk... - 选择
build\distributions\SecureWatch-1.0-SNAPSHOT.zip - 重启 IDEA
方法 2:开发模式运行
gradlew.bat runIde在安装了插件的 IDEA 中打开任意 Java 项目。
编写代码时,不安全的代码会自动显示黄色波浪线:
// 自动检测并标记
JSONObject obj = JSON.parseObject(userInput); // ⚠️ 黄色波浪线
String sql = "SELECT * FROM users WHERE id=" + id; // ⚠️ 黄色波浪线
Random random = new Random(); // ⚠️ 黄色波浪线将鼠标悬停在黄色波浪线上,查看详细的安全提示:
🚨 严重安全风险:Fastjson 反序列化漏洞
【问题】使用Fastjson反序列化可能导致远程代码执行
【修复建议】
1. 【推荐】替换为 Jackson
ObjectMapper mapper = new ObjectMapper();
MyClass obj = mapper.readValue(jsonString, MyClass.class);
2. 替换为 Gson
...
【为什么危险】
Fastjson 的 AutoType 功能允许攻击者通过 @type 字段指定类名,
可以实例化恶意类(如 JdbcRowSetImpl),执行任意代码。
根据提示信息,手动修改代码:
// 修改前
JSONObject obj = JSON.parseObject(userInput);
// 修改后
ObjectMapper mapper = new ObjectMapper();
MyClass obj = mapper.readValue(userInput, MyClass.class);打开 Problems 窗口查看所有检测到的问题:
View→Tool Windows→Problems- 筛选
Security分组 - 查看所有安全问题
项目包含完整的测试示例文件:
| 测试文件 | 说明 |
|---|---|
SecurityTestExamples.java |
通用安全测试(6种漏洞) |
MyBatisSecurityExamples.java |
MyBatis SQL 注入专项测试 |
ResourceLeakExamples.java |
资源泄漏测试 |
InformationLeakExamples.java |
信息泄露测试 |
InsecureRandomExamples.java |
不安全随机数测试 |
# 1. 运行插件
gradlew.bat runIde
# 2. 在新窗口中创建 Java 项目
# 3. 复制测试文件
copy src\main\resources\examples\*.java <你的项目>\src\main\java\
# 4. 打开测试文件,观察黄色波浪线| 标准 | 覆盖情况 |
|---|---|
| 奇安信代码审计 | ✅ Fastjson、SQL注入、反序列化、命令注入、信息泄露 |
| 等保 2.0 测评 | ✅ 应用安全、数据安全、代码安全性 |
| 标准 | 覆盖情况 |
|---|---|
| OWASP Top 10 2021 | ✅ A01(路径遍历)、A03(注入)、A08(反序列化)、A10(SSRF) |
| CWE | ✅ CWE-89、CWE-78、CWE-502、CWE-22、CWE-918 |
SecureWatch/
├── src/main/kotlin/com/scan/securityscan/
│ ├── rules/ # 规则层
│ │ ├── SecurityRule.kt # 规则接口
│ │ ├── AbstractSecurityRule.kt # 规则基类
│ │ └── impl/ # 9个具体规则
│ │ ├── FastjsonDeserializationRule.kt
│ │ ├── SqlInjectionRule.kt
│ │ ├── JavaDeserializationRule.kt
│ │ ├── CommandInjectionRule.kt
│ │ ├── PathTraversalRule.kt
│ │ ├── UnsafeUrlCreationRule.kt
│ │ ├── ResourceLeakRule.kt
│ │ ├── InformationLeakRule.kt
│ │ └── InsecureRandomRule.kt
│ │
│ └── inspections/ # 检查器层
│ ├── SecurityInspectionBase.kt # 检查器基类
│ └── [9个具体的 Inspection]
│
├── src/main/resources/
│ ├── META-INF/plugin.xml # 插件配置
│ └── examples/ # 测试示例
│
├── build.gradle.kts # Gradle 配置
├── gradlew.bat # Windows 构建脚本
└── README.md # 本文档
详细步骤请参考:DEVELOPMENT.md
简要步骤:
- 创建规则类 - 实现
SecurityRule接口 - 创建检查器 - 继承
SecurityInspectionBase - 注册到 plugin.xml - 添加
localInspection配置 - 测试规则 - 运行
gradlew.bat runIde
File→Settings→Editor→Inspections- 展开
Security分组 - 勾选或取消勾选需要的规则
虽然代码中设置了不同的风险级别,但所有问题统一显示为黄色波浪线,视觉更柔和。
提示信息中仍会标注实际的风险级别(🔥 高危 /
| 文档 | 说明 |
|---|---|
| README.md | 项目概述(本文档) |
| 快速入门.md | 5分钟快速上手指南 |
| PLUGIN_USAGE.md | 详细使用说明 |
| DEVELOPMENT.md | 开发者指南 |
| Hutool集成说明.md | Hutool 工具库使用 |
| 显示效果说明.md | 界面显示效果 |
| 更新说明.md | 版本更新记录 |
// ✅ 边写代码边检查
public void saveUser(String username) {
// 看到黄色波浪线 → 鼠标悬停查看 → 根据建议修复
String sql = "INSERT INTO users VALUES('" + username + "')";
}- 打开
Problems窗口 - 筛选
Security分组 - 逐个检查所有问题
- 确保修复或记录原因
- 全项目扫描安全问题
- 优先修复高危问题(🔥)
- 评估警告级别问题(
⚠️ ) - 准备修复说明文档
- 实时发现安全问题
- 学习安全编码规范
- 养成安全编码习惯
- 提交前自查
- 减少审查成本
- 提高代码质量
- 奇安信审计准备
- 等保测评自查
- 漏洞扫描整改
- 详细的安全说明
- 实际的攻击示例
- 完整的修复方案
# 构建插件
gradlew.bat buildPlugin
# 清理构建
gradlew.bat clean
# 运行测试
gradlew.bat runIde
# 验证插件
gradlew.bat verifyPluginbuild/
├── distributions/
│ └── SecureWatch-1.0-SNAPSHOT.zip ← 插件安装包
├── libs/
│ └── SecureWatch-1.0-SNAPSHOT.jar ← 编译后的 JAR
└── idea-sandbox/ ← 测试沙箱
项目已配置使用 D:\jdk17,修改请编辑 gradlew.bat:
@rem 写死 JAVA_HOME 路径
set JAVA_HOME=D:\jdk17欢迎贡献代码、提出建议或报告问题!
- Fork 本项目
- 创建特性分支 (
git checkout -b feature/AmazingFeature) - 提交改动 (
git commit -m 'Add some AmazingFeature') - 推送到分支 (
git push origin feature/AmazingFeature) - 开启 Pull Request
如果发现问题或有建议,请:
- 查看 Issues 是否已存在
- 创建新 Issue,详细描述问题
- 包含复现步骤和环境信息
本项目采用 Apache License 2.0 许可证。详见 LICENSE 文件。
Copyright 2024 SecureWatch Team
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
- Email: [email protected]
- Issues: GitHub Issues
- 文档: 项目 Wiki
感谢以下项目和工具:
- v1.2 (当前) - 新增不安全随机数检测、系统信息泄露检测、资源未释放检测
- v1.1 - 新增 MyBatis 注解检测、统一黄色波浪线显示
- v1.0 - 初始版本,包含 6 种基础安全检测
让安全编码成为习惯,而不是事后补救 🛡️
Made with ❤️ by pengfei-t
如果这个项目对你有帮助,请给个 Star ⭐️