# Sicherheit

> Sicherheitsmodell und Befehlsvalidierung

---

- **Nie eine Shell.** Befehle werden via [`proc_open`](https://www.php.net/manual/de/function.proc-open.php) mit einem [argv-Array](https://www.php.net/manual/de/reserved.variables.argv.php) ausgeführt.
- **Befehls-Whitelist.** [Modulskripte](./cli-scripts) müssen `modules_v4/<module>/cli/<script>.php` entsprechen, existieren und sich in einem `modules_v4/<module>/cli/`-Verzeichnis auflösen. Core-Befehle sind auf die Read-only/Export-Allowlist beschränkt.
- **Argument-Validierung.** Jedes Argument-Token muss eine einfache Option oder ein Wert sein — keine Shell-Metazeichen, keine Leerzeichen in Tokens, max. 10 Tokens.
- **Arbeitsverzeichnisse.** Modulskripte laufen vom webtrees-Root; Core-Befehle laufen von `data/`.
- **Keine sensiblen Daten in stdout.** Der [Tick](./tick) gibt nur Zusammenfassungen aus; die vollständige Ausgabe bleibt in der Ausführungshistorie (admin-only).
- **UI-Aktionen** sind alle als `*Admin*` benannt (nur Admin, [CSRF](https://developer.mozilla.org/de/docs/Web/Security/Attacks/CSRF)-geschützt).
- **Notaus-Schalter:** Modul deaktivieren — der Tick tut dann nichts.
- Der Tick ist Single-Instance (flock), und der Kindprozess eines Jobs wird nach dem Timeout hart getötet ([`SIGKILL`](https://de.wikipedia.org/wiki/SIGKILL)).
- **Bündelung von Ereigniswarteschlangen.** Eine Flut identischer [Ereignisse](./events) wird zusammengeführt zu einem Joblauf.
- **Webhook-Token nur im Header.** Das Token wird ausschließlich im `X-Cronjob-Token`-Header gesendet.
