Keiner der AJAX-Endpunkte hat einen Login geprueft. Ohne Anmeldung liessen
sich Kunden, Adressen und Rechnungen durchsuchen, und ajax/autosave.php
setzt $_POST ungeprueft in SQL (SQL-Injection ohne Login).
- incs/connectmysql.php und ajax/auto/connectmysql.php, die alle
AJAX-Endpunkte laden, antworten ohne gueltige Session mit 403
- stats.php verlangt eine Anmeldung
- db-backup.php und clean_db.php laufen nur noch per Kommandozeile;
ueber den Webserver konnte jeder einen Datenbank-Dump anstossen
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
- incs/db.php: db_verbinden() setzt utf8mb4, strikten sql_mode und schaltet
die mysqli-Exceptions von PHP 8.1+ ab, damit die bestehenden
"or error(mysqli_error())"-Pruefungen weiter greifen.
- db_abfrage/db_zeilen/db_zeile/db_wert mit ?-Platzhaltern
(mysqli_execute_query, PHP 8.2).
- Alle neun kopierten mysqli_connect/select_db-Stellen nutzen jetzt
db_verbinden().
Nur zusammen mit der auf utf8mb4 migrierten Datenbank einsetzbar.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Bestehende Codebasis als Ausgangsstand aufgenommen.
- .gitignore: Kundendaten (uploads_*), Smarty-Compile-Cache
(templates_c), Laufzeit-Temp und Datenbank-Dumps ausgeschlossen;
Verzeichnisstruktur ueber .gitkeep erhalten
- .gitattributes: Zeilenenden normalisiert (LF im Repo),
Binaerformate markiert
- db-backup.php: MySQL-Zugangsdaten kommen jetzt wie im Rest der
Anwendung aus der externen Konfiguration statt hartkodiert aus der
Datei; Passwort wird ueber eine temporaere Optionsdatei statt per
Kommandozeile uebergeben, Fehler von mysqldump/gzip werden gemeldet,
Aufraeumen aelterer Backups berechnet Jahr und Monat konsistent
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>