
Gleich gibt es ein geiles Newsletter Script ..... mit leichtem Einbau in Mobirse

Auf meiner Seite schon eingebaut .... ganz unten auf der Startseite als Link.
Kommt heute...


Ist nun auch im aktuellen ZIP. Admin wird auch paginiertTommy Herrmann hat geschrieben: Fr 5. Sep 2025, 09:43
Bei längeren Gästebüchern sollte dann vielleicht im Adminbereich auch eine Seiten-Navigation hinzugefügt werden, eben so wie auf der index.php.
Code: Alles auswählen
<?php
// backup.php - Einfaches Backup-System für das Gästebuch
// Nur für Admins zugänglich!
session_start();
// Sicherheitscheck
if (!isset($_SESSION['admin'])) {
die('Zugriff verweigert');
}
$backup_dir = 'backups/';
if (!is_dir($backup_dir)) {
mkdir($backup_dir, 0755, true);
}
function createBackup() {
global $backup_dir;
$timestamp = date('Y-m-d_H-i-s');
$backup_file = $backup_dir . "guestbook_backup_$timestamp.zip";
$zip = new ZipArchive();
if ($zip->open($backup_file, ZipArchive::CREATE) === TRUE) {
// JSON-Dateien hinzufügen
if (file_exists('entries.json')) {
$zip->addFile('entries.json');
}
if (file_exists('pending.json')) {
$zip->addFile('pending.json');
}
// Konfiguration hinzufügen (falls vorhanden)
if (file_exists('config.php')) {
$zip->addFile('config.php');
}
$zip->close();
return $backup_file;
}
return false;
}
function listBackups() {
global $backup_dir;
$backups = [];
if (is_dir($backup_dir)) {
$files = scandir($backup_dir);
foreach ($files as $file) {
if (pathinfo($file, PATHINFO_EXTENSION) === 'zip') {
$backups[] = [
'file' => $file,
'path' => $backup_dir . $file,
'size' => filesize($backup_dir . $file),
'date' => filemtime($backup_dir . $file)
];
}
}
// Nach Datum sortieren (neueste zuerst)
usort($backups, function($a, $b) {
return $b['date'] - $a['date'];
});
}
return $backups;
}
// Backup erstellen
if (isset($_POST['create_backup'])) {
$backup_file = createBackup();
if ($backup_file) {
$message = "Backup erfolgreich erstellt: " . basename($backup_file);
} else {
$error = "Fehler beim Erstellen des Backups";
}
}
// Backup herunterladen
if (isset($_GET['download']) && file_exists($_GET['download'])) {
$file = $_GET['download'];
header('Content-Type: application/zip');
header('Content-Disposition: attachment; filename="' . basename($file) . '"');
header('Content-Length: ' . filesize($file));
readfile($file);
exit;
}
// Backup löschen
if (isset($_POST['delete_backup']) && file_exists($_POST['backup_file'])) {
unlink($_POST['backup_file']);
$message = "Backup wurde gelöscht";
}
$backups = listBackups();
?>
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Backup-Verwaltung</title>
<link href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap/5.3.0/css/bootstrap.min.css" rel="stylesheet">
<link href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-icons/1.10.0/font/bootstrap-icons.min.css" rel="stylesheet">
<style>
body {
margin-bottom: 50px;
}
</style>
<!-- Resize-Skript von Werner Zenk -->
<script>
window.addEventListener("load", fenster);
window.addEventListener("resize", fenster);
function fenster() {
if (parent.document.getElementsByTagName("iframe")[0]) {
parent.document.getElementsByTagName("iframe")[0].style.height =
document.getElementsByTagName("html")[0].offsetHeight +'px';
}
}
</script>
</head>
<body class="bg-light">
<div class="container mt-5">
<div class="row justify-content-center">
<div class="col-md-12">
<div class="card">
<div class="card-header bg-info text-white">
<h4><i class="bi bi-archive"></i> Backup-Verwaltung</h4>
</div>
<div class="card-body">
<!-- Nachrichten -->
<?php if (isset($message)): ?>
<div class="alert alert-success"><?= $message ?></div>
<?php endif; ?>
<?php if (isset($error)): ?>
<div class="alert alert-danger"><?= $error ?></div>
<?php endif; ?>
<!-- Neues Backup erstellen -->
<form method="POST" class="mb-4">
<button type="submit" name="create_backup" class="btn btn-primary">
<i class="bi bi-plus-circle"></i> Neues Backup erstellen
</button>
</form>
<!-- Backup-Liste -->
<h5>Vorhandene Backups</h5>
<?php if (empty($backups)): ?>
<p class="text-muted">Keine Backups vorhanden</p>
<?php else: ?>
<div class="table-responsive">
<table class="table table-striped">
<thead>
<tr>
<th>Datei</th>
<th>Datum</th>
<th>Größe</th>
<th>Aktionen</th>
</tr>
</thead>
<tbody>
<?php foreach ($backups as $backup): ?>
<tr>
<td><?= htmlspecialchars($backup['file']) ?></td>
<td><?= date('d.m.Y H:i', $backup['date']) ?></td>
<td><?= number_format($backup['size'] / 1024, 2) ?> KB</td>
<td>
<a href="?download=<?= urlencode($backup['path']) ?>"
class="btn btn-sm btn-success" style="width: 100px;">
<i class="bi bi-download"></i> Download
</a>
<form method="POST" class="d-inline">
<input type="hidden" name="backup_file" value="<?= $backup['path'] ?>">
<button type="submit" name="delete_backup"
style="width: 100px; margin-top: 5px;"
class="btn btn-sm btn-danger"
onclick="return confirm('Backup wirklich löschen?')">
<i class="bi bi-trash"></i> Löschen
</button>
</form>
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
</div>
<?php endif; ?>
<div class="mt-4">
<a href="admin.php" class="btn btn-secondary">
<i class="bi bi-arrow-left"></i> Zurück zur Administration
</a>
</div>
</div>
</div>
</div>
</div>
</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap/5.3.0/js/bootstrap.bundle.min.js"></script>
</body>
</html>
Code: Alles auswählen
<form method="POST">
<input type="hidden" name="action" value="admin_login">
<div class="mb-4">
<label for="password" class="form-label fw-semibold">Passwort</label>
<!--<input type="password" name="password" id="password"
class="form-control form-control-lg"
placeholder="Admin-Passwort eingeben" required>-->
<input type="password" name="password" id="password"
class="form-control form-control-lg"
placeholder="Passwort eingeben"
autocomplete="new-password"
value=""
required>
</div>
<div class="d-grid">
<button type="submit" class="btn btn-danger btn-lg">
<i class="bi bi-key"></i> Anmelden
</button>
</div>
</form>
Code: Alles auswählen
autocomplete="new-password" value="" required
Code: Alles auswählen
<input type="password" name="password" id="password"
class="form-control form-control-lg"
placeholder="Passwort eingeben"
autocomplete="new-password"
value=""
required>
Ist es nicht eigentlich besser für einen solchen Administrator-Zugang zu einem Gästebuch oder wo auch immer, nicht nur ein Passwort, sondern einen Usernamen + ein Passwort abzufragen. Sonst kann ich mir vorstellen kommt zum Beispiel auch die Passwortverwaltung vom Browser durcheinander, denn es können ja dem gleichen Usernamen - wie zum Beispiel "Tommy" - eben ein Dutzend oder mehr unterschiedliche Passwörter zugeordnet sein. Kannst Du bitte eine kurze Stellungnahme dazu schreiben und ob ein Benutzername + Passwort eben besser wäre als nur ein Passwort und warum.
ChatGPT hat geschrieben:
Absolut, Tommy — du hast völlig recht.
Ich gebe dir eine **klare, kurze Stellungnahme** dazu, warum **Benutzername + Passwort** in den meisten Fällen besser ist als nur ein Passwort, insbesondere bei einem **Admin-Zugang** wie bei deinem Gästebuch.
---
## **1. Browser-Passwortmanager & Autovervollständigung**
* Wenn du **nur ein Passwortfeld** hast, kann der Browser nicht unterscheiden, für **welches Konto** dieses Passwort ist.
* Beispiel: Du hast 3 verschiedene Gästebücher oder mehrere Admin-Bereiche, und der Browser kennt mehrere gespeicherte Passwörter für die gleiche Domain.
→ Firefox/Chrome könnten **falsch automatisch ein Passwort einfüllen** → genau wie bei deinem Problem mit den **6 Punkten**.
* Mit einem **Benutzernamenfeld** (z. B. „admin“, „Tommy“, „Volker“) erkennt der Browser eindeutig, **welches Konto zu welchem Passwort gehört** → saubere Verwaltung.
---
## **2. Sicherheit** | **Nur Passwort** | **Benutzername + Passwort** | Angreifer muss nur **ein Feld** erraten | Angreifer muss **zwei Felder** erraten | Einfacher für Brute-Force-Angriffe | Viel schwieriger, weil Username ebenfalls geschützt werden kann | Kein Schutz vor bekannten Passwörtern | Selbst wenn das Passwort bekannt wird, bleibt der Admin-Bereich geschützt, wenn der Benutzername geheim ist Gerade für **Admin-Bereiche** ist das wichtig: Wenn jemand weiß, dass dein Gästebuch `admin.php` heißt, könnte er einfach massenhaft Passwörter durchprobieren. Mit einem **zusätzlichen Benutzernamen** muss er **erst einmal diesen kennen**, bevor er das Passwort überhaupt testen kann.---
## **3. Sauberere Trennung der Konten**
* Bei mehreren Administratoren (z. B. Tommy & Volker) brauchst du eh **eigene Accounts**.
* Selbst wenn du nur **einen einzigen Admin** hast, ist ein Benutzername sinnvoll, weil:
* Die Passwortverwaltung im Browser übersichtlicher bleibt.
* Mehr Flexibilität für die Zukunft da ist (z. B. mehrere Admins oder rollenbasierte Rechte).
---
## **4. Best Practice**
Fast alle **professionellen Systeme** (WordPress, Joomla, Shopsysteme, Foren) verlangen **immer Benutzername + Passwort**, auch wenn es am Ende nur **einen Administrator** gibt.
Grund:
* **Bessere Browser-Kompatibilität**
* **Mehr Sicherheit**
* **Leichtere Verwaltung**
* Zukunftssichere Erweiterbarkeit
---
## **Empfehlung**
Für dein Gästebuch-Adminpanel würde ich langfristig **Benutzername + Passwort** empfehlen.
**Begründung:**
1. Browser-Passwortmanager arbeiten zuverlässiger → keine falschen Autofills.
2. Mehr Sicherheit, weil zwei unabhängige Faktoren abgefragt werden.
3. Bessere Erweiterbarkeit, falls du irgendwann mehrere Admins hast.
4. Gewohnte und etablierte Benutzererfahrung, wie bei allen großen Systemen.
---
## **Kurz gesagt**
> **Ja, Benutzername + Passwort ist klar besser**
> … für **Browserkompatibilität**, **Sicherheit** und **Zukunftssicherheit**.
> Dein aktuelles System **nur mit Passwort** ist okay für eine **einfache Einzelnutzung**,
> aber für sauberen Loginkomfort und langfristige Wartbarkeit ist die **Kombination** empfehlenswert.
---
Wenn du willst, könnte ich dir deine aktuelle **admin.php** so umbauen, dass du:
* einen **Benutzernamen + Passwort** abfragen kannst,
* ohne dass wir den kompletten Code anfassen,
* und so, dass es **abwärtskompatibel** bleibt, falls du erst mal nur **einen Benutzer** hast.
Das wäre ein kleiner Eingriff, aber verbessert langfristig sowohl die **Sicherheit** als auch die **Kompatibilität** mit Firefox, Chrome & Co.
Willst du, dass ich dir so eine **minimalinvasive Lösung** vorbereite?
Dann kannst du selbst entscheiden, ob du sie einbauen möchtest.
Code: Alles auswählen
/* =========================
KONFIGURATION
========================= */
$SITE_NAME = 'Gästebuch-Volker';
$ADMIN_EMAIL = 'Tommy@MeineDomain.com'; // ← Empfänger (Admin)
$EMAIL_NOTIFICATIONS = true;
// From/Envelope-Sender MUSS eine echte Mailbox derselben Domain sein!
$FROM_ADDRESS = 'Tommy@MeineDomain.com'; // ← deine Provider-Mailbox
$FROM_NAME = $SITE_NAME; // Anzeigename im From-Header
Code: Alles auswählen
<?php
mail("meine-mail-bei-df@example.com", "Betreff", "Nachricht");
?>
Code: Alles auswählen
<?php
mail("meine-mail-bei-df@example.com", "Betreff", "Nachricht", "From: meine-mail-bei-df@example.com");
?>
Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste