Level 2 – Einfache Serververwaltung (Minimal): Unterschied zwischen den Versionen

Aus Xinux Wiki
Zur Navigation springen Zur Suche springen
Zeile 66: Zeile 66:
 
* Prüft Benutzername und Passwort gegen die Datenbank
 
* Prüft Benutzername und Passwort gegen die Datenbank
 
* Setzt eine Session bei erfolgreichem Login
 
* Setzt eine Session bei erfolgreichem Login
  <?php
+
  <nowiki><?php</nowiki>
  include 'db.php';
+
  <nowiki>include 'db.php';</nowiki>
  $result = $conn->query("SELECT * FROM server");
+
  <nowiki>$result = $conn->query("SELECT * FROM server");</nowiki>
  ?>
+
  <nowiki>?></nowiki>
 
   
 
   
  <!DOCTYPE html>
+
  <nowiki><!DOCTYPE html></nowiki>
  <html>
+
  <nowiki><html></nowiki>
  <head>
+
  <nowiki><head></nowiki>
  <meta charset="UTF-8">
+
  <nowiki><meta charset="UTF-8"></nowiki>
  <title>Serververwaltung</title>
+
  <nowiki><title>Serververwaltung</title></nowiki>
  </head>
+
  <nowiki></head></nowiki>
  <body>
+
  <nowiki><body></nowiki>
 
   
 
   
 
  <nowiki><h2>Neuen Server eintragen</h2></nowiki>
 
  <nowiki><h2>Neuen Server eintragen</h2></nowiki>
  <form method="post" action="add.php">
+
  <nowiki><form method="post" action="add.php"></nowiki>
    <nowiki>Rechnername: <input type="text" name="rechnername" required><br></nowiki>
+
<nowiki>   Rechnername: <input type="text" name="rechnername" required><br></nowiki>
    <nowiki>IP-Adresse: <input type="text" name="ip_adresse" required><br></nowiki>
+
<nowiki>   IP-Adresse: <input type="text" name="ip_adresse" required><br></nowiki>
    <nowiki>Betriebssystem: <input type="text" name="betriebssystem" required><br></nowiki>
+
<nowiki>   Betriebssystem: <input type="text" name="betriebssystem" required><br></nowiki>
    <nowiki>Festplatte (GB): <input type="number" name="festplattenspeicher" required><br></nowiki>
+
<nowiki>   Festplatte (GB): <input type="number" name="festplattenspeicher" required><br></nowiki>
    <nowiki>RAM (GB): <input type="number" name="ram" required><br></nowiki>
+
<nowiki>   RAM (GB): <input type="number" name="ram" required><br></nowiki>
    <nowiki>Hauptdienst: <input type="text" name="hauptdienst" required><br></nowiki>
+
<nowiki>   Hauptdienst: <input type="text" name="hauptdienst" required><br></nowiki>
    <input type="submit" value="Speichern">
+
<nowiki>    <input type="submit" value="Speichern"></nowiki>
  </form>
+
  <nowiki></form></nowiki>
 
   
 
   
 
  <nowiki><h2>Serverliste</h2></nowiki>
 
  <nowiki><h2>Serverliste</h2></nowiki>
 
   
 
   
  <?php
+
  <nowiki><?php</nowiki>
  if ($result->num_rows > 0) {
+
  <nowiki>if ($result->num_rows > 0) {</nowiki>
    echo "<table border='1'>";
+
<nowiki>    echo "<table border='1'>";</nowiki>
    echo "<tr><th>ID</th><th>Name</th><th>IP</th><th>OS</th><th>Disk</th><th>RAM</th><th>Dienst</th></tr>";
+
<nowiki>    echo "<tr><th>ID</th><th>Name</th><th>IP</th><th>OS</th><th>Disk</th><th>RAM</th><th>Dienst</th></tr>";</nowiki>
 
   
 
   
    while ($row = $result->fetch_assoc()) {
+
<nowiki>    while ($row = $result->fetch_assoc()) {</nowiki>
        echo "<tr>";
+
<nowiki>        echo "<tr>";</nowiki>
        <nowiki>echo "<td>".$row["id"]."</td>";</nowiki>
+
<nowiki>       echo "<td>".$row["id"]."</td>";</nowiki>
        <nowiki>echo "<td>".$row["rechnername"]."</td>";</nowiki>
+
<nowiki>       echo "<td>".$row["rechnername"]."</td>";</nowiki>
        <nowiki>echo "<td>".$row["ip_adresse"]."</td>";</nowiki>
+
<nowiki>       echo "<td>".$row["ip_adresse"]."</td>";</nowiki>
        <nowiki>echo "<td>".$row["betriebssystem"]."</td>";</nowiki>
+
<nowiki>       echo "<td>".$row["betriebssystem"]."</td>";</nowiki>
        <nowiki>echo "<td>".$row["festplattenspeicher"]."</td>";</nowiki>
+
<nowiki>       echo "<td>".$row["festplattenspeicher"]."</td>";</nowiki>
        <nowiki>echo "<td>".$row["ram"]."</td>";</nowiki>
+
<nowiki>       echo "<td>".$row["ram"]."</td>";</nowiki>
        <nowiki>echo "<td>".$row["hauptdienst"]."</td>";</nowiki>
+
<nowiki>       echo "<td>".$row["hauptdienst"]."</td>";</nowiki>
        echo "</tr>";
+
<nowiki>        echo "</tr>";</nowiki>
    }
+
<nowiki>    }</nowiki>
 
   
 
   
    echo "</table>";
+
<nowiki>    echo "</table>";</nowiki>
  } else {
+
  <nowiki>} else {</nowiki>
    echo "Keine Server vorhanden.";
+
<nowiki>    echo "Keine Server vorhanden.";</nowiki>
  }
+
  <nowiki>}</nowiki>
  ?>
+
  <nowiki>?></nowiki>
 
   
 
   
  </body>
+
  <nowiki></body></nowiki>
  </html>
+
  <nowiki></html></nowiki>
  
 
== Anpassung: index.php ==
 
== Anpassung: index.php ==

Version vom 24. März 2026, 19:24 Uhr

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

  • Anmeldung an MariaDB
   mysql -u root
  • Datenbank auswählen
   use serververwaltung;
  • Tabelle für Benutzer anlegen
create table benutzer (
  id int auto_increment primary key,
  benutzername varchar(50),
  passwort varchar(50)
);
  • Beispielbenutzer anlegen
   insert into benutzer values (null, 'admin', 'admin');
   insert into benutzer values (null, 'user', 'user');

PHP Sessions

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';
$result = $conn->query("SELECT * FROM server");
?>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Serververwaltung</title>
</head>
<body>

<h2>Neuen Server eintragen</h2>
<form method="post" action="add.php">
    Rechnername: <input type="text" name="rechnername" required><br>
    IP-Adresse: <input type="text" name="ip_adresse" required><br>
    Betriebssystem: <input type="text" name="betriebssystem" required><br>
    Festplatte (GB): <input type="number" name="festplattenspeicher" required><br>
    RAM (GB): <input type="number" name="ram" required><br>
    Hauptdienst: <input type="text" name="hauptdienst" required><br>
    <input type="submit" value="Speichern">
</form>

<h2>Serverliste</h2>

<?php
if ($result->num_rows > 0) {
    echo "<table border='1'>";
    echo "<tr><th>ID</th><th>Name</th><th>IP</th><th>OS</th><th>Disk</th><th>RAM</th><th>Dienst</th></tr>";

    while ($row = $result->fetch_assoc()) {
        echo "<tr>";
        echo "<td>".$row["id"]."</td>";
        echo "<td>".$row["rechnername"]."</td>";
        echo "<td>".$row["ip_adresse"]."</td>";
        echo "<td>".$row["betriebssystem"]."</td>";
        echo "<td>".$row["festplattenspeicher"]."</td>";
        echo "<td>".$row["ram"]."</td>";
        echo "<td>".$row["hauptdienst"]."</td>";
        echo "</tr>";
    }

    echo "</table>";
} else {
    echo "Keine Server vorhanden.";
}
?>

</body>
</html>

Anpassung: index.php

  • Anzeige, ob ein Benutzer eingeloggt ist

Datei: index.php (Level 1 + minimale Ergänzung)

Datei: index.php (Level 1 + sichtbare Ergänzung)

<?php
session_start();
include 'db.php';
$result = $conn->query("SELECT * FROM server");
?>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Serververwaltung</title>
</head>
<body>

<!-- NEU: LOGIN-STATUS (farblich hervorgehoben) -->
<div style="background-color: yellow; padding: 5px;">
<?php
if (isset($_SESSION['user'])) {
    echo "Eingeloggt als: " . $_SESSION['user'] . "<br>";
} else {
    echo "<a href='login.html'>Login</a><br>";
}
?>
</div>

<h2>Neuen Server eintragen</h2>
<form method="post" action="add.php">
    Rechnername: <input type="text" name="rechnername" required><br>
    IP-Adresse: <input type="text" name="ip_adresse" required><br>
    Betriebssystem: <input type="text" name="betriebssystem" required><br>
    Festplatte (GB): <input type="number" name="festplattenspeicher" required><br>
    RAM (GB): <input type="number" name="ram" required><br>
    Hauptdienst: <input type="text" name="hauptdienst" required><br>
    <input type="submit" value="Speichern">
</form>

<h2>Serverliste</h2>

<?php
if ($result->num_rows > 0) {
    echo "<table border='1'>";
    echo "<tr><th>ID</th><th>Name</th><th>IP</th><th>OS</th><th>Disk</th><th>RAM</th><th>Dienst</th></tr>";

    while ($row = $result->fetch_assoc()) {
        echo "<tr>";
        echo "<td>".$row["id"]."</td>";
        echo "<td>".$row["rechnername"]."</td>";
        echo "<td>".$row["ip_adresse"]."</td>";
        echo "<td>".$row["betriebssystem"]."</td>";
        echo "<td>".$row["festplattenspeicher"]."</td>";
        echo "<td>".$row["ram"]."</td>";
        echo "<td>".$row["hauptdienst"]."</td>";
        echo "</tr>";
    }

    echo "</table>";
} else {
    echo "Keine Server vorhanden.";
}
?>

</body>
</html>

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

  • Login aufrufen
   http://SERVER-IP/server/login.html
  • Mit admin/admin anmelden
  • Server eintragen
  • Server löschen testen

Sicherheitsprobleme (bewusst eingebaut)

SQL Injection im Login

  • Eingabe im Login-Feld:
   ' OR 1=1 --
  • Ergebnis:
    • Login funktioniert ohne gültige Zugangsdaten

SQL Injection beim Löschen

  • URL manipulieren:
   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