# 12 — monitor.php: Token-Check (HTTP) **Priorität:** medium **Abhängigkeiten:** 03 (monitor.php), 05 (Plesk-Cron) **Referenz:** [`../public/monitor.php`](../public/monitor.php), [`../public/mail-test.php`](../public/mail-test.php) ## Problem `monitor.php` ist per **GET** öffentlich erreichbar (`https://0012.de/monitor.php`). Im Plesk-Access-Log tauchen neben dem Cron-`curl` auch fremde Clients auf (z. B. `got` von AWS-IPs) — jeder kann Checks auslösen, JSON/Status lesen und Last erzeugen. Plesk-Cron kann das Skript **per CLI** ausführen (`php monitor.php`) — dort ist kein HTTP nötig. ## Ziel HTTP-Aufrufe nur mit gültigem Token; CLI/Cron unverändert. ## Checkliste - [ ] In `monitor.php` (oder `monitor-lib.php`): bei Web-SAPI (`php_sapi_name() !== 'cli'`) Token prüfen - Query-Parameter `token` oder Header `X-Monitor-Token` - Secret: bestehendes `MONITOR_INGEST_TOKEN` (wie `mail-test.php`) oder separates `MONITOR_RUN_TOKEN` - Vergleich mit `hash_equals()` - Bei Fehler: `403` + kurzer JSON/Text, **kein** Monitoring-Lauf - [ ] Plesk-Cron auf **PHP-Skript (CLI)** umstellen, falls aktuell URL/Curl — siehe [`05-plesk-cron.md`](05-plesk-cron.md) - [ ] Optional: `.htaccess` / Plesk „Verzeichnis schützen“ nur als Zusatz, nicht als einzige Absicherung - [ ] Deploy + manueller Test: - `GET /monitor.php` ohne Token → 403 - `GET /monitor.php?token=…` → Lauf OK - `php monitor.php` lokal/auf Server → Lauf OK - [ ] Kurz in [`../MONITORING.md`](../MONITORING.md) oder [`05-plesk-cron.md`](05-plesk-cron.md) dokumentieren ## Nicht im Scope - Rate-Limit / IP-Whitelist (optional später) - Absicherung von `index.php` (öffentliche Statusseite bleibt bewusst offen) ## Akzeptanzkriterien - Fremde GET-Requests ohne Token lösen keinen Monitor-Lauf aus - Geplanter Plesk-Cron (CLI) läuft weiter zuverlässig ## Referenz-Implementierung Vorbild Token-Check: [`../public/mail-test.php`](../public/mail-test.php) (Zeilen 15–22).