feat: initial implementation of website integrity scanner

Python-Package zur unabhängigen Überwachung statischer Websites gegen
SEO-Spam und unbefugte Manipulationen. Läuft außerhalb des Hosters.

Kernfunktionen:
- Reiner Python-Crawler (bs4+lxml), kein wget
- Baseline-Management mit manuellem Freigabe-Workflow (niemals automatisch)
- Text-/Link-/Meta-Diff mit Risiko-Scoring (grün/gelb/rot)
- Hidden-Content-Erkennung (CSS inline, noscript, Kommentar-Links)
- Whitelist für externe Domains und interne Pfade
- E-Mail + Webhook Alarmierung
- CLI: init, crawl, check, scan, approve, report, status
- 79 Unit-Tests (pytest), alle grün

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Your Name 2026-06-12 00:51:41 +02:00
commit 98e8d11eb5
24 changed files with 4295 additions and 0 deletions

View file

@ -0,0 +1,18 @@
# Whitelist erlaubter externer Domains
#
# Jede externe Domain, die auf der Website verlinkt ist, muss hier eingetragen sein.
# Neue externe Domains, die NICHT hier stehen, lösen einen Alarm aus.
#
# Format: eine Domain pro Zeile (ohne Protokoll)
# Beispiele:
# Häufig verwendete externe Ressourcen — nur eintragen, was wirklich genutzt wird:
# - fonts.googleapis.com
# - fonts.gstatic.com
# - cdnjs.cloudflare.com
# - maps.googleapis.com
# - www.google-analytics.com
# - www.googletagmanager.com
# Für bredelar.info: Bitte nach erstem `init` prüfen und befüllen.
# Vorerst leer = alle externen Links lösen Alarm aus.

17
config/allowed_paths.yaml Normal file
View file

@ -0,0 +1,17 @@
# Whitelist erlaubter interner URL-Pfade (optional)
#
# Wenn diese Liste befüllt ist, lösen interne Links auf nicht gelistete
# Pfade einen Alarm aus.
# Leer lassen = keine Pfad-Whitelist-Prüfung (nur Baseline-Diff zählt).
#
# Format: ein Pfad pro Zeile (absoluter Pfad, ohne Domain)
# Beispiel für bredelar.info:
#
# - /
# - /index.html
# - /kontakt/
# - /kontakt/index.html
# - /impressum/
# - /datenschutz/
# - /ueber-uns/
# - /aktuelles/

23
config/ignore_rules.yaml Normal file
View file

@ -0,0 +1,23 @@
# Normalisierungsregeln für den Diff
#
# Diese Einstellungen reduzieren Fehlalarme durch harmlose, automatisch
# generierte Inhaltsänderungen.
# CSS-Selektoren, die vor dem Diff aus dem DOM entfernt werden.
# Nützlich für Elemente mit automatischen Zeitstempeln oder Zählern.
ignore_selectors:
# - "#last-modified"
# - ".timestamp"
# - "[data-cache-buster]"
# - ".cookie-banner"
# Reguläre Ausdrücke, die im normalisierten Text durch [IGNORED] ersetzt werden.
# Nützlich für Datumsangaben, Versionsnummern, etc.
ignore_patterns:
# Datumsformate (deutsch: 12.06.2026 oder 12. Juni 2026)
# - '\b\d{1,2}\.\s*(?:Januar|Februar|März|April|Mai|Juni|Juli|August|September|Oktober|November|Dezember)\s+\d{4}\b'
# - '\b\d{1,2}\.\d{1,2}\.\d{4}\b'
# "Stand: ..." Angaben
# - 'Stand:\s+\S+'
# Cache-Buster in URLs (werden im HTML-Text sichtbar)
# - '\?v=[\w.]+\b'