Mitgliederbereich-Website erstellen: Grenzen von HTML

Website erstellen

Reiner HTML-Code kann keine Inhalte schützen. Wer den Quelltext öffnet oder JavaScript deaktiviert, umgeht jede „Sperre“, die nur im Browser läuft. Ein echter Mitgliederbereich – mit Login, Registrierung und Seiten, die ausschließlich angemeldete Nutzer sehen – braucht deshalb eine Server-Komponente. Dieser Artikel zeigt drei praxistaugliche Wege: die Zwei-Minuten-Lösung per .htaccess, den selbst gebauten Login mit PHP und MySQL und den Weg ohne eigenen Code über ein CMS. Mit lauffähigen Beispielen und den Fehlern, die Sie sich sparen sollten.

Was HTML leistet – und wo die Grenze liegt

HTML liefert die Struktur: das Anmeldeformular, die Eingabefelder, den Absende-Button. CSS gestaltet, JavaScript macht die Seite interaktiv. All das läuft aber im Browser des Besuchers – und alles, was im Browser läuft, kann der Besucher lesen und verändern.

Ein häufiger Anfängerfehler ist der „Passwortschutz per JavaScript“: Eine Seite prüft ein Passwort mit if (eingabe === "geheim") und leitet dann weiter. Das ist kein Schutz. Das Passwort steht im Quelltext, und die Zielseite lässt sich direkt aufrufen. Sobald Inhalte wirklich vertraulich sein sollen, muss die Entscheidung „darf dieser Nutzer die Seite sehen?“ auf dem Server fallen, bevor die Seite überhaupt ausgeliefert wird.

Die Formulare selbst schreiben Sie aber sehr wohl in HTML. Ein sauberes Login-Formular sieht so aus:

<form action="login.php" method="post">
  <label for="email">E-Mail</label>
  <input type="email" id="email" name="email" required autocomplete="username">

  <label for="password">Passwort</label>
  <input type="password" id="password" name="password" required autocomplete="current-password">

  <button type="submit">Anmelden</button>
</form>

Wichtig: method="post" (nicht get, sonst landet das Passwort in der URL) und Auslieferung ausschließlich über HTTPS.

Der schnelle Weg: Passwortschutz per .htaccess

Wenn Ihr Server Apache nutzt und Sie nur eine Handvoll fester Zugänge brauchen – etwa einen internen Downloadbereich für ein Team – reicht die HTTP-Basisauthentifizierung. Kein Programmieren, keine Datenbank.

Legen Sie im zu schützenden Ordner eine Datei .htaccess an:

AuthType Basic
AuthName "Mitgliederbereich"
AuthUserFile /absoluter/pfad/zu/.htpasswd
Require valid-user

Die Zugangsdaten selbst kommen in eine .htpasswd-Datei, die außerhalb des öffentlichen Web-Verzeichnisses liegen sollte. Sie erzeugen den ersten Eintrag mit:

htpasswd -c /absoluter/pfad/zu/.htpasswd maxmustermann

Der Schalter -c legt die Datei neu an – für jeden weiteren Benutzer lassen Sie ihn weg, sonst überschreiben Sie die Datei. Beim Aufruf zeigt der Browser dann seinen eigenen Login-Dialog.

Grenzen: Es gibt keine Selbstregistrierung, kein Passwort-Zurücksetzen und keine unterschiedlichen Rechte. Und weil Basic Auth die Zugangsdaten bei jedem Aufruf mitschickt, ist HTTPS Pflicht. Für einen kleinen, statischen Schutz ist das solide – für ein Portal mit vielen Mitgliedern reicht es nicht.

Der solide Weg: Login mit PHP und MySQL

Sobald sich Nutzer selbst registrieren sollen, brauchen Sie ein Backend, das Konten speichert und Sitzungen verwaltet. Welche Sprache Sie wählen, ist zweitrangig – PHP, Python oder Node.js leisten dasselbe. PHP eignet sich hier gut, weil praktisch jeder Standard-Webhoster es ohne Zusatzkonfiguration bereitstellt. Wenn Sie die Sprachwahl grundsätzlich abwägen, hilft der Überblick unter welche Programmiersprachen 2025 am wichtigsten sind.

Datenbank und Passwörter

Speichern Sie Passwörter niemals im Klartext. Legen Sie stattdessen einen Hash ab. Die Tabelle ist minimal:

CREATE TABLE users (
  id            INT AUTO_INCREMENT PRIMARY KEY,
  email         VARCHAR(255) NOT NULL UNIQUE,
  password_hash VARCHAR(255) NOT NULL,
  created_at    TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

Registrierung

Beim Anlegen eines Kontos hashen Sie das Passwort mit password_hash(). Die Voreinstellung PASSWORD_DEFAULT verwendet ein sicheres, modernes Verfahren und wird mit neuen PHP-Versionen automatisch stärker.

<?php
$pdo = new PDO(
    'mysql:host=localhost;dbname=meine_seite;charset=utf8mb4',
    'db_user', 'db_pass'
);

$hash = password_hash($_POST['password'], PASSWORD_DEFAULT);

$stmt = $pdo->prepare(
    'INSERT INTO users (email, password_hash) VALUES (?, ?)'
);
$stmt->execute([$_POST['email'], $hash]);

Der prepare()-Aufruf mit Platzhaltern (?) ist kein Stilmittel, sondern Ihr Schutz gegen SQL-Injection. Setzen Sie Nutzereingaben nie per String-Verkettung in ein SQL-Statement.

Login und Session

Beim Anmelden holen Sie den Hash zur E-Mail und prüfen ihn mit password_verify(). Stimmt er, merken Sie sich die Nutzer-ID in der Session.

<?php
session_start();

$stmt = $pdo->prepare('SELECT id, password_hash FROM users WHERE email = ?');
$stmt->execute([$_POST['email']]);
$user = $stmt->fetch();

if ($user && password_verify($_POST['password'], $user['password_hash'])) {
    session_regenerate_id(true);      // schützt vor Session-Fixation
    $_SESSION['user_id'] = $user['id'];
    header('Location: /mitglieder/');
    exit;
}
// sonst: zurück zum Formular mit neutraler Fehlermeldung

Zwei Details entscheiden hier über die Sicherheit: session_regenerate_id(true) vergibt nach dem Login eine frische Sitzungs-ID, und die Fehlermeldung bleibt neutral („E-Mail oder Passwort falsch“). Verraten Sie nicht, ob die E-Mail existiert – das hilft nur Angreifern.

Geschützte Seiten absichern

Jede geschützte Seite beginnt mit einer Prüfung. Fehlt die user_id in der Session, geht es zurück zum Login – und zwar mit exit, damit darunter nichts mehr ausgeliefert wird:

<?php
session_start();
if (empty($_SESSION['user_id'])) {
    header('Location: /login.html');
    exit;
}
// ab hier: geschützter Inhalt

Wollen Sie später Rollen (etwa „Basis“ und „Premium“), ergänzen Sie eine Spalte role in der Tabelle und prüfen sie zusätzlich. Für „Passwort vergessen“ erzeugen Sie einen Zufalls-Token, speichern nur dessen Hash mit einer Ablaufzeit (etwa eine Stunde) und schicken den Klartext-Token als Link per E-Mail; beim Klick prüfen Sie Gültigkeit und Ablauf, bevor das neue Passwort gesetzt wird.

Ohne eigenen Code: CMS und Fertiglösungen

Nicht jedes Projekt rechtfertigt einen selbst gebauten Login. Zwei Abkürzungen sind verbreitet:

  • WordPress mit Mitglieder-Plugin. Lösungen wie Paid Memberships Pro oder Ultimate Member bringen Registrierung, Profile und Zugriffsstufen mit, teils in kostenlosen Basisversionen, teils kostenpflichtig für erweiterte Funktionen. Sinnvoll, wenn die Seite ohnehin auf WordPress läuft.
  • Authentifizierung als Dienst. Anbieter wie Auth0, Clerk, Firebase Authentication oder Supabase Auth übernehmen Login, Registrierung und Passwort-Reset. Das passt gut zu statischen Seiten und modernen JavaScript-Frameworks, weil die heikle Nutzerverwaltung ausgelagert ist.

Der Preis der Bequemlichkeit: Sie geben Kontrolle ab und binden sich an einen Anbieter. Rechnen Sie außerdem den Betrieb ein – ein selbst gehostetes Backend braucht einen passenden Server, wozu der Kostenüberblick wie viel ein eigener Webserver kostet hilft.

Typische Fehler und wie Sie sie vermeiden

  • Passwörter im Klartext. Immer password_hash()/password_verify(), nie eigene „Verschlüsselung“ basteln.
  • Schutz nur im Frontend. JavaScript-Weiterleitungen sind kein Zugriffsschutz. Die Prüfung muss auf dem Server passieren.
  • SQL per String-Verkettung. Nutzen Sie ausschließlich vorbereitete Statements.
  • Keine Brute-Force-Bremse. Ohne Begrenzung probiert ein Angreifer Passwörter unbegrenzt durch. Zählen Sie fehlgeschlagene Versuche pro Konto und IP, verzögern oder sperren Sie nach mehreren Fehlschlägen und erwägen Sie eine Zwei-Faktor-Authentifizierung für sensible Bereiche.
  • Kein HTTPS. Ohne TLS wandern Zugangsdaten mitlesbar durchs Netz. Ein Zertifikat gibt es kostenlos über Let’s Encrypt.
  • DSGVO übersehen. Mitgliederdaten sind personenbezogene Daten. Sie brauchen eine klare Datenschutzerklärung, eine Rechtsgrundlage und – bei externen Diensten – einen Auftragsverarbeitungsvertrag. Achten Sie besonders auf Anbieter mit Serverstandort außerhalb der EU; Orientierung gibt der Beitrag zu DSGVO-konformen Apps.

FAQ

Kann ich einen Mitgliederbereich allein mit HTML schützen? Nein. HTML und JavaScript laufen im Browser und sind für jeden einsehbar. Für echten Schutz muss der Server vor dem Ausliefern entscheiden, ob der Nutzer angemeldet ist – etwa per .htaccess, PHP-Session oder einem Authentifizierungsdienst.

Brauche ich zwingend eine Datenbank? Nur, wenn sich Nutzer selbst registrieren oder Sie viele Konten und Rechte verwalten. Für wenige feste Zugänge genügt eine .htpasswd-Datei ganz ohne Datenbank.

Was ist der schnellste Weg ohne Programmierkenntnisse? Läuft die Seite auf WordPress, installieren Sie ein Mitglieder-Plugin. Andernfalls ist ein Authentifizierungsdienst wie Clerk oder Firebase Authentication die schnellste Option – Sie binden nur ein fertiges Login ein, statt es selbst zu bauen.