Mindflux: Sicherheit, Datenintegrität und Navigation härten

This commit is contained in:
AliceDarkest
2026-07-12 21:47:37 +02:00
parent db6b5bbb1a
commit 005d2d7d8c
73 changed files with 2495 additions and 650 deletions
@@ -0,0 +1,30 @@
-- Datenintegrität: E-Mail eindeutig (case-insensitiv) und referenzielle Integrität
-- für Scores/Achievements. Verwaiste Altdaten werden vorher bereinigt.
-- 1) E-Mail-Dubletten auflösen: Die älteste Zeile behält die Adresse, spätere verlieren sie.
UPDATE users u
SET email = NULL
WHERE u.email IS NOT NULL
AND EXISTS (
SELECT 1 FROM users o
WHERE o.email IS NOT NULL
AND lower(o.email) = lower(u.email)
AND o.id < u.id
);
CREATE UNIQUE INDEX uq_users_email_lower ON users (lower(email)) WHERE email IS NOT NULL;
-- 2) Verwaiste Spielstände/Achievements entfernen (stammen aus Zeiten ohne FK).
DELETE FROM game_scores WHERE username NOT IN (SELECT username FROM users);
DELETE FROM achievements WHERE username IS NOT NULL AND username NOT IN (SELECT username FROM users);
-- 3) Referenzielle Integrität: Löschen räumt Daten mit ab, Umbenennen zieht sie mit um.
ALTER TABLE game_scores
ADD CONSTRAINT fk_game_scores_user
FOREIGN KEY (username) REFERENCES users (username)
ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE achievements
ADD CONSTRAINT fk_achievements_user
FOREIGN KEY (username) REFERENCES users (username)
ON DELETE CASCADE ON UPDATE CASCADE;
@@ -0,0 +1,6 @@
-- Benutzernamen case-insensitiv eindeutig machen: Die App prüft bei Login und
-- Registrierung ignoreCase, die DB kannte bisher nur ein case-sensitives UNIQUE.
-- Damit ist auch das Check-then-Insert-Race der Registrierung abgesichert.
-- Voraussetzung: Es existieren keine Bestandsnamen, die sich nur in der
-- Groß-/Kleinschreibung unterscheiden (sonst vorher manuell bereinigen).
CREATE UNIQUE INDEX uq_users_username_lower ON users (lower(username));