"""zap-hooks.py -- Haken fuer die ZAP-Grundpruefung (quick-261009-p0m). Wird von .gitea/scripts/zap-baseline.sh schreibgeschuetzt in den ZAP-Container eingebunden und mit `--hook=` geladen. Nur Standardbibliothek. Aufgaben: 1. Die klassische Spinne soll Formulare weder ausfuellen noch absenden. So bleibt die Pruefung rein passiv: es werden nur Seiten abgerufen (GET), nie Daten an die Anwendung geschickt (kein POST). 2. Nur wenn die Umgebungsvariable ZAP_BASIC_AUTH gesetzt ist (Anmeldedatei-Weg des Skripts), wird eine Ersetzungsregel fuer den Kopf Authorization eingetragen -- beschraenkt auf Adressen des Ziels (Schema, Host, Port). Andere Hosts (Weiterleitungen, eingebundene Fremdseiten, Zusatzdienste von ZAP) bekommen den Kopf nie. Der Wert steht nie in einem Aufruf oder einer Ausgabe. """ import os import re def zap_started(zap, target): # Keine Formulare verarbeiten, keine Formulare absenden. zap.spider.set_option_process_form(False) zap.spider.set_option_post_form(False) auth = os.environ.get("ZAP_BASIC_AUTH") if auth: # Die Regel gilt nur fuer URLs, die mit der Ziel-Adresse beginnen (Java-Regex, die # ganze URL muss passen). Danach darf nur ein Pfad, eine Abfrage oder ein Anker # folgen -- so passt auch http://host:30001 nicht auf das Ziel http://host:3000. url_regex = re.escape(target.rstrip("/")) + r"(?:[/?#].*)?" zap.replacer.add_rule( description="basicauth", enabled=True, matchtype="REQ_HEADER", matchstring="Authorization", matchregex=False, replacement=auth, initiators="", url=url_regex, )