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

Dies ist eine alte Version des Dokuments!


Flexible Abfragen: In der Schülerliste suchen

Du solltest das Projekt 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 SchulerListe.


(A1)

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

  • 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.

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 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/

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;
[...]
# Statement vorbereiten, ? als Platzhaltzer für Parameter, die von außen gesetzt werden
PreparedStatement statement = DBConnection.prepareStatement("SELECT * FROM schueler WHERE SEmail=?");
# Parameter setzen, nummeriert beginnend bei 1
statement.setString(1,bedingungen);
# Abfrage ausführen
ResultSet result = statement.executeQuery();
  • faecher/informatik/oberstufe/datenbanken/projekt/java_db/java_db_schuelerliste_suche/start.1743605742.txt.gz
  • Zuletzt geändert: 02.04.2025 14:55
  • von Frank Schiebel