Modul 164 - Datenbanken erstellen und Daten einfügen

Zurück

Auf dieser Seite dokumentiere ich, wie ich mich auf das "Modul 164 - Datenbanken erstellen und Daten einfügen" für die Lehrstelle vorbereite.

Dieses Modul baut auf das Modul 162: Daten analysieren und modellieren auf.

Dabei orientiere ich mich an den Lernzielen der Modulidentifikation auf der Webseite modulbaukasten.ch.

Mit Unterstützung von ChatGPT und verschiedenen Online-Ressourcen habe ich folgenden Lernplan erstellt:

Lernplan:

Grundlagen relationaler Datenbanken

Definition und Konzepte relationaler Datenbanken

  • Datenbankmodelle:
    • Hierarchisches Modell
    • Netzwerkmodell
    • Relationales Modell
    • Objektorientiertes Modell
    • NoSQL-Datenbanken
  • Bedeutung von relationalen Datenmodellen
  • Interpretation eines logischen Datenmodells

Datenbankmanagementsysteme (DBMS)

  • Überblick über verschiedene RDBMS:
    • MariaDB
    • MySQL
    • SQL Server
    • PostgreSQL
  • Unterschiede und Gemeinsamkeiten der Systeme
  • Technologische Wahl im Modul:
    • Windows 11 mit SQL Server 2019 und MariaDB als empfohlene Plattformen
    • Alternativen mit Linux und PostgreSQL
  • Einschränkungen von SQLite

Erstellung eines Datenbankschemas

  • Einführung in die Datendefinitionssprache (DDL)
  • Wichtige Elemente eines DBMS:
    • Datenbanken, Tabellen, Felder, Zeichensätze, Schemata
  • Datentypen und deren Eigenschaften:
    • Zeichenfolgen, Ganzzahlen, Fliesskommazahlen, Datum/Zeit, Binärtypen
  • Primärschlüssel und Fremdschlüssel
  • Standardwerte für Attribute und Auto-Inkrement-Felder
  • Physisches Datenbankschema mit SQL DDL:
    • CREATE DATABASE
    • CREATE TABLE
    • ALTER TABLE
    • CONSTRAINT
    • FOREIGN KEY

Sicherstellung der referenziellen Integrität

  • Definition und Bedeutung von Integritätsbedingungen (Constraints)
  • Primär- und Fremdschlüssel setzen
  • Einschränkungen:
    • NOT NULL
    • Wertebereiche
    • Standardwerte
  • Regeln für das Ändern und Löschen von Datensätzen
  • Temporäre Deaktivierung von Constraints für bestimmte Operationen

Einfügen von Daten in die Datenbank

  • Einführung in die Datenbearbeitungssprache (DML)
  • INSERT-Befehl für einzelne und mehrere Datensätze
  • Nutzung von DBMS-Frontend-Tools zur Dateneingabe
  • BULK-Import:
    • CSV-Import
    • Problematik bei Primärschlüsseln

Abfragen und Analyse von Daten

  • SELECT-Abfragen mit Filterfunktionen
  • JOIN-Operationen:
    • 1:n-Beziehungen
    • n:m-Beziehungen
  • Komplexe Abfragen mit WHERE, GROUP BY, HAVING, ORDER BY
  • Verwendung von Subqueries und Aggregatfunktionen

Überprüfung der eingefügten Daten

  • Testkriterien zur Datenvalidierung
  • Abfrage von Datenbeständen zur Fehleranalyse
  • Erstellung von Checksummen zur Validierung
  • Prüfung auf referenzielle Integrität:
    • Sicherstellung von UNIQUE- und NOT NULL-Constraints
    • Prüfung von Fremdschlüsseln und deren Korrektheit

Korrektur und Manipulation von Daten

  • UPDATE-Befehl zum Ändern von Datensätzen
  • DELETE-Befehl zum Entfernen von Datensätzen
  • Erweiterte Datenbearbeitung:
    • INSERT INTO ... SELECT zur Datenübernahme zwischen Tabellen
    • Virtuelle Tabellen (Views) zur datenbankinternen Organisation
    • Updates mit Werten aus anderen Tabellen

Datenexport und erneuter Import

  • Daten in Flat-Files exportieren:
    • Export als CSV (mit Trennzeichen)
    • Export als SQL INSERT-Befehle
  • Importierte Daten auf Korrektheit prüfen:
    • Vergleich von Prüfsummen (CHECKSUM TABLE, CHECKSUM_AGG)
    • Überprüfung von NULL-Werten und ungültigen Attributen
    • Nutzung von Aggregatsfunktionen zur Datenvalidierung (COUNT, SUM, MIN, MAX)
  • Fehlerbehebung nach dem Import:
    • Nachträgliche Korrektur von inkonsistenten Datensätzen
    • Anpassung der Datenbankstruktur bei Problemen
    • Übertragung von Daten in neue Tabellen

Projektarbeit: Aufbau einer Datenbanklösung

  • Konzeption und Umsetzung eines eigenen Datenbankschemas
  • Umsetzung aller Phasen von der Modellierung bis zur Datenbearbeitung
  • Praxisbeispiel: Erstellung eines Bibliothekssystems mit:
    • Autoren, Verlage, Genres
    • Bücher und Ausleihsystem mit Kunden

Didaktische Methoden und Werkzeuge

  • Selbstorganisiertes Lernen (SOL) im Modul
  • Nutzung von Arbeitsblättern und Praxisbeispielen
  • Selbstlernkontrolle und Reflexion

Relationale Datenbanken

Heute ging es um die Grundlagen der relationaler Datenbanken. Dabei habe ich gelernt, was eine relationale Datenbank ist.

Eine relationale Datenbank speichert Daten in Tabellen. Jede Tabelle besteht aus Zeilen (Datensätze) und Spalten (Attribute).

In einer Zeile befinden sich Daten zu einer bestimmten Entität (einzelner Datensatz innerhalb einer Tabelle).

Auch wurde wieder erklärt, was Primärschlüssel und Fremdschlüssel sind.

  • Primärschlüssel:
  • Ein Primärschlüssel ist ein Attribut oder eine Kombination von Attributen, das jede Zeile eindeutig identifiziert.

  • Fremdschlüssel:
  • Ein Fremdschlüssel ist ein Attribut, das auf ein Primärschlüssel einer anderen Tabelle verweist, um eine Beziehung zwischen den Tabellen herzustellen.

Als übung habe ich wieder mit meiner im Modul-162 erstellten MariaDB Datenbank abfragen geübt.

Grundsätzlich war heute also wieder vieles reine repetition des Modul-162.

Datenbankmodelle

Heute habe ich die verschiedenen Datenbankmodelle gelernt.

Es gibt 5 Datenbankmodelle:

  • Hierarchisches Modell:
  • Daten werden in einer Baumartigen Struktur organisiert.

    Jede Datenzeile hat nur eine übergeordnete Zeile.

  • Netzwerkmodell:
  • Ähnlich dem Hierarchischem Modell, aber hier können Daten mehrere übergeordnete Zeilen haben.

  • Relationales Modell:
  • Das am häufigsten verwendete Modell, bei dem Daten in Tabellen gespeichert werden, die durch Schlüssel miteinander verbunden sind.

  • Objektorientiertes Modell:
  • Daten werden als Objekte gespeichert, ähnlich wie bei der Programmierung mit Klassen und Instanzen.

  • NoSQL-Datenbanken:
  • Diese Datenbanken sind nicht relational und speichern Daten in Formaten wie Dokumenten, Key-Value-Pairs oder Graphen.

    Geeignet für grosse, verteilte Datenmengen.

Datenbankmanagementsysteme (DBMS)

Ein DBMS ist eine Software, die hilft, Datenbanken zu erstellen, zu verwalten und zu organisieren.

Übliche relationale DBMS

  • MySQL
  • Weit verbreitet und schnell. Verwendet für Webanwendungen.

  • MariaDB
  • Eine Weiterentwicklung von MySQL.

  • PostgreSQL
  • Robustes und Flexibles Relationales Datenbankmanagementsystem (RDBMS).

    Beliebt bei grossen und komplexen Anwendungen.

  • SQL Server
  • Von Microsoft entwickletes RCBMS.

    Oft in Unternehmungsumgebungen verwendet.

  • SQLite
  • Ein Leichtgewichtiges DBMS, das in kleinen Anwendungen verwendet wird.

Unterschiede und Gemeinsamkeiten

Feature MariaDB MySQL PostgreSQL SQL Server
Open SourceJaTeilweiseJaNein (kommerziell)
PlattformLinux, Windows, MacLinux, Windows, MacLinux, Windows, MacWindows, Linux (nur begrenzt)
LeistungSchnell, effizientGut für Web-AppsSehr leistungsstarkExtrem leistungsfähig für große Systeme
JSON-UnterstützungEingeschränktEingeschränktSehr gutSehr gut
Erweiterte SQL-FunktionenMittelMittelSehr umfangreichSehr umfangreich
Transaktionen (ACID)JaJaJaJa

ACID-Konformität

ACID-konform bedeutet, dass eine Datenbank vier Eigenschaften garantiert:

  • Atomicity – Unteilbarkeit von Transaktionen
  • Consistency – Daten bleiben konsistent
  • Isolation – Gleichzeitige Transaktionen beeinflussen sich nicht
  • Durability – Daten bleiben auch nach einem Absturz erhalten

Erstellung eines Datenbankschemas (DDL, Tabellen etc...)

Erstellung eines Datenbankschemas (DDL, Tabellen usw.)

Bevor man mit SQL arbeitet, braucht man ein konzeptionelles Modell der Datenbank. Dazu gehören Tabellen, ihre Beziehungen und Regeln zur Datenintegrität.

Vor diesem Schritt sollte ein ER-Diagramm erstellt werden, um die Tabellen, die Beziehungen und die Regeln grafisch darzustellen.

Vergleich mit einem Bauprojekt:

  • Bevor man ein Haus baut, erstellt man einen Bauplan → ER-Diagramm
  • Dann baut man Wände und Räume → DDL-Code, der das Gerüst der Datenbank bildet
  • Erst wenn man Möbel reinstellt, ist das Haus fertig → DML (Daten einfügen)

Datenbankschema mit DDL erstellen

DDL steht für Data Definition Language. Um das "Gerüst" einer Datenbank zu bauen, verwendet man folgende SQL-Befehle:

SQL-BefehlBeschreibung
CREATE DATABASEErstellt eine neue Datenbank
CREATE TABLEErstellt eine Tabelle mit Spalten
ALTER TABLEÄndert eine bestehende Tabelle (z. B. Spalten hinzufügen)
DROP TABLELöscht eine Tabelle vollständig
CONSTRAINTDefiniert Regeln für Werte (z. B. NOT NULL, UNIQUE)
FOREIGN KEYErstellt eine Beziehung zwischen Tabellen

Ein Datenbankschema besteht aus:

  • Eine Datenbank enthält Tabellen
  • Tabellen bestehen aus Spalten (Attribute) und Zeilen (Datensätze)
  • Das Schema ist die Struktur der Datenbank

Beispielhafte Datentypen:

DatentypBeschreibungBeispiel
INTGanze ZahlSchuetze_ID INT
VARCHAR(n)Zeichenkette mit max. Länge nName VARCHAR(50)
DATESpeichert ein DatumGeburtsdatum DATE
DECIMAL(m, d)Dezimalzahl mit m Stellen, davon d NachkommastellenErgebnis DECIMAL(5,2)

Beispiel: Datenbank erstellen

CREATE DATABASE schiessstandDB;

USE schiessstandDB;

Tabellen erstellen

1. Tabelle für Schützen

CREATE TABLE Schuetzen (
                SchuetzeID INT PRIMARY KEY AUTO_INCREMENT,
                Name VARCHAR(50) NOT NULL,
                Geburtsdatum DATE,
                Wohnort VARCHAR(50)
                );
                
  • PRIMARY KEY (SchuetzeID): Jeder Schütze hat eine eindeutige ID
  • AUTO_INCREMENT: ID wird automatisch hochgezählt
  • NOT NULL: Name darf nicht leer sein

2. Tabelle für Waffen

CREATE TABLE Waffen (
                WaffeID INT PRIMARY KEY AUTO_INCREMENT,
                Modell VARCHAR(50) NOT NULL,
                Kaliber VARCHAR(50) NOT NULL,
                Hersteller VARCHAR(50)
                );
                

3. Tabelle für Schiessstände

CREATE TABLE Schiessstand (
                SchiessstandID INT PRIMARY KEY AUTO_INCREMENT,
                Standort VARCHAR(50) NOT NULL,
                Max_Entfernung INT
                );
                

4. Ergebnistabelle (mit Fremdschlüsseln)

CREATE TABLE Ergebnisse (
                ErgebnisID INT PRIMARY KEY AUTO_INCREMENT,
                SchuetzeID INT,
                WaffeID INT,
                SchiessstandID INT,
                Punkte DECIMAL(5,2),
                Datum DATE NOT NULL,
                FOREIGN KEY (SchuetzeID) REFERENCES Schuetzen(SchuetzeID),
                FOREIGN KEY (WaffeID) REFERENCES Waffen(WaffeID),
                FOREIGN KEY (SchiessstandID) REFERENCES Schiessstand(SchiessstandID)
                );
                

Constraints und Aufbau

Wichtige Constraints

ConstraintFunktion
NOT NULLWert darf nicht leer sein
UNIQUEWert muss eindeutig sein
DEFAULTStandardwert setzen
CHECKBedingungen setzen (z. B. Zahlenbereich)

Beispiel: Einschränkungen in Schuetzen-Tabelle

CREATE TABLE Schuetzen (
                SchuetzeID INT PRIMARY KEY AUTO_INCREMENT,
                Name VARCHAR(50) NOT NULL,
                Geburtsdatum DATE CHECK (Geburtsdatum <= CURDATE()),
                Wohnort VARCHAR(50) DEFAULT 'Unbekannt'
                );
                
  • NOT NULL: Name darf nicht leer sein
  • CHECK: Geburtsdatum darf nicht in der Zukunft liegen
  • DEFAULT: Falls kein Wohnort eingetragen wird, wird "Unbekannt" eingetragen

Reihenfolge beim Aufbau einer Datenbank

SchrittFunktionBeispiel
ER-DiagrammPlanung, KonzeptZeigt Tabellen und ihre Beziehungen
DDL (CREATE TABLE)Struktur erstellenTabellen mit Primär- und Fremdschlüsseln
DML (INSERT INTO)Daten einfügenSchuetzen, Waffen usw.
SQL-Abfragen (SELECT)Daten auswertenListe aller Schuetzen

Referenzielle Integrität

Sicherstellung der referenziellen Integrität

Nachdem das Grundgerüst mit Tabellen und Beziehungen steht, muss man sicherstellen, dass Datenintegrität gewahrt bleibt.

Vergleich: Türschloss-System

  • Ohne Schlüsselkontrolle kann jeder in beliebige Räume
  • Mit Schlüsselmanagement: Nur autorisierte Personen dürfen hinein

Ziel: Fremdschlüssel (FK) dürfen nicht ins Leere zeigen und die Daten sollen konsistent bleiben.

Was ist referenzielle Integrität?

Sie stellt sicher, dass Beziehungen zwischen Tabellen korrekt bleiben. Dazu setzt man Fremdschlüssel und definiert Regeln für das Löschen oder Aktualisieren von Daten:

Beispiel mit ON DELETE und ON UPDATE:

CREATE TABLE Ergebnisse (
            Ergebnis_ID INT PRIMARY KEY AUTO_INCREMENT,
            Schuetze_ID INT,
            Waffe_ID INT,
            Schiessstand_ID INT,
            Punkte DECIMAL(5,2),
            Datum DATE NOT NULL,
            FOREIGN KEY (Schuetze_ID) REFERENCES Schuetzen(Schuetze_ID)
                ON DELETE CASCADE
                ON UPDATE CASCADE,
            FOREIGN KEY (Waffe_ID) REFERENCES Waffen(Waffe_ID)
                ON DELETE SET NULL
                ON UPDATE CASCADE,
            FOREIGN KEY (Schiessstand_ID) REFERENCES Schiessstaende(Schiessstand_ID)
                ON DELETE RESTRICT
                ON UPDATE CASCADE
            );
            

Erklärung der Fremdschlüssel-Optionen:

OptionBedeutung bei DELETE/UPDATE
CASCADEVerknüpfte Einträge werden mit gelöscht/geändert
SET NULLVerknüpfter Wert wird auf NULL gesetzt
RESTRICTLöschen wird blockiert, wenn noch Verknüpfungen bestehen

Tabelle aktualisieren & MariaDB starten

Tabelle mit ALTER TABLE erweitern

Um z. B. eine neue Spalte oder eine Regel hinzuzufügen, verwendet man ALTER TABLE:

ALTER TABLE Ergebnisse
            ADD CONSTRAINT Punkte CHECK (Punkte BETWEEN 0 AND 200);

            ALTER TABLE Ergebnisse
            ADD COLUMN Test VARCHAR(50) DEFAULT 'Test';
            

Mit DESCRIBE bekommt man eine Übersicht über alle Spalten:

DESCRIBE Ergebnisse;
            
FieldTypeNullKeyDefaultExtra
ErgebnisIDint(11)NOPRINULLauto_increment
SchuetzenIDint(11)YESMULNULL
SchiessstandIDint(11)YESMULNULL
Punkteint(11)YESNULL
DatumdateYESNULL
Testvarchar(50)YESTest

MariaDB starten & Datenbank wählen

$ mysql -u root -p

            SHOW DATABASES;
            USE SchiessDB;
            

Damit wechselt man in die gewünschte Datenbank.

Einfügen von Daten in die Datenbank (DML)

Einfügen von Daten in die Datenbank (DML)

Nachdem die Struktur steht , geht es darum, die Datenbank mit echten Werten zu füllen.

DML-Befehle:

  • INSERT – Daten hinzufügen
  • UPDATE – Daten ändern
  • DELETE – Daten löschen
  • SELECT – Daten anzeigen

Beispiele:

-- Einzelner Eintrag
            INSERT INTO Schuetzen (Name, Alter, Wohnort)
            VALUES ('Max Müller', 30, 'Arch');

            -- Mehrere Einträge gleichzeitig
            INSERT INTO Waffen (Modell)
            VALUES ('Sig P220'), ('Desert Eagle'), ('Sig P320');
            

Tabellenübersicht anzeigen

SHOW TABLES;
            
Tables_in_SchiessDB
Ergebnisse
Schiessstand
Schuetzen
Schuetzen_Waffen
Waffen

Datensätze anzeigen

SELECT * FROM Schuetzen;
            
SchuetzenIDNameAlterWohnort
1Max25Bern
2Anna22Zürich
3Marcel18Thun
4Beni32Ostermundigen
5Alf19Bümpliz

Abfragen und Datenanalysen (Select & Join)

Abfragen & Datenanalyse (SELECT & JOIN)

Grundlegende Abfragen:

-- Alle Namen anzeigen
            SELECT Name FROM Schuetzen;

            -- Alle Daten von Schuetzen aus Zürich
            SELECT * FROM Schuetzen WHERE Wohnort = 'Zürich';

            -- Schuetzen unter 26 Jahren
            SELECT * FROM Schuetzen WHERE Alter < 26;

            -- Nur bestimmte Kaliber
            SELECT * FROM Waffen WHERE Kaliber IN ('9mm', '10mm');
            

JOINs – Tabellen logisch verbinden

Mit JOINs verknüpft man mehrere Tabellen in relationalen Datenbanken:

JOIN-TypZeigt ALLE aus…UND nur passende aus…
INNER JOINNur mit VerbindungBeide Tabellen
LEFT JOINLinke Tabelle (immer)Rechte Tabelle (nur bei Match)
RIGHT JOINRechte Tabelle (immer)Linke Tabelle (nur bei Match)
FULL OUTER JOINBeide Tabellen (alles)

Beispiel INNER JOIN:

SELECT s.Name, e.Punkte, e.Datum
            FROM Ergebnisse e
            INNER JOIN Schuetzen s ON e.SchuetzeID = s.SchuetzeID;
            

Nur Schuetzen mit Ergebnis werden angezeigt.

NamePunkte
Max92
Tom88

Beispiel LEFT JOIN:

SELECT * FROM Schuetzen s
            LEFT JOIN Ergebnisse e ON s.SchuetzeID = e.SchuetzeID;
            

Alle Schuetzen werden angezeigt – auch ohne Ergebnis.

NamePunkte
Max92
LisaNULL
Tom88

Beispiel FULL OUTER JOIN (Simulation mit UNION):

SELECT * FROM Schuetzen s
            LEFT JOIN Ergebnisse e ON s.SchuetzeID = e.SchuetzeID
            UNION
            SELECT * FROM Schuetzen s
            RIGHT JOIN Ergebnisse e ON s.SchuetzeID = e.SchuetzeID;
            

Damit bekommt man ALLE Schuetzen mit/ohne Ergebnis und ALLE Ergebnisse mit/ohne zugeordneten Schuetzen.

Beispieldaten:

SchuetzenIDName
1Max
2Lisa
3Tom
ErgebnisIDSchuetzenIDPunkte
101192
102388

Abfragen & Analyse (SELECT mit Bedingungen)

Beispiele mit WHERE:

-- Nur Namen anzeigen
            SELECT Name FROM Schuetzen;

            -- Alle aus Zürich
            SELECT * FROM Schuetzen WHERE Wohnort = 'Zürich';

            -- Nur unter 26 Jahre alt
            SELECT * FROM Schuetzen WHERE Alter < 26;

            -- Nur bestimmte Kaliber
            SELECT * FROM Waffen WHERE Kaliber IN ('9mm', '10mm');
            

JOINS – Tabellen logisch verbinden

JOINS verknüpfen mehrere Tabellen zu sinnvollen Ergebnissen. Es gibt INNER, LEFT, RIGHT und FULL OUTER JOIN.

-- INNER JOIN: Nur Treffer beider Tabellen
            SELECT s.Name, e.Punkte, e.Datum
            FROM Ergebnisse e
            INNER JOIN Schuetzen s ON e.SchuetzenID = s.SchuetzenID;

            -- LEFT JOIN: Alle Schuetzen, auch ohne Ergebnis
            SELECT * FROM Schuetzen s
            LEFT JOIN Ergebnisse e ON s.SchuetzenID = e.SchuetzenID;
            

FULL OUTER JOIN simulieren (nicht direkt in MySQL)

SELECT * FROM Schuetzen s
            LEFT JOIN Ergebnisse e ON s.SchuetzenID = e.SchuetzenID
            UNION
            SELECT * FROM Schuetzen s
            RIGHT JOIN Ergebnisse e ON s.SchuetzenID = e.SchuetzenID;
            

Erweiterte Filter: GROUP BY & HAVING

-- Gruppieren nach Name, Durchschnitt berechnen
            SELECT s.Name, AVG(e.Punkte) AS Schnitt
            FROM Ergebnisse e
            JOIN Schuetzen s ON e.SchuetzenID = s.SchuetzenID
            GROUP BY s.Name;

            -- Bedingung auf Aggregatwert
            SELECT s.Name, AVG(e.Punkte) AS Schnitt
            FROM Ergebnisse e
            JOIN Schuetzen s ON e.SchuetzenID = s.SchuetzenID
            GROUP BY s.Name
            HAVING Schnitt > 180;
            

Aggregieren & Subqueries

COUNT(), SUM(), AVG(), MAX(), MIN() helfen, Werte zusammenzufassen.

-- Beispiel: Wie oft hat jemand geschossen?
            SELECT s.Name, COUNT(e.ErgebnisID) AS Anzahl
            FROM Ergebnisse e
            JOIN Schuetzen s ON s.SchuetzenID = e.SchuetzenID
            GROUP BY s.Name;
            

Subquery Beispiel:

-- Zeige alle Schuetzen über dem Gesamtdurchschnitt
            SELECT s.Name
            FROM Ergebnisse e
            JOIN Schuetzen s ON s.SchuetzenID = e.SchuetzenID
            GROUP BY s.Name
            HAVING AVG(e.Punkte) > (
            SELECT AVG(Punkte) FROM Ergebnisse
            );
            

UNION SELECT, LIMIT, OFFSET, Fehlerlogik und SQL-Injection

UNION, LIMIT, OFFSET, Fehlerlogik & SQLi

Union Select

-- Kombiniert zwei Abfragen mit gleichen Spalten
            SELECT name, city FROM customers
            UNION
            SELECT company, city FROM suppliers;
            

SQLi Beispiel (unsicherer Code)

SELECT name FROM users WHERE id = '$id';
            -- Angreifer gibt ein:
            SELECT name FROM users WHERE id = 1 UNION SELECT password FROM users -- ;
            

-- kommentiert den Rest. So wird SQL manipuliert. Wichtig für Sicherheitstests!

Typische Anzeichen für SQL-Injection

  • Plötzlich viel mehr Daten oder fremde Spalten erscheinen
  • Fehlermeldungen wie Unknown column oder Syntax error
SELECT * FROM users WHERE username = '$user' AND password = '$pass';

            -- Angreifer-Eingabe:
            SELECT * FROM users WHERE username = 'admin' -- ;
            

Durch -- wird der Passwort-Check deaktiviert!

LIMIT & OFFSET zur Datenexfiltration

Angreifer können damit schrittweise Daten abfragen:

SELECT name, email FROM users LIMIT 1 OFFSET 0;
            SELECT name, email FROM users LIMIT 1 OFFSET 1;
            SELECT name, email FROM users LIMIT 1 OFFSET 2;
            

So werden alle Einträge einzeln sichtbar gemacht.

Absicherung gegen UNION & SQLi (Sneak Peek)

  • Prepared Statements – SQL-Code und Daten getrennt
  • Whitelist – Nur erlaubte Eingaben
  • Keine Fehlermeldungen – Nur intern loggen
  • LIMIT – Auf sensible Daten begrenzen

Mehr dazu in einem späteren Kapitel.