Files
businesscard/README.md
2026-02-13 21:59:45 +01:00

6.1 KiB

Digitale Visitenkarten (Businesscard)

Dieses Projekt stellt eine einfache Verwaltungsoberfläche für digitale Visitenkarten bereit. Jede Karte wird über eine UUID adressiert, die eindeutig einem Datensatz in der Datenbank zugeordnet ist. Besucher:innen rufen die Karte über card.php?uuid= auf, während Administrator:innen über das Passwort-geschützte Dashboard alle Identitäten, Feldwerte, Dateien und UUID-Token pflegen.

Architektur

  • PHP/Apache-Weboberfläche in www/ mit Frontend (card.php, download.php) und Backend (admin.php plus _sql.php, _func.php, _user.php).
  • MariaDB (Docker) hält Tabellen für Identitäten, Felder, UUIDs, Berechtigungen, Dateien und Loginversuche (db/init/001_schema.sql).
  • Docker Compose startet Webserver und Datenbank; www/ wird in den Apache-Container gemountet, www/files/ spiegelt das Upload-Verzeichnis /var/www/files/.
  • Uploadverzeichnis www/files/ liegt außerhalb des Document Roots und ist als .gitkeep im Repository abgelegt, damit Hochladungen später von download.php referenziert werden.

Installation & erster Start

  1. Repository clonen.
  2. www/secret.php vom Beispiel kopieren (secret.php.example) und Datenbankzugang konfigurieren, damit _sql.php sich verbinden kann.
  3. mkdir -p www/files (oder md www/files unter Windows) ausführen und darauf achten, dass die .gitkeep-Datei vorhanden ist, damit der Ordner beim Containerstart genutzt wird.
  4. docker-compose up --build im Projektverzeichnis ausführen, um Apache und MariaDB zu starten.
  5. http://localhost/admin.php öffnen; die Standardanmeldedaten stehen in www/_user.php (admin / password) und sollten sofort geändert werden.

Admin-Oberfläche & Workflows

  • Login schützt das Dashboard; nach drei gescheiterten Versuchen wird eine IP für eine Stunde gesperrt (admin_login_attempts).
  • Das Dashboard zeigt alle Identitäten sowie UUID-Token. Neue Identitäten erstellt man über ?action=identity_create.
  • Jedes Identity kann beliebige Felder (identity_fields) enthalten. Der Typ kann single, multi, file oder url sein.
  • Dateien werden pro Identität über das neue Upload-Formular hinzugefügt und landen in www/files/. Der Upload speichert Dateiname, generierten Zwischennamen und MIME-Type in files.
  • Wenn ein Feld auf Typ file gesetzt ist, zeigt die Auswahl nur Uploads der aktuellen Identität (per files.identity_id). Die ausgewählte Datei-ID wird im Feldwert gespeichert, damit später nur diese Datei angezeigt oder heruntergeladen wird.
  • UUID-Token (access_tokens) verbinden eine Identität mit einer eindeutigen Zeichenfolge, können optional Auslaufdaten und Notizen erhalten und dürfen nur einmal existieren. Tokenrechte (token_permissions) bestimmen, welche Feldschlüssel Besucher:innen sehen.

Besucheransicht (Visitenkarte)

  • /card.php?uuid=<UUID> lädt nur die Felder, die das Token freigibt, sowie Dateien mit demselben Token oder ohne Tokenbindung.
  • Dateifelder erscheinen unterhalb der Felder als Downloadlinks, wenn der Token für die Datei berechtigt ist.
  • Das Frontend zeigt Meta-Informationen (Ablaufdatum, Notiz) sowie eine gekürzte UUID. Bestehende Admin-Sessions leiten zurück zum Dashboard, damit Redakteur:innen schnell bearbeiten können.

Datenbankstruktur im Überblick

Tabelle Zweck
identities Identitätsdatensätze mit Name und Timestamp.
identity_fields Key-Value-Felder (Text, mehrzeilig, Datei, URL) pro Identität.
access_tokens UUID-Token pro Identität mit Ablauf, Notiz und eindeutiger Zeichenfolge.
token_permissions Erlaubte Feldschlüssel pro Token.
files Hochgeladene Dateien mit identity_id, filename, stored_name, mime_type und optional token_id.
admin_login_attempts Brute-Force-Schutz mit Zählern und Sperrzeit pro IP.

Sicherheitshinweise

  • UUIDs sind einmalige Zugriffstoken und sollten nicht doppelt vergeben oder offen weitergegeben werden, wenn geschützte Daten hinterlegt sind.
  • Admin-Zugang: Bitte www/_user.php durch eigene Credentials ersetzen oder ein robusteres Auth-Verfahren implementieren.
  • Loginversuche werden nach drei Fehlversuchen eine Stunde gesperrt (registerFailedLogin, isIpLocked, clearLoginAttempts).
  • Datei-Uploads liegen im Verzeichnis www/files/ (Container: /var/www/files/) und dürfen ausschließlich über download.php mit gültigem Token ausgeliefert werden. Der Ordner sollte nicht direkt vom Webserver referenziert werden.

Weiterentwicklung & Pflege

  1. Stil & Branding: Die Inline-CSS im card.php-Head kann durch ein eigenes Template ersetzt oder ausgelagert werden.
  2. Dateien & Automatisierung: UUIDs und zugehörige Dateien lassen sich per API oder QR-Code verteilen. Die Download-Logik kann um Freigabezeitfenster erweitert werden.
  3. Tests & Validierung: Neue Felder brauchen eventuell Frontend-Validierung; Dateiuploads sollten auf MIME-Type, Größe und erlaubte Endungen geprüft werden.
  4. Deployment: Docker Compose genügt lokal. In Produktion empfiehlt sich ein Reverse Proxy, HTTPS und regelmäßige Backups des MariaDB-Volumes (db_data). Auch www/files/ sollte gesichert werden, da dort alle Uploads gespeichert werden.

Hinweis: UUIDs repräsentieren digitale Visitenkarten und sind einmalig. Jeder Besuch über eine UUID dokumentiert genau eine Karte, deren Sichtbarkeit über Tokenrechte und Datei-Zuordnungen kontrolliert wird.