| Version | Unterstützt | Frontend |
|---|---|---|
| 2.2.x | Ja | Bootstrap 5.3.3 |
| 2.1.x | Ja | Legacy (Tabellen) |
| 2.0.x | Nein | Legacy (Tabellen) |
| 1.x | Nein | – |
Wenn Sie eine Sicherheitslücke entdecken, melden Sie diese bitte nicht öffentlich über GitHub Issues.
- E-Mail senden an: security@powerscripts.org
- Betreff:
[SECURITY] PowerPHPBoard - Kurzbeschreibung - Inhalt:
- Detaillierte Beschreibung der Schwachstelle
- Schritte zur Reproduktion
- Betroffene Version(en)
- Moegliche Auswirkungen
- Optional: Vorgeschlagene Loesung
- Bestaetigung: Innerhalb von 48 Stunden
- Erste Einschaetzung: Innerhalb von 7 Tagen
- Fix-Veroeffentlichung: Abhaengig von Schweregrad
| Stufe | Beschreibung | Beispiele |
|---|---|---|
| Kritisch | Remote Code Execution, SQL Injection | Unautorisierter DB-Zugriff |
| Hoch | Auth Bypass, XSS (stored) | Session Hijacking |
| Mittel | XSS (reflected), CSRF | Datenmanipulation |
| Niedrig | Information Disclosure | Versionsnummer-Leak |
Alle Datenbankabfragen verwenden PDO Prepared Statements.
// RICHTIG - Prepared Statement
$user = $db->fetchOne(
"SELECT * FROM ppb_users WHERE email = ?",
[$email]
);
// FALSCH - String-Konkatenation (NIEMALS!)
$user = $db->fetchOne(
"SELECT * FROM ppb_users WHERE email = '$email'"
);Implementierung: includes/Database.php
Alle Ausgaben werden mit htmlspecialchars() escaped.
// RICHTIG - Escaped
echo Security::escape($userInput);
echo Security::e($userInput); // Kurzform
// FALSCH - Unescaped (NIEMALS!)
echo $userInput;Flags: ENT_QUOTES | ENT_HTML5
Encoding: UTF-8
Implementierung: includes/Security.php
Alle Formulare sind mit CSRF-Tokens geschuetzt.
// In Formularen
echo '<form method="post">';
echo CSRF::getTokenField();
// ...
echo '</form>';
// Bei Verarbeitung
if (!CSRF::validateFromPost()) {
die('CSRF validation failed');
}Token-Laenge: 64 Zeichen (32 Bytes Hex)
Speicherort: $_SESSION['csrf_token']
Validierung: hash_equals() (Timing-Attack-sicher)
Implementierung: includes/CSRF.php
Passwoerter werden mit Argon2id gehasht.
// Hashen
$hash = Security::hashPassword($password);
// Verifizieren
if (Security::verifyPassword($password, $hash)) {
// Login erfolgreich
}
// Legacy-Migration
if (Security::needsRehash($hash)) {
$newHash = Security::hashPassword($password);
// Neuen Hash speichern
}Algorithmus: Argon2id (PHP 7.3+) oder bcrypt als Fallback Legacy-Unterstuetzung: Base64-kodierte Passwoerter werden erkannt und bei Login migriert
Implementierung: includes/Security.php
Sichere Session-Konfiguration mit Regeneration.
// Session starten
Session::start();
// Nach Login: Session-ID regenerieren
Session::login($userId);
// Sichere Cookie-Einstellungen
session_set_cookie_params([
'lifetime' => PPB_SESSION_LIFETIME,
'path' => '/',
'domain' => '',
'secure' => isset($_SERVER['HTTPS']),
'httponly' => true,
'samesite' => 'Lax'
]);Flags:
httponly: true- Kein JavaScript-Zugriffsecure: true- Nur ueber HTTPS (wenn verfuegbar)samesite: Lax- CSRF-Schutz auf Cookie-Ebene
Implementierung: includes/Session.php
Alle Benutzereingaben werden validiert und sanitiert.
// Integer sicher auslesen
$id = Security::getInt('id', 'GET', 0);
// String sicher auslesen (getrimmt)
$name = Security::getString('name', 'POST', '');
// E-Mail validieren
if (!Security::isValidEmail($email)) {
die('Ungueltige E-Mail');
}Implementierung: includes/Security.php
Sicherheitsrelevante Ereignisse werden geloggt.
// Fehlgeschlagener Login
ErrorHandler::logFailedLogin($email, 'invalid_password');
// CSRF-Fehler
ErrorHandler::logCsrfFailure('/profile.php');
// Berechtigungsfehler
ErrorHandler::logPermissionDenied('edit_post', $userId);Log-Datei: logs/security.log
Format: [Datum] SECURITY [Event] User:ID IP:Adresse | {Details}
Implementierung: includes/ErrorHandler.php
- Alle DB-Queries als Prepared Statements
- Alle Ausgaben mit
Security::escape()escapen - CSRF-Token in Formularen einbinden
- CSRF-Validierung bei POST-Verarbeitung
- Eingaben mit
Security::getInt()/Security::getString()auslesen - Berechtigungen pruefen (
Session::isLoggedIn(), Admin-Check) - Passwoerter mit
Security::hashPassword()hashen - Sensible Aktionen loggen
- Keine String-Konkatenation in SQL-Queries
- Keine direkten
echo $_GET/$_POSTAusgaben - Keine Verwendung von
eval(),exec(),system() - Keine
$_REQUESTVerwendung (nutze$_GEToder$_POST) - Keine direkten Datei-Includes mit Benutzereingaben
- Keine Speicherung von Passwoertern in Klartext oder Base64
Das System unterstuetzt noch Base64-kodierte Passwoerter aus Version 1.x. Diese werden automatisch bei erfolgreichem Login zu Argon2id migriert.
if (Security::needsRehash($user['password'])) {
$newHash = Security::hashPassword($password);
$db->query("UPDATE ppb_users SET password = ? WHERE id = ?",
[$newHash, $user['id']]);
}Private Boards verwenden noch Base64-Encoding fuer Passwoerter. Dies ist kein Sicherheitsrisiko, da diese Passwoerter nicht fuer Authentifizierung verwendet werden.
Aktuell kein serverseitiges Rate-Limiting implementiert. Empfehlung: Fail2ban oder aehnliche Tools auf Server-Ebene einsetzen.
- Repository aktualisieren:
git pull - Dependencies aktualisieren:
composer update - Tests ausfuehren:
composer test - Cache leeren (falls vorhanden)
Abonnieren Sie GitHub Security Advisories fuer dieses Repository: https://github.com/schubertnico/PowerPHPBoard/security/advisories
- Security-E-Mail: security@powerscripts.org
- Allgemein: info@powerscripts.org
- Website: https://powerscripts.org