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.
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.
(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?
SQL-Injection
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.
Du kannst das als "Angreifer" im Exkurs: InjectMe selbst ausführlicher ausprobieren, wenn du magst.
Gegenmaßnahmen
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.