Änderungsprotokoll

NeoFrag Reborn 1.1.0

Luandre 23 Aug. 2026 10 Min. Lesezeit 36
Inhaltsverzeichnis
Inhaltsverzeichnis

Sicherheit

  • Sicherheitsprüfung des gesamten Codes, und Behebung der schweren Lücken, die sie aufgedeckt hat:
    • Sicherungen: Die Sicherungsarchive (eine Kopie der Datenbank und des Ordners config/, der die Passwörter enthält) lassen sich nicht mehr über eine einfache Webadresse herunterladen, weder unter Apache noch unter nginx; nur die Administration (Monitoring) gibt sie heraus. Ihr Name enthält jetzt einen zufälligen, nicht zu erratenden Teil. Der Ordner der Protokolle (logs/) ist auf dieselbe Weise geschützt.
    • Geheime Token: Sitzungs-IDs, Formular-Token und per E-Mail versandte Links (Passwort vergessen, Kontobestätigung) stammen aus einem sicheren Zufallsgenerator; sie waren vorhersagbar. Diese Links laufen nach einer Stunde ab, und eine neue Anfrage macht die vorherige ungültig.
    • Anmeldung: Die Zwei-Faktor-Authentifizierung (2FA) und Sperren werden geprüft, gleich auf welchem Weg man sich anmeldet — Passwort, Discord-, Google- oder GitHub-Konto, Link „Passwort vergessen“ —, und nicht mehr nur mit dem Passwort.
    • Links in E-Mails: Die Adresse der Website, die in per E-Mail versandten Links, bei der Rückkehr von einer Anmeldung über Discord, Google oder GitHub und bei der Rückkehr von einer Stripe-Zahlung verwendet wird, ist die bei der Installation gespeicherte (config/url.php), nicht mehr die, die die Anfrage angibt: Ein Angreifer kann keinen Link mehr versenden lassen, der zu seiner eigenen Website führt.
    • Administrationsseiten: Ein präparierter Anhangsname (in einer Moderationsmeldung) oder eine gefälschte IP-Adresse (Header X-Real-IP, im Sitzungsverlauf) konnten dort Code einschleusen; sie werden jetzt geprüft und unschädlich gemacht. Die Begrüßungsnachricht eines Spieleservers, die von einem externen Dienst stammt, wird vor der Anzeige bereinigt.
    • Administrationsaktionen: Löschen, Aktivieren oder Deaktivieren, Schließen, Freigeben, Wiederherstellen, Leeren… verlangen jetzt in den 23 Modulen, denen es fehlte, ein Sicherheitstoken. Es waren einfache Links oder Formulare ohne Token: Ein präparierter Link, angeklickt von einem angemeldeten Administrator, genügte, um die Aktion auszulösen.
    • Werkzeuge: Die Skripte im Ordner tools/ laufen nur über die Kommandozeile, nie über eine Webadresse; bei jeder Änderung prüft die Continuous Integration, dass keine PHP-Abhängigkeit eine bekannte Lücke hat (composer audit).
    • Von der Sicherheitsrichtlinie (CSP) stummgeschaltete Schaltflächen: Die strikte CSP der Website blockiert im HTML geschriebene Aktionen (onclick="…"), sodass diese Schaltflächen nichts taten: Cookie-Banner, Zeilenzahl der Administrationstabellen, Bestätigungen des Papierkorbs und der Revisionen, Name der angehängten Datei in den Nachrichten, Sammelaktionen der Forenerwähnungen, Auswahl eines Feldes per Klick, Schaltfläche des Löschfensters. Sie sind anders angebunden und funktionieren auch in Inhalten, die ohne Neuladen der Seite geladen werden. Die Auswahl der Zeilen pro Seite rief außerdem noch jQuery auf, das bereits entfernt war.
  • Strikte Content Security Policy (CSP): Von der Website mit einem für jede Seite eigenen Token ausgeliefert, lehnt sie Skripte ab, die ohne dieses Token in die Seite geschrieben sind (unsafe-inline), zur Laufzeit erzeugten Code (unsafe-eval) und eingebettete Objekte (object-src 'none'); Skripte kommen nur noch von der Website und einer kurzen Liste von Adressen, da TinyMCE und CodeMirror jetzt von der Website selbst bereitgestellt werden.
  • Sitzung bei der Anmeldung erneuert: Die Sitzungs-ID ändert sich bei der Anmeldung; eine vor der Anmeldung untergeschobene ID gibt keinen Zugang mehr zur geöffneten Sitzung.
  • Geheimnisse in der Datenbank verschlüsselt: Das SMTP-Passwort und der Schlüssel der Zwei-Faktor-Authentifizierung (2FA) sind verschlüsselt (AES-256-GCM); eine Kopie der Datenbank gibt sie nicht mehr im Klartext preis. Ein vorhandener Wert wird beim nächsten Speichern verschlüsselt.
  • Webhooks: Ein Webhook kann nicht mehr auf das interne Netz des Servers zielen (private, lokale oder reservierte Adressen werden abgelehnt, Weiterleitungen nicht verfolgt).

Hinzugefügt

  • CSS- und JavaScript-Dateien immer aktuell: Jede Datei wird mit ihrem Änderungsdatum angefordert (?v=…), sodass der Browser sie neu lädt, sobald sie sich ändert — auch eine von einem Theme überschriebene oder von Hand hochgeladene Datei —, ohne nf_version_css erhöhen zu müssen (das weiterhin verwendet wird, wenn die Datei nicht gefunden wird).
  • Marketplace: Das Fenster „Updates“ der Seite Themes & Addons meldet, wenn eine neue Version von NeoFrag Reborn verfügbar ist; das Update des Kerns selbst bleibt manuell.
  • Addon-Updates: Dasselbe Fenster vergleicht die installierten Addons mit dem Katalog des Marketplace und installiert die neuen Versionen samt ihren Datenbankmigrationen.
  • Installer: neues Erscheinungsbild — NeoFrag-Reborn-Logo, Banner „Inoffizieller Fork von NeoFrag“, Nennung von Michaël BILCOT und Jérémy VALENTIN (Lizenz LGPLv3) in der Fußzeile, Schriften Inter und Space Grotesk, Türkistöne.
  • Dateien: ein Dateimanager (Ordnerbaum, Hochladen, Leserechte pro Datei oder pro Ordner), portiert aus HiddenCMS von HiddenBlob (LGPLv3). Wird mit dem Kern ausgeliefert.
  • Eigene Emojis (Modul Emojis, mit dem Kern ausgeliefert): Die Administration fügt benannte Bilder hinzu, die :name: unter anderem in Forenbeiträgen und Signaturen, News, Seiten, Events und der Rekrutierung anzeigt.
  • Newsletter: geplanter Versand zum gewählten Datum, in kleinen Paketen, die die geplante Aufgabe der Website (Cron) abarbeitet, statt alles auf einmal zu senden; Öffnungsverfolgung (Öffnungsrate pro Kampagne, gemessen über ein unsichtbares Bild); wiederverwendbare E-Mail-Vorlagen; Wahl der Empfänger: alle Abonnenten, nur Mitglieder oder eine Gruppe.
  • Events: Ein Event kann sich täglich, wöchentlich oder monatlich wiederholen, so oft wie gewählt — jedes Datum wird ein eigenständiges Event. Die Teilnehmer, außer denen, die abgesagt haben, erhalten vor dem Event eine Erinnerung auf der Website (Benachrichtigungsglocke), standardmäßig 24 Stunden vorher; die Erinnerungen laufen über die geplante Aufgabe der Website (Cron).
  • Emoji-Reaktionen: sechs Reaktionen zur Auswahl (👍❤️😂😮😢😡) statt eines einzigen Herzens, wie bei Discord oder Facebook, jede mit eigener Zählung; die bisherigen „Gefällt mir“ werden zu ❤️.
  • Widget „Live-Status“ (das frühere Twitch-Widget): verfolgt mehrere Kanäle gleichzeitig, auf Twitch und YouTube (Twitch-Zugangsdaten und ein YouTube-API-Schlüssel erforderlich), mit Spiel, Zuschauern, Titel, Vorschaubild und eingebettetem Player.
  • Zusammengesetzte Seiten: Unter ihrem Text kann eine Seite Blöcke anderer Module anzeigen (neueste News, News einer Kategorie, neueste Artikel, beliebte Downloads), in der gewünschten Reihenfolge angeordnet und einzeln beim Bearbeiten der Seite eingestellt. Der Shortcode nimmt auch Einstellungen an, zum Beispiel [block:news.latest count=2].
  • Theme Extend, von Chewbaka, auf NeoFrag Reborn portiert (Bootstrap 5, Tag- und Nachtmodus), unter der Lizenz CC BY-NC-SA 4.0; im Marketplace erhältlich.
  • Sofortsuche: Das Such-Widget schlägt ab dem zweiten eingegebenen Buchstaben Ergebnisse vor (News, Forum, Seiten).
  • Sortieren der Administrationslisten: Zehn Listen (News, Artikel, Kleinanzeigen, Downloads, FAQ, Gästebuch, Links, Medien, Umfragen, Wiki) lassen sich nach dem gewählten Kriterium sortieren.
  • Animierte Avatare: Ein als Avatar hochgeladenes animiertes GIF bleibt animiert — immer, wenn der Server Imagick hat, sonst solange es 250 × 250 Pixel nicht überschreitet.
  • Berechtigungen: Das Berechtigungsraster öffnet sich in einem Fenster, ohne die Seite zu verlassen.
  • Dateimanager des Webmasters (Monitoring, Schaltfläche „Dateien verwalten“): die Dateien der Website durchsuchen, sie in einem Editor (CodeMirror) bearbeiten, welche anlegen, umbenennen oder löschen. Die Ordner config/, logs/ und backups/ bleiben außer Reichweite; jedes Speichern behält eine Kopie .nfbak und landet im Audit-Protokoll. Jeder Schreibvorgang verlangt das Webmaster-Passwort, getrennt vom Kontopasswort und außerhalb der Datenbank aufbewahrt (festgelegt bei der Installation oder im Monitoring, Karte „Webmaster-Sicherheit“); einmal festgelegt, wird es auch erneut verlangt, um Sicherungen zu löschen oder zu leeren und um den Schlüssel der geplanten Aufgabe zu ändern.
  • Versionshinweise aus einer einzigen Quelle: tools/changelog-section.php extrahiert eine Version dieses Änderungsprotokolls (CHANGELOG.md), als Markdown oder HTML; die Hinweise der GitHub-Releases werden daraus gezogen, sodass ihre Texte nicht mehr auseinanderlaufen können.

Geändert

  • Installer „alles inklusive“: Der Assistent hat jetzt vier Schritte (Voraussetzungen → Datenbank → Administrator → Fertig). Alle mitgelieferten Module, Widgets und Themes werden im Schritt „Datenbank“ installiert und aktiviert, und die Startseite zeigt die News, sobald die Installation abgeschlossen ist; der Schritt „Module“ und seine Profile entfallen.
  • Bootstrap 4.6.2 → 5.3.8, und jQuery wird nicht mehr geladen: Das JavaScript der Website stützt sich auf ein kleines hauseigenes Hilfsmittel (window.NF). Neun jQuery- oder Bootstrap-4-Plugins sind ersetzt (Benachrichtigungen → Toasts von Bootstrap 5, selectize → Tom Select, Datumsauswahl → flatpickr, FullCalendar 3 → 6, Farb- und Symbolauswahl, Baumansicht und Anzeigen → hauseigener Code, Scrollleisten → natives Scrollen), und jQuery UI durch SortableJS. Vier übersehene Skripte riefen noch jQuery auf: Sie sind in 1.2.0 neu geschrieben.
  • Dunkelmodus: Tabellen, Karten, Dropdown-Menüs und der Texteditor übernehmen die dunklen Farben des Themes, statt weiß zu bleiben, in allen Themes.
  • Widget-Einstellungen und Seitenlayouts: als JSON gespeichert statt im Serialisierungsformat von PHP, was einen Weg zur Codeeinschleusung schließt; bestehende Einstellungen werden weiterhin gelesen.
  • Statistikdiagramme: Chart.js (MIT-Lizenz) ersetzt Highstock, eine kommerzielle Bibliothek, die eine freie Weitergabe des CMS verhinderte.

Behoben

  • MySQL 8: Ein Thema im Forum eröffnen oder darauf antworten, Themen teilen oder zusammenführen, eine Unterhaltung in den Nachrichten beginnen, die Bilder des Sliders neu ordnen… schlugen unter MySQL 8 mit einem fatalen Fehler fehl, weil es die Art ablehnte, wie die Website ihre Transaktionen öffnete. Sie laufen jetzt über die dafür vorgesehenen mysqli-Funktionen.
  • Emojis: Ein Emoji — oder jedes 4-Byte-Zeichen — in einem Text verursachte einen Datenbankfehler. Die Verbindung und alle Tabellen wechseln zu utf8mb4 (Kollation utf8mb4_unicode_ci, die MySQL 8 ebenso wie MariaDB 10 kennt; die nur unter MariaDB 11 verfügbaren Kollationen, an denen die Installation anderswo scheiterte, entfallen).
  • where('col', []) erzeugte eine leere Bedingung (→ DELETE/UPDATE auf die ganze Tabelle): Es erzeugt jetzt 1 = 0 (leere Menge).
  • Daten nach 2038: Der geplante Versand eines Newsletters, die geplante Veröffentlichung einer News, eines Artikels, einer Galerie oder einer Seite und die Daten eines Events konnten nicht über den 19. Januar 2038 hinausgehen: Danach lehnte MariaDB das Speichern ab, ohne jede Meldung. Diese Daten reichen jetzt bis zum Jahr 9999; bestehende Installationen werden per Migration aktualisiert.
  • /user/login und /user/registration antworteten „Seite nicht gefunden“: Die Schaltflächen „Anmelden“ und „Registrierung“ der Themes führen dorthin, wenn JavaScript deaktiviert ist oder der Link in einem neuen Tab geöffnet wird. Diese Adressen öffnen jetzt das Anmelde- oder Registrierungsfenster.
  • Nebula: Die Schaltfläche „Registrierung“ blieb sichtbar, wenn die Registrierungen geschlossen waren, und führte zu einer nicht gefundenen Seite. Sie ist in diesem Fall jetzt ausgeblendet.
  • Discord-Widget: Es nennt die wahre Ursache eines Fehlschlags (Widget auf dem Server deaktiviert, unbekannte ID, Netzwerk) statt einer allgemeinen Meldung, zeigt das echte Logo des Servers (aus der öffentlichen Einladung gelesen) und zählt die Online-Mitglieder richtig — die von Discord gelieferte Liste endet bei 100, was die Zählung großer Server verfälschte.
  • TeamSpeak-Widget, Baumansicht: Es stürzte unter PHP 8 ab und fiel auf die einfache Karte zurück. Der Baum der Kanäle und Clients wird jetzt vom Widget selbst gezeichnet, mit Font-Awesome-Symbolen (kein Symbolpaket mehr nötig); ein Netzwerkfehler zeigt eine allgemeine Meldung, ohne Adresse oder Port des Servers preiszugeben.
  • Widgets Discord, Twitch und Spieleserver: Sie zeigten „nicht erreichbar“, selbst wenn der Dienst antwortete (die Antwort wurde zweimal dekodiert). Die Anfragen der Website senden außerdem eine Browserkennung (User-Agent): Ohne sie antworteten Dienste hinter Cloudflare mit einer Ablehnung (Fehler 403).
  • Sicherungen und Monitoring: Das Anlegen einer Sicherung stürzte auf Servern mit PHP-FPM ab und schlug unter nginx oder Plesk fehl, die auf Adressen mit .json „Seite nicht gefunden“ antworteten; das Löschen oder Herunterladen einer Sicherung führte zu einer nicht gefundenen Seite; der Baum des Monitorings zeigte beim ersten Aktualisieren einen Fehler. Alles behoben.
  • Marketplace nicht erreichbar: Standard-URL auf ohne www umgestellt (https://neofrag-reborn.xyz/marketplace).
  • Hochladen mehrerer Dateien: Die erste Datei eines Mehrfach-Uploads ließ den Upload fehlschlagen („Seite nicht gefunden“) — das blockierte das Hochladen im Modul Dateien. Für Entwickler: uploaded_file() hielt den Index 0 für einen fehlenden Index.
  • Webhooks: Die Registrierung eines Mitglieds (user.registered), ein neuer Kommentar (comment.created) und ein neues Forenthema (forum.topic) lösen endlich ihren Webhook aus; diese Ereignisse wurden angeboten, aber nie gesendet.

Dokumentation

  • Dokumentation (Wiki-Anleitungen): für Entwickler die Formulare (form() und form2()) und die Validierung der Einstellungen eines Widgets; für Administratoren die Fehlerbehebung bei der Installation, ein Beispiel für das Anlegen einer Rolle und was zu tun ist, wenn der Marketplace nicht erreichbar ist. Ein Hinweis erklärt, wie man nginx oder Plesk einstellt, die auf Adressen mit .json „Seite nicht gefunden“ antworteten.
Geschrieben von Luandre Alle Beiträge

Auch lesenswert

0
Kommentare

Meine Cookies verwalten

Die Website speichert nur die Cookies, die sie zum Funktionieren braucht: Dafür ist Ihre Zustimmung nicht erforderlich. Die anderen Dienste gehören anderen Unternehmen; sie werden nur geladen, wenn Sie sie akzeptieren. Ihre Wahl wird sechs Monate gespeichert, und Sie können sie jederzeit ändern.

Für die Website erforderlich Immer aktiv

  • __Host-session Hält Sie angemeldet und schützt die Formulare vor betrügerischen Übermittlungen. Bis zum Schließen des Browsers; ein Jahr mit „Angemeldet bleiben“
  • nf_consent Speichert die Entscheidungen, die Sie in diesem Fenster treffen. 6 Monate
  • nf_fuseau Zeigt Datum und Uhrzeit in Ihrer Zeitzone an. 1 Jahr
  • Browser-Speicher Speichert Ihre Wahl zwischen Tag- und Nachtmodus sowie die für die Artikelliste gewählte Darstellung. Bis Sie ihn leeren

Videos

In Seiten eingebettete Videos: Der Player stammt von der Plattform, die Ihre IP-Adresse erhält und ihre Cookies speichern kann.

Musik

In Seiten eingebettete Titel und Playlists: Der Player stammt von der Plattform, die Ihre IP-Adresse erhält und ihre Cookies speichern kann.