Kvnbbg/wp-malware-scanner
GitHub: Kvnbbg/wp-malware-scanner
一款轻量级的 WordPress 数据库可疑模式扫描器,通过只读方式检测 wp_options 表中常见的恶意代码特征,支持 CLI 批量审计与结构化报告导出。
Stars: 6 | Forks: 2
# WP Malware Scanner
轻量级 PHP 扫描器,用于检测 WordPress 数据库(重点关注 `wp_options`)中的可疑模式。此工具**不会清除恶意软件**——它仅标记高风险模式,以便您安全地进行调查。
## 范围与威胁模型
- **范围:** 读取选定的 option 值(默认为:`wp_options`)并匹配精选的正则表达式规则。
- **威胁模型:** 检测常见的 webshell/混淆特征,而非彻底根除恶意软件。
- **安全性:** 只读访问;不执行任何写入或删除操作。
## 安全使用(必读)
1. **在本地或预发环境运行**,并使用只读 DB 凭据。
2. **导出结果**(JSON/表格)以供审查。
3. **使用后立即删除扫描器。**
## 模式
- **CLI(推荐):** 可预测的输出、退出代码、JSON 导出。
- **Web UI(临时):** 用于一次性扫描的本地专用页面。
## 前置条件
- PHP 8.1+ 及 PDO MySQL
- Composer
- WordPress 数据库凭据(只读)
## 安装
```
composer install
cp .env.example .env
```
使用您的 DB 凭据编辑 `.env`。
## Vercel 部署(社区 PHP Runtime)
Vercel PHP 部署的最小结构:
```
project/
├── api/
│ └── index.php
├── composer.json
├── vercel.json
└── .vercelignore
```
`vercel.json` 应指向 Vercel 的社区 PHP runtime:
```
{
"version": 2,
"functions": {
"api/*.php": {
"runtime": "vercel-php@0.7.4"
}
}
}
```
`.vercelignore` 会将 `vendor/` 排除在上传范围之外,以便 Vercel 在构建期间安装依赖:
```
/vendor
```
本仓库中的示例 `api/index.php` 会返回 JSON 状态响应,方便您验证 runtime 是否正常工作。
## 配置 (.env)
关键设置:
- `DB_HOST`, `DB_PORT`, `DB_USER`, `DB_PASS`, `DB_NAME`
- `WP_TABLE` (默认: `wp_options`)
- `OPTION_NAMES` (逗号分隔)
- `OUTPUT_FORMAT` (`table` 或 `json`)
- `WEB_ALLOW_REMOTE` (默认: `false`)
## CLI 用法
```
php bin/scan.php
```
示例:
```
php bin/scan.php --format=json --output=scan.json
php bin/scan.php --format=table
```
退出代码:
- `0` 未发现可疑模式
- `1` 发现可疑模式
- `2` 执行错误
## Web(临时仅限本地)
```
php -S 0.0.0.0:8080 -t public
```
然后打开 `http://127.0.0.1:8080`。除非设置 `WEB_ALLOW_REMOTE=true`,否则远程访问将被阻止。
如需更简单的启动方式(适用于容器化截图工具),请使用:
```
bin/serve-ui.sh
```
## 批量每周审计(DRY)
运行单个命令即可扫描多个客户端站点并生成每周产物:
```
php bin/bulk-scan.php --config=config/bulk-sites.example.json --output-dir=reports --report=weekly-audit.md
```
您将获得:
- 位于 `reports/` 目录下每个站点的 JSON 扫描输出(非常适合用于存档和趋势比较)
- 一份汇总的 Markdown 报告(`weekly-audit.md`),用于面向客户的每周审计总结
配置说明:
- 使用 `config/bulk-sites.example.json` 作为模板。
- 每个 `sites[]` 条目支持 `name`、`db_host`、`db_port`、`db_user`、`db_pass`、`db_name`、`table`、`option_names` 和 `snippet_length`。
- `option_names` 可以是 CSV 字符串或数组。
- 缺失的站点级 DB 字段将在可用时回退至您的 `.env` 默认值。
退出代码:
- `0` 所有站点均干净
- `1` 在一个或多个站点中检测结果
- `2` 配置/运行时错误(包括各站点连接失败)
## 输出格式
- **表格:** 人类可读的 ASCII 表格
- **JSON:** 用于应急响应的结构化导出
## 文档
- [错误处理指南(客户端 + 服务端)](docs/error-handling-guide.md)
## 功能说明(能做与不能做)
✅ 扫描已知 option 键中的可疑模式(例如:`eval`、`