- formularZahl(): steht ein Komma im Betrag, sind Punkte Tausendertrenner
("1.234,50" -> 1234.50, vorher 1.23); ohne Komma bleibt der Punkt
Dezimaltrenner wie bei der Artikel-Autovervollstaendigung ("12.50").
- Rechnungs-Templates (addrechnung, mailrechnung, changeadr, copyrech,
umschlagshow, rechshow) geben alle Daten mit |escape aus; Werte aus der
URL (id, type, newtype) als int.
- Rechnungssuche: Artikelnamen werden escaped statt als HTML ausgegeben
(Trennung per Zeilenumbruch in SQL, artikelListeHtml() in PHP).
- Suchbegriffe kommen per encodeURIComponent als UTF-8, utf8_encode()
entfaellt; vorher gingen Zeichen ausserhalb von Latin-1 verloren.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
- incs/rechnung.php: alle Abfragen mit Platzhaltern. saveRechnung() setzte
$_POST ungeprueft in SQL (Injection; ein Apostroph im Text brach das
Speichern ab). Speichern, Kopieren und Loeschen laufen in Transaktionen,
bei Fehlern bleibt nichts Halbes zurueck. Formularwerte ueber
formularText/-Zahl/-Ganzzahl (strikter Modus).
- copyRech() trug die Rechnungsnummer ohne typ_id ein (Fehler im strikten
Modus) und zaehlte typuebergreifend; jetzt wie beim Anlegen pro Typ
(neueRechnungsnummer()). Artikel und Eigenschaften per INSERT ... SELECT.
- Adressblock-Formatierung aus makeadressblock() und
makeadressblockUmschlag() in formatiereAdressblock() zusammengefuehrt.
- ajax/autosave.php und ajax/preview.php teilen sich saveTmpRechnung();
ueberzaehlige Entwuerfe werden samt Artikeln entfernt (vorher FK-Fehler).
- sites/rechnungadd.php: Storno ohne SQL-Injection ueber $_GET["id"],
Auswahllisten ueber db_zuordnung(), tote Kommissions-Abfrage entfernt.
- Rechnungssuche (createRechQry/createKdnRechQry) liefert SQL und Parameter
getrennt; Suchbegriffe waren ungeprueft im SQL.
- saveLog() mit Platzhaltern, Protokolltext ueber db_sql_text().
- db.php: db_zuordnung(), db_sql_text(); Helfer liefern Strings wie
mysqli_query(), damit alter Code sich gleich verhaelt.
Getestet: alter und neuer Code lesen dieselbe migrierte Datenbank, 150 von
155 Pruefungen (10.936 Werte) identisch, die uebrigen 5 sind der
Injection-Suchbegriff (alt: SQL-Fehler). Schreibtests fuer Entwurf,
Anlegen, Nummernkreise, Aendern, Rollback, Kopieren, Adresse, Storno und
Loeschen im strikten Modus.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
- sites/start.php: ein Query statt zwei, Passwortvergleich per hash_equals
in PHP statt im SQL, Updates per id. Die Eingaben gehen nicht mehr durch
htmlspecialchars(): Passwoerter werden beim Anlegen roh gehasht, mit
& < > " ' konnte man sich deshalb bisher nie anmelden.
- getUserSetting/updateUserSetting mit Platzhaltern; behoben: INSERT-Zweig
rief mysqli_real_escape_string ohne Verbindung auf (Fatal Error),
$mysqli_error als Variable, ungewolltes echo "update". Aufrufer escapen
nicht mehr vor (sonst doppelt), settings.php: Tippfehler
mysqi_real_escape_string beim Speichern von show_sks behoben, style nur
als Dateiname ohne Pfad.
- authServer.php, addKey.php, userkeys.php, checkAdduser(): Platzhalter.
Passkey-INSERT setzt lastAuth/authKey (Pflichtfelder im strikten Modus).
addKey nur als reine Ziffern, sonst passte "12345678xyz" per Typumwandlung.
- checkLogin() entfernt: nirgends aufgerufen, fragte die nicht existierende
Tabelle users ab.
- userkeys.tpl: Passkey-Name escaped.
Getestet gegen die migrierte Testdatenbank im strikten Modus.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
authServer.php nahm getCreateArgs/processCreate ohne jede Pruefung an und
uebernahm die Benutzer-id aus der URL. Jeder konnte damit aus dem Internet
einen Passkey fuer ein beliebiges Konto (auch Superadmin) registrieren und
sich anschliessend anmelden.
- sites/userkeys.php loest den addKey ein und legt eine Freigabe in der
Session ab (5 Minuten, ein Benutzer, einmalig); der addKey wird geloescht
- authServer.php verlangt fuer getCreateArgs/processCreate Login,
Superadmin-Recht und diese Freigabe; die Benutzer-id kommt aus der
Freigabe, nicht aus der URL
- queryFidoMetaDataService nur fuer Superadmins
- Passkey-Login verweigert gesperrte Benutzer und meldet keinen Erfolg
mehr, wenn der Benutzer fehlt
- addKey.php verlangt wie userkeys.php das Superadmin-Recht
- session_regenerate_id() nach Passwort- und Passkey-Login
- userkeys.php/addKey.php: $_GET["id"] als int statt ungequotet in SQL
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Entfernt, weil kein Code mehr darauf verwies:
- smarty3/ (Smarty 3.1.6; alle Aufrufer nutzen smarty/ mit 4.5.6)
- incs/tcpdf_old/
- incs/fpdf.php samt FPDF-Schriftmetriken in incs/font/*.php
und incs/font/makefont/ (nur von sites/makepdf_OLD.php genutzt,
parste ab PHP 8.0 ohnehin nicht mehr)
- sites/makepdf_OLD.php
- incs/users_old.php
- oldindex.php (nirgends verlinkter Alt-Einstiegspunkt)
Behalten: incs/PHPMailer_v5.1 (wird von sites/projectadd.php genutzt)
und die TTFs in incs/font (werden von stats.php fuer pChart geladen).
CLAUDE.md entsprechend nachgezogen.
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>