faecher:informatik:oberstufe:datenbanken:projekt:java_db:java_db_schuelerliste_suche:start

Flexible Abfragen: In der Schülerliste suchen

Du solltest das Projekt Schülerliste bereits für den ersten Projektschritt geklont und bearbeitet haben.

Gehe jetzt wie folgt vor:

  • Erstelle einen Commit mit den Änderungen deines Arbeitsverzeichnisses:
    • git add .
    • git commit -m "Schritt 1"

Bevor du auf dieser Seite weiterarbeitest, checke den Branch insert aus:

  • git checkout insert

Öffne das Bluej-Projekt und dort die Klasse SchuelerListe.


(A1)

Untersuche die Methoden printListe() und printSuche(String bedingung) der Klasse SchuelerListe.

  • Worin unterscheiden sie sich?
  • Teste beide Methoden. Wie muss eine Suchbedingung aussehen?
    • Gib alle Schüler aus, deren Nachname mit W beginnt
    • Gib alle Datensätze aus, die ein a enthalten.
    • Gib alle Datensätze aus, die ein b enthalten oder deren Vorname mit S beginnt.

Lösungshinweise


Die Abfragemöglichkeiten sind auf diese Weise sehr flexibel - meist möchte man nicht, dass der Benutzer völlig frei Bedingungen angeben kann, welche Daten er sehen kann.

Im nächsten Schritt soll die Suche also so eingeschränkt werden, dass Name und Vorname zu einem Datensatz angezeigt werden, nachdem die Mailadresse angegeben wurde. So soll erreicht werden, dass man zunächst die Mailadresse kennen muss, um die erlaubten Daten zu sehen.


(A2)

Ändere den Query-String so ab, dass nur noch nach Mail-Adressen gesucht werden kann. Frage so die Daten ab, die zur Mail-Adresse leo@gmx.de gehören.

Lösungsvorschläge


(A3)

Übernehme die Variante 2 aus den Lösungsvorschlägen der vorigen Aufgabe in deinen Code. Gelingt es dir, trotz der Einschränkung der Bedingung auf die Mail-Adresse einen String für den Methodenparameter zu finden, der dir alle Schüler ausgibt?

Lösungsvorschlag


Du hast eine SQL-Injection durchgeführt: Das ist eine (leider) häufige Sicherheitslücke bei der Programmierung von Datenbanken, die es Angreifern erlaubt Operationen durchzuführen, zu denen sie eigentlich nicht berechtigt sind. In diesem Fall sollte die Eingabe dazu führen, dass nur der zur Mailadresse gehörige Datensatz ausgegeben wird, durch eine geschickte Eingabe erhält man aber alle Datensätze.

Grundsätzlich ist immer größte Vorsicht geboten, wenn man in einem Programm mit Daten arbeitet, die durch Benutzer eingegeben werden. Man muss stets damit rechnen, dass bösartige Anwender ganz andere Daten eingeben, als man erwartet.

https://xkcd.com/327/

Du kannst das als "Angreifer" im Exkurs: InjectMe selbst ausführlicher ausprobieren, wenn du magst.

Wenn man in einer Datenbankabfrage Benutzereingaben als Parameter verwenden möchte, sollte man immer sogenannte Prepared Statemens verwenden. Das sieht dann so aus:

import java.sql.PreparedStatement;
// [...]
 
PreparedStatement statement = DBConnection.prepareStatement(
  "SELECT * FROM benutzer WHERE username = ? AND password = ?"
); // ? als Platzhalter, keine Anführungszeichen
 
// username und passwd werden vom Benutzer eingegeben
statement.setString(1, username);
statement.setString(2, passwd);
 
ResultSet result = statement.executeQuery();
// [...]

(A4)

Passe den Code so an, dass die Methode suche als Eingabe die Mailadresse und den Vornamen des Schülers entgegennimmt und genau den Datensatz ausgibt, der zu dieser Kombination passt. Verwende ein Prepared Statement um Falscheingaben abzufangen. Teste, ob du die Abfrage überlisten kannst.

Lösungsvorschlag


1)
Link öffnen, dann aus dem Browser in ein PDF drucken
  • faecher/informatik/oberstufe/datenbanken/projekt/java_db/java_db_schuelerliste_suche/start.txt
  • Zuletzt geändert: 04.04.2025 13:43
  • von Frank Schiebel