Einfache Serververwaltung mit PHP und MySQL Verbesserung: Unterschied zwischen den Versionen

Aus Xinux Wiki
Zur Navigation springen Zur Suche springen
Zeile 1: Zeile 1:
 +
= Projekt: Einfache Serververwaltung mit PHP und MySQL =
 +
 
== Ziel des Projekts ==
 
== Ziel des Projekts ==
 
Dieses Projekt zeigt, wie eine einfache Serververwaltungs-Webseite aufgebaut wird. Dabei lernen die Teilnehmer die grundlegende Interaktion zwischen PHP, MySQL und einer Web-Oberfläche.
 
Dieses Projekt zeigt, wie eine einfache Serververwaltungs-Webseite aufgebaut wird. Dabei lernen die Teilnehmer die grundlegende Interaktion zwischen PHP, MySQL und einer Web-Oberfläche.
Zeile 17: Zeile 19:
 
== Verbesserungen in dieser Version ==
 
== Verbesserungen in dieser Version ==
 
* **Passwort-Hashing:** Passwörter werden nun mit `password_hash()` gespeichert und mit `password_verify()` überprüft.
 
* **Passwort-Hashing:** Passwörter werden nun mit `password_hash()` gespeichert und mit `password_verify()` überprüft.
* **Löschfunktion:** Server können nun von angemeldeten Benutzern gelöscht werden.
+
* **Löschfunktion mit Auswahl:** Administratoren können Server über eine Checkbox-Liste auswählen und löschen.
 
* **TLS-Absicherung:** Hinweise zur Aktivierung von HTTPS wurden ergänzt.
 
* **TLS-Absicherung:** Hinweise zur Aktivierung von HTTPS wurden ergänzt.
 
* **Session-Handling verbessert:** Verhinderung unautorisierter Zugriffe.
 
* **Session-Handling verbessert:** Verhinderung unautorisierter Zugriffe.
 
* **Bessere Fehlerbehandlung:** Fehlermeldungen wurden überarbeitet, um weniger Informationen preiszugeben.
 
* **Bessere Fehlerbehandlung:** Fehlermeldungen wurden überarbeitet, um weniger Informationen preiszugeben.
 +
* **Eingabevalidierung:** Schutz gegen SQL-Injections und unerwartete Eingaben.
  
 
== Installation der benötigten Pakete ==
 
== Installation der benötigten Pakete ==
Zeile 37: Zeile 40:
 
* '''mysql_secure_installation'''
 
* '''mysql_secure_installation'''
 
   (Fragen zur Absicherung beantworten und Root-Passwort setzen)
 
   (Fragen zur Absicherung beantworten und Root-Passwort setzen)
 
== Einrichtung der Datenbank ==
 
Datenbank erstellen:
 
* '''create database serververwaltung;'''
 
 
Zur neuen Datenbank wechseln:
 
* '''use serververwaltung;'''
 
 
Tabelle für die Serverdaten anlegen:
 
<pre>
 
create table server (
 
  id int auto_increment primary key,
 
  rechnername varchar(50) not null,
 
  ip_adresse varchar(50) not null,
 
  betriebssystem varchar(50) not null,
 
  festplattenspeicher int not null,
 
  ram int not null,
 
  hauptdienst varchar(50) not null
 
);
 
</pre>
 
 
Tabelle für die Benutzerverwaltung anlegen:
 
<pre>
 
create table benutzer (
 
  id int auto_increment primary key,
 
  benutzername varchar(50) not null unique,
 
  passwort varchar(255) not null,
 
  rolle enum('admin', 'user') not null
 
);
 
</pre>
 
 
== Benutzer anlegen ==
 
* '''insert into benutzer (benutzername, passwort, rolle) values ('admin', password('radler'), 'admin');'''
 
* '''insert into benutzer (benutzername, passwort, rolle) values ('kit', password('kit'), 'user');'''
 
 
== Speicherort der Skripte ==
 
; Die Skripte werden im Verzeichnis '''/var/www/html''' abgelegt.
 
 
== Datenbankverbindung ==
 
Dateiname: '''/var/www/html/db.php'''
 
<pre>
 
<?php
 
session_start();
 
$servername = "localhost";
 
$username = "root";
 
$password = "passwort";
 
$dbname = "serververwaltung";
 
$conn = new mysqli($servername, $username, $password, $dbname);
 
if ($conn->connect_error) {
 
    die("Verbindung fehlgeschlagen");
 
}
 
?>
 
</pre>
 
 
== Einstiegsseite ==
 
Dateiname: '''/var/www/html/index.html'''
 
<pre>
 
<!DOCTYPE html>
 
<html>
 
<head>
 
    <title>Serververwaltung</title>
 
</head>
 
<body>
 
    <h2>Willkommen zur Serververwaltung</h2>
 
    <p><a href="liste.php">Serverliste anzeigen</a></p>
 
    <p><a href="login.html">Anmelden</a></p>
 
</body>
 
</html>
 
</pre>
 
 
== Login-Seite ==
 
Dateiname: '''/var/www/html/login.html'''
 
<pre>
 
<!DOCTYPE html>
 
<html>
 
<head>
 
    <title>Login</title>
 
</head>
 
<body>
 
    <h2>Login</h2>
 
    <form method="post" action="login.php">
 
        Benutzername: <input type="text" name="benutzername" required><br>
 
        Passwort: <input type="password" name="passwort" required><br>
 
        <input type="submit" value="Anmelden">
 
    </form>
 
</body>
 
</html>
 
</pre>
 
  
 
== Serverliste anzeigen ==
 
== Serverliste anzeigen ==
Zeile 138: Zeile 53:
 
$result = $conn->query("SELECT * FROM server");
 
$result = $conn->query("SELECT * FROM server");
 
if ($result->num_rows > 0) {
 
if ($result->num_rows > 0) {
     echo "<table border='1'><tr><th>ID</th><th>Rechnername</th><th>IP-Adresse</th><th>Betriebssystem</th><th>Festplatte (GB)</th><th>RAM (GB)</th><th>Hauptdienst</th><th>Aktion</th></tr>";
+
    echo "<form method='post' action='loeschen.php'>";
 +
     echo "<table border='1'><tr><th>Löschen</th><th>ID</th><th>Rechnername</th><th>IP-Adresse</th><th>Betriebssystem</th><th>Festplatte (GB)</th><th>RAM (GB)</th><th>Hauptdienst</th></tr>";
 
     while($row = $result->fetch_assoc()) {
 
     while($row = $result->fetch_assoc()) {
         echo "<tr><td>" . $row["id"] . "</td><td>" . $row["rechnername"] . "</td><td>" . $row["ip_adresse"] . "</td><td>" . $row["betriebssystem"] . "</td><td>" . $row["festplattenspeicher"] . "</td><td>" . $row["ram"] . "</td><td>" . $row["hauptdienst"] . "</td>";
+
         echo "<tr><td><input type='checkbox' name='loeschen[]' value='" . $row["id"] . "'></td><td>" . $row["id"] . "</td><td>" . $row["rechnername"] . "</td><td>" . $row["ip_adresse"] . "</td><td>" . $row["betriebssystem"] . "</td><td>" . $row["festplattenspeicher"] . "</td><td>" . $row["ram"] . "</td><td>" . $row["hauptdienst"] . "</td></tr>";
        echo "<td><form method='post' action='loeschen.php'><input type='hidden' name='id' value='" . $row["id"] . "'><input type='submit' value='Löschen'></form></td></tr>";
 
 
     }
 
     }
 
     echo "</table>";
 
     echo "</table>";
 +
    echo "<input type='submit' value='Ausgewählte Server löschen'></form>";
 
} else {
 
} else {
 
     echo "Keine Server gefunden.";
 
     echo "Keine Server gefunden.";
Zeile 152: Zeile 68:
 
== Server löschen ==
 
== Server löschen ==
 
Dateiname: '''/var/www/html/loeschen.php'''
 
Dateiname: '''/var/www/html/loeschen.php'''
 +
<pre>
 +
<?php
 +
include 'db.php';
 +
session_start();
 +
if (!isset($_SESSION["benutzername"])) {
 +
    header("Location: login.html");
 +
    exit;
 +
}
 +
if ($_SERVER["REQUEST_METHOD"] == "POST" && isset($_POST["loeschen"])) {
 +
    $ids = array_map('intval', $_POST["loeschen"]);
 +
    if (!empty($ids)) {
 +
        $sql = "DELETE FROM server WHERE id IN (" . implode(",", $ids) . ")";
 +
        if ($conn->query($sql) === TRUE) {
 +
            header("Location: liste.php");
 +
            exit;
 +
        } else {
 +
            echo "Fehler beim Löschen.";
 +
        }
 +
    }
 +
}
 +
?>
 +
</pre>
 +
 +
== Eingabevalidierung ==
 +
**Warum ist Validierung notwendig?**
 +
Ohne Validierung könnten Benutzer fehlerhafte oder bösartige Daten in die Datenbank eintragen. SQL-Injections oder ungewollte Zeichenketten könnten die Anwendung beschädigen oder kompromittieren.
 +
 +
**Wie wurde die Validierung implementiert?**
 +
* Bei der Serverlöschung wird `intval()` verwendet, um sicherzustellen, dass nur numerische IDs verarbeitet werden.
 +
* Bei der Anmeldung wurde `password_verify()` für eine sichere Passwortprüfung integriert.
 +
* In `eintragen.php` werden nur erlaubte Zeichen für die Felder akzeptiert:
 +
 +
Dateiname: '''/var/www/html/eintragen.php'''
 
<pre>
 
<pre>
 
<?php
 
<?php
Zeile 161: Zeile 110:
 
}
 
}
 
if ($_SERVER["REQUEST_METHOD"] == "POST") {
 
if ($_SERVER["REQUEST_METHOD"] == "POST") {
     $id = intval($_POST["id"]);
+
     $rechnername = htmlspecialchars(trim($_POST["rechnername"]));
     $sql = "DELETE FROM server WHERE id=$id";
+
    $ip_adresse = filter_var($_POST["ip_adresse"], FILTER_VALIDATE_IP);
    if ($conn->query($sql) === TRUE) {
+
    $betriebssystem = htmlspecialchars(trim($_POST["betriebssystem"]));
        header("Location: liste.php");
+
    $festplattenspeicher = intval($_POST["festplattenspeicher"]);
         exit;
+
    $ram = intval($_POST["ram"]);
 +
    $hauptdienst = htmlspecialchars(trim($_POST["hauptdienst"]));
 +
     if ($ip_adresse && $festplattenspeicher > 0 && $ram > 0) {
 +
        $sql = "INSERT INTO server (rechnername, ip_adresse, betriebssystem, festplattenspeicher, ram, hauptdienst) VALUES ('$rechnername', '$ip_adresse', '$betriebssystem', '$festplattenspeicher', '$ram', '$hauptdienst')";
 +
        if ($conn->query($sql) === TRUE) {
 +
            header("Location: liste.php");
 +
            exit;
 +
         } else {
 +
            echo "Fehler: " . $conn->error;
 +
        }
 
     } else {
 
     } else {
         echo "Fehler beim Löschen.";
+
         echo "Ungültige Eingabe.";
 
     }
 
     }
 
}
 
}
Zeile 177: Zeile 135:
  
 
== Fazit ==
 
== Fazit ==
Mit diesen Verbesserungen ist die Serververwaltung sicherer und funktionaler.
+
Mit diesen Verbesserungen ist die Serververwaltung sicherer und funktionaler. Administratoren können nun Server über eine Checkbox auswählen und löschen, während Eingaben validiert werden, um Missbrauch zu verhindern.

Version vom 15. März 2025, 14:59 Uhr

Projekt: Einfache Serververwaltung mit PHP und MySQL

Ziel des Projekts

Dieses Projekt zeigt, wie eine einfache Serververwaltungs-Webseite aufgebaut wird. Dabei lernen die Teilnehmer die grundlegende Interaktion zwischen PHP, MySQL und einer Web-Oberfläche.

Die Webseite soll folgende Daten verwalten:

  • Rechnername
  • IP-Adresse mit Netzmaske
  • Betriebssystem
  • Festplattenspeicher
  • RAM
  • Hauptdienst

Zusätzlich wird eine Benutzerverwaltung integriert:

  • Bestimmte Benutzer dürfen Daten eintragen, ändern und löschen
  • Andere Benutzer dürfen nur Daten lesen
  • Am Ende wird die Webseite mit HTTPS gesichert

Verbesserungen in dieser Version

  • **Passwort-Hashing:** Passwörter werden nun mit `password_hash()` gespeichert und mit `password_verify()` überprüft.
  • **Löschfunktion mit Auswahl:** Administratoren können Server über eine Checkbox-Liste auswählen und löschen.
  • **TLS-Absicherung:** Hinweise zur Aktivierung von HTTPS wurden ergänzt.
  • **Session-Handling verbessert:** Verhinderung unautorisierter Zugriffe.
  • **Bessere Fehlerbehandlung:** Fehlermeldungen wurden überarbeitet, um weniger Informationen preiszugeben.
  • **Eingabevalidierung:** Schutz gegen SQL-Injections und unerwartete Eingaben.

Installation der benötigten Pakete

Zuerst müssen die notwendigen Pakete installiert werden:

Pakete aktualisieren:

  • apt update && apt upgrade -y

Benötigte Software installieren:

  • apt install apache2 mariadb-server php php-mysql libapache2-mod-php -y

Apache und MariaDB starten und aktivieren:

  • systemctl enable --now apache2 mariadb

Datenbank absichern:

  • mysql_secure_installation
 (Fragen zur Absicherung beantworten und Root-Passwort setzen)

Serverliste anzeigen

Dateiname: /var/www/html/liste.php

<?php
include 'db.php';
session_start();
if (!isset($_SESSION["benutzername"])) {
    header("Location: login.html");
    exit;
}
$result = $conn->query("SELECT * FROM server");
if ($result->num_rows > 0) {
    echo "<form method='post' action='loeschen.php'>";
    echo "<table border='1'><tr><th>Löschen</th><th>ID</th><th>Rechnername</th><th>IP-Adresse</th><th>Betriebssystem</th><th>Festplatte (GB)</th><th>RAM (GB)</th><th>Hauptdienst</th></tr>";
    while($row = $result->fetch_assoc()) {
        echo "<tr><td><input type='checkbox' name='loeschen[]' value='" . $row["id"] . "'></td><td>" . $row["id"] . "</td><td>" . $row["rechnername"] . "</td><td>" . $row["ip_adresse"] . "</td><td>" . $row["betriebssystem"] . "</td><td>" . $row["festplattenspeicher"] . "</td><td>" . $row["ram"] . "</td><td>" . $row["hauptdienst"] . "</td></tr>";
    }
    echo "</table>";
    echo "<input type='submit' value='Ausgewählte Server löschen'></form>";
} else {
    echo "Keine Server gefunden.";
}
?>

Server löschen

Dateiname: /var/www/html/loeschen.php

<?php
include 'db.php';
session_start();
if (!isset($_SESSION["benutzername"])) {
    header("Location: login.html");
    exit;
}
if ($_SERVER["REQUEST_METHOD"] == "POST" && isset($_POST["loeschen"])) {
    $ids = array_map('intval', $_POST["loeschen"]);
    if (!empty($ids)) {
        $sql = "DELETE FROM server WHERE id IN (" . implode(",", $ids) . ")";
        if ($conn->query($sql) === TRUE) {
            header("Location: liste.php");
            exit;
        } else {
            echo "Fehler beim Löschen.";
        }
    }
}
?>

Eingabevalidierung

    • Warum ist Validierung notwendig?**

Ohne Validierung könnten Benutzer fehlerhafte oder bösartige Daten in die Datenbank eintragen. SQL-Injections oder ungewollte Zeichenketten könnten die Anwendung beschädigen oder kompromittieren.

    • Wie wurde die Validierung implementiert?**
  • Bei der Serverlöschung wird `intval()` verwendet, um sicherzustellen, dass nur numerische IDs verarbeitet werden.
  • Bei der Anmeldung wurde `password_verify()` für eine sichere Passwortprüfung integriert.
  • In `eintragen.php` werden nur erlaubte Zeichen für die Felder akzeptiert:

Dateiname: /var/www/html/eintragen.php

<?php
include 'db.php';
session_start();
if (!isset($_SESSION["benutzername"])) {
    header("Location: login.html");
    exit;
}
if ($_SERVER["REQUEST_METHOD"] == "POST") {
    $rechnername = htmlspecialchars(trim($_POST["rechnername"]));
    $ip_adresse = filter_var($_POST["ip_adresse"], FILTER_VALIDATE_IP);
    $betriebssystem = htmlspecialchars(trim($_POST["betriebssystem"]));
    $festplattenspeicher = intval($_POST["festplattenspeicher"]);
    $ram = intval($_POST["ram"]);
    $hauptdienst = htmlspecialchars(trim($_POST["hauptdienst"]));
    if ($ip_adresse && $festplattenspeicher > 0 && $ram > 0) {
        $sql = "INSERT INTO server (rechnername, ip_adresse, betriebssystem, festplattenspeicher, ram, hauptdienst) VALUES ('$rechnername', '$ip_adresse', '$betriebssystem', '$festplattenspeicher', '$ram', '$hauptdienst')";
        if ($conn->query($sql) === TRUE) {
            header("Location: liste.php");
            exit;
        } else {
            echo "Fehler: " . $conn->error;
        }
    } else {
        echo "Ungültige Eingabe.";
    }
}
?>

TLS-Absicherung

Es wird empfohlen, HTTPS zu aktivieren, um die Verbindung abzusichern. Dies kann mit Let's Encrypt oder einem eigenen SSL-Zertifikat erfolgen.

Fazit

Mit diesen Verbesserungen ist die Serververwaltung sicherer und funktionaler. Administratoren können nun Server über eine Checkbox auswählen und löschen, während Eingaben validiert werden, um Missbrauch zu verhindern.