{include file="app/manage/view/index/emlog_nav"}

# 文件校对

通过对核心文件（app / ZhiCms / public / plugins 下的 php/html/js/css）计算 MD5 并与基线比对，发现被篡改、新增或缺失的文件；首次使用请先「建立基线」（建议在全新安装或官方升级后立即建立）。核心/框架文件（ZhiCms、vendor/TP6、app/base、app/api、app/common、public）为受保护文件，不允许在后台修改或篡改，检测到变化必须从「代码仓」拉取恢复。
代码仓设置
代码仓地址（gitee，自动从官方接口获取）
本地托底目录
恢复时按 gitee → 本地托底目录 → 官方压缩包 顺序自动回退。官方压缩包 `https://www.zhi.red/d/zhicms.zip` 会自动下载缓存于 `data/repo_ref/zhicms.zip`（24 小时内维持最新）。 {if $hasLocal}✓ 已检测到本地托底目录，可作为离线兜底。{else}⚠ 尚未配置/检测到本地托底目录，将依赖官方压缩包兜底。{/if}
检测代码仓/更新包是否有更新

点击下方按钮，系统会连接官方更新包（`data/repo_ref/zhicms.zip`，自动下载/维持最新）与代码仓接口，检测是否发布了新版本或新文件（如你上传到代码仓的文件）。检测到后可一键在线升级补回。

一键恢复整站（急救）

当网站被改乱、白屏、功能异常时，点击下面按钮：从官方代码仓/压缩包拉取最新代码，覆盖除数据库配置外的全部程序文件，并清理所有缓存，将网站快速还原为官方最新版（保留你的数据库与站点配置，不会丢数据）。

会覆盖 app / ZhiCms / public / plugins / vendor 下全部文件；保留 data/config/db.php、站点配置、upload 上传目录与 data/repo_ref 托底目录。
一键清马（高危操作 · 务必先建立基线）

⚠ 警告：此功能会扫描文件校验基线中「新增的文件」，并自动删除落在 `upload/`、`runtime/`、`data/` 等高危目录内的可执行脚本（.php/.php5/.phtml/.pht/.phps/.cgi/.pl/.py/.sh/.bat/.exe/.phar 等）。

- 这些位置本就不该出现可执行文件，一旦存在极可能是上传/缓存型木马。
- 位于 `app/`、`plugins/` 等位置的新增可执行文件（可能是你新装的插件/模板）不会自动删除，仅列出供你人工确认。
- 删除前请确保已建立基线；所有删除动作均记入操作日志，可事后追溯。
- 如不确定，请先点上方「重新检测」查看「新增的文件」列表，确认无误后再清马。

仅删除高危目录内的可执行新增文件；图片/文本等不会被删，合法插件不会被误删。
{if $hasBaseline}
{else}
{/if}
{if $hasBaseline}
基线建立于 {date('Y-m-d H:i:s', (int)$baselineTime)}，共 {$baselineCount} 个文件
{/if}
在线升级文件系统（远程下载恢复）

当核心/程序文件被改动、缺失或被篡改时，可直接从官方代码仓（gitee）远程下载最新官方版本覆盖本地受保护核心文件，相当于“文件级在线升级”，与“在线升级系统”（升级程序大版本）互补。

恢复顺序：gitee 官方代码仓 → 本地托底目录 → 官方压缩包（data/repo_ref/zhicms.zip）。点击下方按钮会对所有“被改动或缺失”的受保护核心文件（ZhiCms/vendor/app/base/app/api/app/common/public 等）执行远程下载覆盖；普通可修改文件（如自定义模板/视图）不会被强制覆盖，以保留你的正常修改。

{if isset($result) && $result} {if $result['clean']}
检测完成：未发现文件被篡改，系统文件完整。
{else}
检测完成：发现异常！ {count($result['changed'])} 个文件被修改， {count($result['missing'])} 个文件缺失， {count($result['added'])} 个新增文件。
{if !empty($result['changed'])}
已被修改的文件（{count($result['changed'])}）

文件 | 状态 | 操作
--- | --- | ---
{foreach $result['changed'] as $it}
`{htmlspecialchars($it.file, ENT_QUOTES, 'UTF-8')}` | {if $it.protected}受保护·不可改{elseif $it.editable}可修改{else}不可写{/if} | {if $it.protected} {if $it.restorable} {else} 未配置代码仓 {/if} {else} {/if}
{/foreach}

{/if} {if !empty($result['missing'])}
缺失的文件（{count($result['missing'])}）

文件 | 状态 | 操作
--- | --- | ---
{foreach $result['missing'] as $it}
`{htmlspecialchars($it.file, ENT_QUOTES, 'UTF-8')}` | {if $it.protected}受保护·不可改{else}普通{/if} | {if $it.protected} {if $it.restorable} {else} 未配置代码仓 {/if} {else} {/if}
{/foreach}

{/if} {if !empty($result['added'])}
新增的文件（{count($result['added'])}，可能正常如新增插件/模板）

{foreach $result['added'] as $it}
- `{htmlspecialchars($it.file, ENT_QUOTES, 'UTF-8')}` {if $it.protected}受保护目录{/if} {if $it.danger}可执行文件{/if} {if $it.danger && !$it.protected}
  {/if}
{/foreach}

{/if} {/if} {elseif $hasBaseline}
点击「重新检测」开始比对。
{else}

##### 尚未建立基线

建立基线后会记录当前所有核心文件的 MD5，之后即可检测是否被篡改。

{/if} {include file="app/manage/view/index/emlog_footer"}