Einfache Serververwaltung mit PHP und MySQL Verbesserung

Aus Xinux Wiki
Zur Navigation springen Zur Suche springen

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.