Level 2 – Benutzerverwaltung und erste Sicherheitsprobleme
Voraussetzung
- Level 1 muss vollständig umgesetzt und funktionsfähig sein
- Die Serververwaltung ist erreichbar unter:
http://SERVER-IP/
Ziel
- Einführung einer einfachen Benutzeranmeldung
- Schutz von Funktionen (Eintragen/Löschen)
- Aufzeigen von Sicherheitsproblemen (SQL Injection)
Erweiterung der Datenbank
mysql -u root
use serververwaltung;
- Tabelle für Benutzer anlegen
create table benutzer (
id int auto_increment primary key,
benutzername varchar(50),
passwort varchar(50)
);
insert into benutzer values (null, 'admin', 'admin');
insert into benutzer values (null, 'user', 'user');
Datei: login.html
- Einfaches Login-Formular für Benutzer
- Sendet die Daten per POST an login.php
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Login</title>
</head>
<body>
<h2>Login</h2>
<form method="post" action="login.php">
Benutzername: <input type="text" name="benutzername"><br>
Passwort: <input type="password" name="passwort"><br>
<input type="submit" value="Login">
</form>
</body>
</html>
Datei: login.php
- Prüft Benutzername und Passwort gegen die Datenbank
- Setzt eine Session bei erfolgreichem Login
<?php
include 'db.php';
session_start();
$benutzername = $_POST['benutzername'];
$passwort = $_POST['passwort'];
$sql = "SELECT * FROM benutzer WHERE benutzername='$benutzername' AND passwort='$passwort'";
$result = $conn->query($sql);
if ($result->num_rows == 1) {
$_SESSION['user'] = $benutzername;
header("Location: index.php");
} else {
echo "Login fehlgeschlagen";
}
?>
Anpassung: index.php
- Anzeige, ob ein Benutzer eingeloggt ist
<?php
session_start();
if (isset($_SESSION['user'])) {
echo "Eingeloggt als: " . $_SESSION['user'] . "<br>";
} else {
echo "<a href='login.html'>Login</a><br>";
}
?>
Schutz von Funktionen
- Eintragen und Löschen nur für eingeloggte Benutzer erlauben
Anpassung: add.php
<?php
include 'db.php';
session_start();
if (!isset($_SESSION['user'])) {
die("Nicht eingeloggt");
}
?>
Neue Datei: delete.php
- Löscht einen Server über die ID (unsicher!)
<?php
include 'db.php';
session_start();
if (!isset($_SESSION['user'])) {
die("Nicht eingeloggt");
}
$id = $_GET['id'];
$sql = "DELETE FROM server WHERE id = $id";
if ($conn->query($sql)) {
echo "Server gelöscht";
} else {
echo "Fehler";
}
?>
Anpassung: index.php (Löschfunktion)
- Erweiterung der Tabelle um eine Löschfunktion
echo "<td><a href='delete.php?id=".$row["id"]."'>löschen</a></td>";
Test
http://SERVER-IP/server/login.html
- Mit admin/admin anmelden
- Server eintragen
- Server löschen testen
Sicherheitsprobleme (bewusst eingebaut)
SQL Injection im Login
' OR 1=1 --
- Ergebnis:
- Login funktioniert ohne gültige Zugangsdaten
SQL Injection beim Löschen
http://SERVER-IP/server/delete.php?id=1 OR 1=1
- Ergebnis:
- Alle Datensätze werden gelöscht
Klartext-Passwörter
- Passwörter werden unverschlüsselt gespeichert
- Jeder mit Datenbankzugriff kann sie lesen
Ergebnis
- Teilnehmer erkennen:
- Login ≠ Sicherheit
- Unsichere SQL-Abfragen sind gefährlich
- Eingaben dürfen nicht ungeprüft verarbeitet werden