Willkommen beim WP Wegerl.at 'Lesemodus'!
Entspanntes Lesen und spannende Artikel warten auf dich.
Entdecke unsere besten Beiträge und genieße den Lesemodus.
Passwort, Verzeichnisschutz, Multisite
smilies.4-user.de

Frontend Verzeichnisschutz für WordPress Multisites

Illustration OpenClipart-Vectors
Info echo1 OpenClipart-Vectors-katze-1
Ist der Classic-Editor zu kennen? –
Versäume bitte nicht den Advanced Editor! Blick in die Zukunft: Advanced Editor Tools
Info echo2 OpenClipart-Vectors-katze-2
Classic-Editor – Classic Widgets
"Innovativ und ausgezeichnet!" Hauch von Nostalgie: Classic Widgets
Info echo3 OpenClipart-Vectors-katze-3
Klassischen Editor! – und …
"Advanced Editor Tools" Dauerhaft dynamisch: Advanced Editor Tools
Info echo4 OpenClipart-Vectors-katze-7
… die Welt gehört dem, der sie genießt.
– mit Classic Editor und Advanced Tools! Advanced Editor Tools und Classic Widgets
Info echo5 OpenClipart-Vectors-katze-4
Aktive Installationen: 2+ Millionen
"Advanced Editor Tools – ist fabelhaft!" Unverändert exzellent: Advanced Editor Tools
Info echo6 OpenClipart-Vectors-katze-5
Antörnend! – hier zur Lancierung
"Advanced Editor Tools – ist de luxe!" Classic Editor und Advanced Editor Tools
Info echo7 OpenClipart-Vectors-katze-6
Classic Widgets sind innovativ!
"Classic Widgets – sind modern!" Advanced Editor ToolsClassic Widgets
Info echo8 OpenClipart-Vectors-katze-8a
"Werkraum ist Werkraum"
Katzen SVG OpenClipart-Vectors; Ticker von Ditty News Ticker
"Frontend ist Frontend!" Classic Editor und Advanced Editor Tools

Normalerweise kann ein Passwortschutz für eine Website ganz einfach mit Regeln in der .htaccess und einer .htpasswd erstellt werden. Bei WordPress Multisites ist das jedoch anders, da der Verzeichnisschutz so nicht angewendet werden kann, ohne dass er auch für andere Domains dieser Installation wirksam wird. Hierbei beziehen wir uns auf die Absicherung eines gesamten Verzeichnisses einer Domain für das Frontend, im Gegensatz zur Möglichkeit, einzelnen Beiträgen oder Seiten einen Passwortschutz zuzuweisen.

Wenn ein Verzeichnisschutz nur für eine bestimmte Domain innerhalb einer WordPress-Multisite-Installation sein sollte, so kann dies nicht direkt über die .htaccess-Datei und die .htpasswd-Datei erreichen. Da die .htaccess-Datei auf Serverebene wirkt, kann sie keine spezifische Domain innerhalb einer Multisite-Umgebung isolieren.

In einer WordPress-Multisite-Umgebung teilen sich alle Websites dieselbe .htaccess-Datei und denselben Dateispeicherort. Daher würden Änderungen an der .htaccess-Datei sich auf alle Websites in der Multisite-Umgebung auswirken.

Der Verzeichnisschutz für eine WordPress-Multisite mittels .htaccess und .htpasswd, der den Zugang zum Backend ermöglicht, ist problemlos umsetzbar. Ebenso kann dieser Ansatz für das Frontend einer herkömmlichen WordPress-Installation verwendet werden. Ich verweise hier auf einen Beitrag mit dem Titel Verzeichnisschutz mit bplacedlive access, der weitere Informationen dazu bietet.

Wie auch immer man es dreht und wendet, einer WP-Multisite kann für eine bestimme Domain nur ein scheinbarer Verzeichnisschutz visuell werden. Denn der Schutz direkt im Theme würde der Anmeldeseite durch einfaches Abbrechen und Neuladen die Seite visuell machen, wenn auch nicht mit dem Theme selbst, sichtbar. Daher haben wir die Herausforderung angenommen und einen eigenen Verzeichnisschutz entwickelt, der handfest ist.

Verzeichnisschutz in WordPress Multisites: Unsere Lösung

  • Passwortschutz für gesamte Website einer Domain des Frontends.

Der Passwortschutz für die gesamte Website einer Domain bezieht sich auf den Zugriff auf alle Inhalte und Seiten einer Website nur autorisierten Benutzern gestattet. Das 'Frontend' bezeichnet den Teil einer Website, der für die Benutzer sichtbar ist und mit dem sie interagieren, im Gegensatz zum 'Backend' beziehungsweise 'Admin', das die administrative und technische Seite der Website umfasst.

Mit ein paar Regeln in der .htaccess und drei weiteren Dateien wie folgt, sowie einer Namensgebung von:

  1. passw_abfrage.php: Das ist die Datei, welche im Aufruf der Website zum Passwortschutz und folgender Eingabe des Passwortes ist.
  2. passw_functions.php: Diese Datei wird beim Aufruf der Website für den Passwortschutz und die Eingabe des Passworts verwendet. Zudem ist sie mit einer Reihe weiterer Features zur Sicherheit und Konformität ausgestattet.
  3. passw_config.php: In dieser Datei werden Konfigurationen für das Hashing gespeichert.

Diese Dateien sollten im Root-Verzeichnis der WordPress-Installation erstellt und mit folgendem Inhalt versehen werden. Beginnen wir mit den Regeln in der .htaccess-Datei.

Passwortschutz: die Regeln für die .htaccess

.htaccess

# Passwortschutz für gesamte Domain

RewriteEngine On
RewriteBase /

# Überprüfen, ob die Anfrage von der Beispielseite stammt und per GET-Methode erfolgt
RewriteCond %{HTTP_HOST} ^beispielseite\.de$
RewriteCond %{REQUEST_METHOD} GET

# Überprüfen, ob der Benutzer nicht in WordPress angemeldet ist
RewriteCond %{HTTP_COOKIE} !^.*wordpress_logged_in.*$ [NC]

# Überprüfen, ob die Anfrage nicht die passwort-abfrage.php-Datei ist
RewriteCond %{REQUEST_URI} !^/passw_abfrage\.php$

# Überprüfen, ob der Benutzer nicht bereits das passwort_richtig-Cookie hat
RewriteCond %{HTTP_COOKIE} !^.*passwort_richtig.*$ [NC]

# Umleitung auf die Passwortabfrage-Seite mit der ursprünglichen URL als Parameter
RewriteRule ^(.*)$ http://beispielseite.de/passw_abfrage.php?url=$1 [QSA,L]

# Ende Passwortschutz für gesamte Domain

Datei zur Passwortabfrage

Die Datei passw_abfrage.php ist für die Passwortabfrage auf der Website verantwortlich. Die detaillierte Funktionsweise und Sicherheitsvorkehrungen dieses Codes:

  • Session-Initialisierung:
    • Die Sitzung wird zu Beginn des Skripts initialisiert, um Session-bezogene Daten zu verwalten.
  • CSRF-Schutz (Cross-Site Request Forgery):
    • Ein CSRF-Token wird generiert und in der Sitzung gespeichert.
    • Beim Absenden des Formulars wird das gesendete CSRF-Token mit dem in der Sitzung gespeicherten verglichen, um CSRF-Angriffe zu verhindern.
  • Cookie-Handling:
    • Ein Cookie namens "passwort_richtig" wird gesetzt, um den erfolgreichen Login zu speichern.
    • Das Cookie wird mit verschiedenen Sicherheitsoptionen gesetzt, einschließlich des Secure-Flags, HTTPOnly und SameSite-Attributs.
    • Es ist wichtig anzumerken, dass die Verwendung des Secure-Flags für Cookies bedeutet, dass diese nur über eine verschlüsselte HTTPS-Verbindung übertragen werden, was die Sicherheit des Cookies erhöht.
  • Zielseiten-Weiterleitung:
    • Nach erfolgreichem Login wird der Benutzer an die vorgegebene Ziel-URL weitergeleitet.
    • Es wird überprüft, ob die Ziel-URL aus dem Formularfeld gültig ist und zur gleichen Domain gehört.
  • Fehlerbehandlung:
    • Bei ungültigem CSRF-Token wird das Skript beendet und eine Fehlermeldung ausgegeben.
    • Bei einem falschen Passwort wird eine entsprechende Fehlermeldung angezeigt.

Diese Sicherheitsvorkehrungen helfen dabei, die Integrität der Anwendung zu gewährleisten und verschiedene potenzielle Sicherheitsrisiken zu minimieren. Es ist jedoch wichtig zu beachten, dass einige dieser Maßnahmen, insbesondere das Secure-Flag für Cookies, nur unter der Voraussetzung einer sicheren HTTPS-Verbindung wirksam sind.

passw_abfrage.php

<?php
// Session initialisieren
session_start();

// CSRF-Token generieren und in der Session speichern
if (!isset($_SESSION['csrf_token'])) {
    $_SESSION['csrf_token'] = bin2hex(random_bytes(32));
}

// Include password functions file
include 'passw_functions.php';

// Include configuration file
include 'passw_config.php';

// Standardziel-URL nach dem Einloggen
$standard_ziel_url = 'https://' . $_SERVER['HTTP_HOST'] . '/'; // Startseite als Standardziel-URL

// Ziel-URL für den Fall, dass keine Weiterleitung erfolgt
$ziel_url = $standard_ziel_url;

// Fehlermeldung initialisieren
$fehlermeldung = '';

// Überprüfen, ob das Formular gesendet wurde
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    // Überprüfen CSRF-Token
    if (!hash_equals($_SESSION['csrf_token'], $_POST['csrf_token'])) {
        die("Ungültiger CSRF-Token");
    }

    // Erwartetes Passwort (gehasht)
    $erwartetes_passwort_hash = '$2y$10$mrtjyDdohbyN7tTkeCBkFeIdklmPViymxKHX1Odl0jgkbvwNSAHbC'; // Beispiel-Hash

    // Überprüfen, ob das eingegebene Passwort korrekt ist
    if (password_verify($_POST['passwort'], $erwartetes_passwort_hash)) {
        // Setze das passwort_richtig Cookie mit Secure-Flag
        $cookie_options = array(
            'expires' => time() + (86400 * 30),
            'path' => '/',
            'domain' => $_SERVER['HTTP_HOST'],
            'secure' => isset($_SERVER['HTTPS']),
            'httponly' => true,
            'samesite' => 'Strict'
        );

        // Das Cookie setzen
        if (setcookie('passwort_richtig', 'true', $cookie_options)) {
            // Verwende die Ziel-URL aus dem Formularfeld
            $ziel_url = $standard_ziel_url; // Standardziel-URL verwenden
            // Überprüfe, ob die Ziel-URL aus dem Formularfeld kommt und gültig ist
            if (isset($_POST['ziel_url']) && filter_var($_POST['ziel_url'], FILTER_VALIDATE_URL) && parse_url($_POST['ziel_url'], PHP_URL_HOST) === $_SERVER['HTTP_HOST']) {
                $ziel_url = $_POST['ziel_url']; // Verwende die Ziel-URL aus dem Formularfeld
            }

            // Weiterleitung zur Ziel-URL nach dem erfolgreichen Einloggen
            header('Location: ' . $ziel_url);
            exit;
        } else {
            // Fehler beim Setzen des Cookies
            die('Fehler beim Setzen des Cookies.');
        }
    } else {
        // Falsches Passwort, Fehlermeldung setzen
        $fehlermeldung = 'Falsches Passwort. Bitte versuche es erneut.';
        // Ziel-URL auf die Startseite setzen
        $ziel_url = $standard_ziel_url;
    }
}
?>

<!DOCTYPE html>
<html lang="de">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Passwortabfrage</title>
</head>
<body>
    <h1>Passwort eingeben</h1>
    <?php if ($fehlermeldung): ?>
        <p><?php echo htmlspecialchars($fehlermeldung); ?></p>
    <?php endif; ?>
    <form method="post" action="">
        <input type="hidden" name="ziel_url" value="<?php echo htmlspecialchars($ziel_url); ?>">
        <input type="hidden" name="csrf_token" value="<?php echo htmlspecialchars($_SESSION['csrf_token']); ?>">
        <label for="passwort">Passwort:</label>
        <input type="password" id="passwort" name="passwort" required>
        <button type="submit">Einloggen</button>
    </form>
</body>
</html>

Drehpunkt: das Passwort

Das Herzstück ist das Passwort, welches mittels Onlinetools zu einem Hash generiert werden kann. Hier sind einige Möglichkeiten zur Hash-Erzeugung mittels der Methoden bcrypt und Argon2 sowie mittels SHA-256.

Alle drei – bcrypt, Argon2 und SHA-256 – sind kryptografische Hashfunktionen, jedoch mit unterschiedlichen Anwendungen und Eigenschaften. Die Auswahl hängt von den spezifischen Anforderungen und Sicherheitszielen einer Anwendung ab.

  1. bcrypt: Bcrypt ist eine sogenannte "Adaptive Hashfunktion", die speziell für die sichere Speicherung von Passwörtern entwickelt wurde. Sie zeichnet sich durch eine langsame Hash-Berechnungsgeschwindigkeit aus, was bedeutet, dass das Berechnen eines bcrypt-Hashes relativ viel Zeit in Anspruch nimmt. Dies trägt dazu bei, brute-force Angriffe zu erschweren, da ein Angreifer mehr Zeit benötigt, um jeden möglichen Hash-Wert auszuprobieren. Bcrypt ist eine beliebte Wahl für die sichere Passwort-Speicherung und wird von vielen Web-Frameworks und -Plattformen unterstützt.
  2. Argon2: Argon2 ist ein relativ neuer Hash-Algorithmus, der speziell für die sichere Passwort-Speicherung entwickelt wurde. Er wurde im Rahmen des Password Hashing Competition (PHC) entwickelt und als Gewinner ausgewählt. Argon2 ist darauf ausgelegt, effektiv gegen verschiedene Angriffsmethoden zu sein, einschließlich brute-force Angriffen und spezialisierten Hardware-Angriffen wie GPU-basierten Angriffen. Er bietet auch Funktionen wie parallele Verarbeitung und Speicheroptimierung. Argon2 wird zunehmend als bevorzugte Option für die Passwort-Speicherung in modernen Anwendungen angesehen.
  3. SHA-256: SHA-256 ist eine kryptografische Hashfunktion, die Teil der Secure Hash Algorithm (SHA)-Familie ist. Im Gegensatz zu bcrypt und Argon2 wurde SHA-256 nicht speziell für die Passwort-Speicherung entwickelt. Obwohl SHA-256 weit verbreitet ist und für verschiedene Zwecke wie Integritätsprüfung und digitale Signaturen verwendet wird, ist es nicht die beste Wahl für die sichere Passwort-Speicherung. Dies liegt daran, dass SHA-256 schneller ist als bcrypt und Argon2 und daher anfälliger für brute-force Angriffe sein kann, insbesondere wenn keine geeigneten Sicherheitsvorkehrungen wie Salzen und Iterationen getroffen werden.

Für die Passwort-Speicherung ist es in der Regel am besten, spezielle Passwort-Hash-Algorithmen wie bcrypt oder Argon2 zu verwenden, da diese gezielt darauf ausgelegt sind, Passwörter sicher zu speichern und Angriffe zu erschweren.

Falls du dich noch nie mit Hash-Funktionen befasst hast, ist die beste Wahl "bcrypt". Diese Methode ist bewährt und gut für die Speicherung von Passwörtern geeignet, da sie langsam ist und Salz verwendet, um Rainbow-Table-Angriffe zu erschweren. Hierfür kann ein Bcrypt-Generator verwendet werden.

Passwort functions.php

Im Folgenden sind die beiden Funktionen zur Passwortsicherheit beschrieben, die Aspekte unseres Ansatzes darstellen.

  • hash_password($password): Diese Funktion akzeptiert ein Passwort als Eingabe und verwendet die Funktion password_hash() von PHP, um das Passwort zu hashen. Das gehashte Passwort wird zurückgegeben. Die Funktion verwendet den Standard-Algorithmus, der von PASSWORD_DEFAULT definiert wird, was derzeit bcrypt ist. Dieser Algorithmus kann sich im Laufe der Zeit ändern, um den aktuellen Sicherheitsstandards zu entsprechen.
  • verify_password($password, $hashed_password): Diese Funktion akzeptiert ein Passwort und ein bereits gehashtes Passwort als Eingabe. Sie verwendet die Funktion password_verify() von PHP, um zu überprüfen, ob das gegebene Passwort mit dem gespeicherten gehashten Passwort übereinstimmt. Wenn das Passwort gültig ist, gibt die Funktion true zurück, andernfalls gibt sie false zurück.

passw_functions.php

<?php
function hash_password($password) {
    return password_hash($password, PASSWORD_DEFAULT);
}

function verify_password($password, $hashed_password) {
    return password_verify($password, $hashed_password);
}
?>

Diese beiden Funktionen sind grundlegende Hilfsfunktionen für die Verwaltung von Passwörtern in dieser Anwendung. Sie ermöglichen das sichere Hashen von Passwörtern und die Überprüfung von Passworteingaben gegen gespeicherte gehashte Passwörter.

Passwort config.php

Diese Konfigurationsdatei ermöglicht es, wichtige Parameter und Werte zentral an einer Stelle zu speichern, was die Wartung und Anpassung der Anwendung erleichtert.

  • Konfigurationsdatei: Diese Datei, passw_config.php, enthält die Konfigurationen für das Passwort in Form eines assoziativen Arrays.
  • $config: Das assoziative Array $config enthält eine einzige Konfiguration:
    • erwartetes_passwort_hash: Diese Konfiguration speichert den gehashten Wert des erwarteten Passworts. In diesem Beispiel wird der gehashte Wert eines Passworts gespeichert. Dieser Wert wird normalerweise verwendet, um das erwartete Passwort mit dem vom Benutzer eingegebenen Passwort zu vergleichen, um die Authentifizierung durchzuführen.

Der hier angegebene Beispiel-Hash dient nur zu Demonstrationszwecken. In einer echten Anwendung würde dieser Wert durch den gehashten Wert des tatsächlichen erwarteten Passworts ersetzt werden.

passw_config.php

<?php
// Konfigurationsdatei
$config = array(
    'erwartetes_passwort_hash' => '$2y$10$mrtjyDdohbyN7tTkeCBkFeIdklmPViymxKHX1Odl0jgkbvwNSAHbC' // Beispiel-Hash des erwarteten Passworts
);
?>

Der in der Datei passw_config.php gespeicherte Hash-Wert (erwartetes_passwort_hash) entspricht dem in passw_abfrage.php verwendeten.

Dies stellt sicher, dass die Authentifizierung des Benutzers konsistent und genau ist. Es ist jedoch wichtig zu betonen, dass das Passwort nicht im Klartext in der Konfigurationsdatei oder im Code gespeichert werden sollte, da dies ein Sicherheitsrisiko darstellt. Stattdessen wird empfohlen, den gehashten Wert des Passworts zu verwenden, um die Sicherheit zu erhöhen und unbefugten Zugriff zu verhindern.

Im Falle eines Passwortverlusts oder einer Änderung muss der entsprechende Hash-Wert in beiden Dateien aktualisiert werden. Die Verwendung von Hash-Codes anstelle von Klartextpasswörtern verbessert die Anwendungssicherheit erheblich.

zeitmaschine, gifzentrale.com