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`、`