En vous promenant sur Beamreactor, nous stockons votre IP 48h pour des raisons de sécurité.
Beamreactor, WYSIWYG web engines: home
FAQ · TICKETS · KONTAKT · CHANGELOG

Ein Problem?
Wir sind da.

Durchsuchen Sie die FAQ, öffnen Sie ein Support-Ticket oder kontaktieren Sie uns direkt. Kein Chatbot, keine Warteschlange: Ein Mitarbeiter antwortet Ihnen.

Bevor Sie schreiben — die Antwort ist vielleicht schon hier

Funktionen und Architektur

Technische Fragen zur XDP-Engine, Plugins, Sicherheit, dem Frame-System und den Entwicklungskonventionen von BeamReactor.

Wozu dient frameheader()?+
frameheader() öffnet einen visuellen Abschnitt (Frame) auf der Seite. Sie zeigt den Plugin- oder Abschnittstitel an und erstellt den HTML-Container, in dem der Inhalt gerendert wird. Verwendung: frameheader('Mein Titel', 'h3', false). Die Titelebenen folgen der HTML-Hierarchie: h1 für den Seitentitel (nur einmal), h2 für Hauptabschnitte, h3 und darüber für Frames und Widgets. Ein direkt aufgerufenes Plugin muss beginnen mit: if($obj=='mein_plugin.php') frameheader($dialplugindisplay); — diese Bedingung verhindert die doppelte Header-Anzeige, wenn das Plugin von einem anderen Skript eingebunden wird.
Wann sollte ich framefooter() verwenden?+
framefooter() schließt den von frameheader() geöffneten Frame. Sie ist erforderlich, bevor ein neuer Abschnitt mit frameheader() geöffnet wird. Rufen Sie framefooter() nie ohne ein folgendes frameheader() auf, außer am Seitenende. Das Standardmuster für die Strukturierung einer Seite in mehrere Blöcke: frameheader('Abschnitt 1'); /* Inhalt */ framefooter(); frameheader('Abschnitt 2'); /* Inhalt */. Die Engine übernimmt das abschließende Schließen automatisch.
Wie strukturiere ich eine Seite mit mehreren Abschnitten?+
Verwenden Sie das Paar framefooter() / frameheader(), um Abschnitte zu verketten. Jeder Abschnitt erstellt einen eigenständigen visuellen Block mit eigenem Titel. Beispiel: Nach dem Anzeigen eines Formulars und einem Fehler schließen Sie den aktuellen Frame mit framefooter(), öffnen einen neuen sauberen Frame mit frameheader(''), binden das Formular erneut ein und machen return. So bleibt der Benutzer auf einer gültigen, korrekt gerahmten Seite ohne HTTP-Weiterleitung.
Wie funktioniert secure()?+
secure() prüft, ob die Stufe des eingeloggten Benutzers für den Zugriff auf eine Ressource ausreicht. Sie nimmt eine Stufenkonstante als Parameter (BASE_LEVEL_ADMIN, PLUGIN_LEVEL_MODERATOR, usw.) und gibt true oder false zurück. Das Standardmuster: frameheader($dialplugindisplay); if(!secure(PLUGIN_LEVEL_MODERATOR)) { forbids(); return; }. Der Frame wird VOR der Prüfung geöffnet — forbids() wird im Frame angezeigt, sonst bricht das Layout. Der Trick secure(0) prüft einfach, ob der Benutzer überhaupt eingeloggt ist.
Welche Includes sollte ich in einem Plugin verwenden?+
Keine für Konfiguration und Bibliotheken — die XDP-Engine lädt sie automatisch. Das einzig erlaubte Include ist für die Locale: include(getlocale('plugin_name'));. Dateien mit .conf.inc.php und .lib.inc.php werden von der Engine erkannt und geladen. Manuelles require oder include für Konfiguration oder Libs verursacht eine Warnung und einen fehlerhaften Pfad. Ebenso niemals ein Modul (.mod.php) einbinden — sie werden ausschließlich über ?obj=name.mod aufgerufen.
Wie funktionieren Übersetzungen in einem Plugin?+
Jedes Plugin hat seine Übersetzungsdateien in /locale/plugin_name.XX.inc.php (XX = ISO-Sprachcode). Das Laden erfolgt über include(getlocale('plugin_name'));, das VOR frameheader() aufgerufen werden muss, um Fehler durch fehlende Variablen zu vermeiden. Übersetzungen verwenden ein Array $dialpluginname[]. $dialplugindisplay enthält den angezeigten Plugin-Titel, $dialplugincall den Namen im Kontrollzentrum. getAvailableLanguages() gibt die Liste der verfügbaren Sprachen zurück.
Wie lade ich plugin-spezifisches CSS oder JavaScript?+
Verwenden Sie die globale Variable $headdata zur Injektion in <head>: $headdata .= '<link rel="stylesheet" type="text/css" href="plugins/mein_plugin/css/mein_plugin.css">'; Für JavaScript dasselbe Prinzip: $headdata .= '<script src="plugins/mein_plugin/js/mein_plugin.js"></script>'; Um JS nach dem DOM auszuführen, verwenden Sie $footdata mit einem Heredoc. CSS muss die in core.css definierten Variablen verwenden — niemals Farben erfinden. Wenn eine Variable fehlt, schlagen Sie vor, sie zu core.css hinzuzufügen.
Wie validiere ich Benutzereingaben?+
Verwenden Sie den Sanitizer: use Beamreactor\Sanitizer\Parser; dann Parser::sanitize($input, 'type'). Verfügbare Typen: bool, date, email, name, html, xml, uuid, url, string, ip, float, int, path und andere. sanitize() bereinigt und validiert die Daten und gibt false zurück, wenn ungültig. check() prüft das Format ohne zu bereinigen. Immer VOR jeder SQL-Operation sanitizen. Niemals einen Datentyp erfinden — schlagen Sie einen vor, wenn nötig.
Wie interagiere ich mit der Datenbank?+
Verwenden Sie die SQL-Klasse: use Beamreactor\Database\SQL;. Hauptmethoden: SQL::query() für mehrere Zeilen, SQL::queryFirst() für eine einzelne Zeile, SQL::queryValue() für einen einzelnen Wert, SQL::insertRow() zum Einfügen, SQL::updateRow() zum Aktualisieren, SQL::deleteRow() zum Löschen. Verwenden Sie immer Prepared Statements mit ?-Parametern. Direkte Variablenverkettung in SQL ist strikt verboten. Prüfen Sie die Datenbankverfügbarkeit mit isset($cfg['dbtable']) und die Tabellenexistenz mit SQL::tableExists().
Wie erstelle ich einen AJAX-Endpoint?+
Module (.mod.php) sind die AJAX-Endpoints von BeamReactor. Sie antworten mit JSON, XML, HTML oder Text. Sie gehören in /handlers/plugin_name.mod.php und werden über ?obj=plugin_name.mod aufgerufen (ohne .php). Niemals den vollständigen Dateipfad aufrufen. Minimalstruktur: frameheader-Prüfung, Sicherheit über secure(), Content-Type-Header, Aktionsverarbeitung über Parser::sanitize(), JSON-Antwort mit ['success' => !!1] oder ['success' => !!0]. Auf der JavaScript-Seite erfolgt der Aufruf mit $.post(BEAM_BASE_URL + '?obj=plugin_name.mod', {...}).
Wie funktioniert das Seiten-Routing?+
Alles in BeamReactor läuft über index.php. Der Parameter ?obj= bestimmt, was geladen wird. Ein Plugin: ?obj=mein_plugin.php. Ein AJAX-Modul: ?obj=mein_plugin.mod. Ein Dokument: ?obj=meine_seite.dta. Die XDP-Engine löst den Pfad auf, lädt Konfiguration, Bibliotheken und Locale automatisch und führt das Skript in einer gesicherten Umgebung aus. Kein PHP-Skript kann direkt aufgerufen werden — alles läuft über die Engine.
Wie zeige ich dem Benutzer Benachrichtigungen an?+
BeamReactor verfügt über ein Toast-System mit 6 Stufen: debug (0), info (1), success (2), warning (3), error (4), critical (5). Schnelle Verwendung: Toast::info('Titel', 'Nachricht', 5000); oder Toast::add(Toast::LEVEL_WARNING, 'Titel', 'Nachricht', BASE_LEVEL_USER, 0). Der Parameter minUserLevel richtet Benachrichtigungen nach Zugangsstufe. Dauer in Millisekunden, 0 für dauerhaft.
Wie ist die Struktur eines BeamReactor-Plugins?+
Ein Plugin ist ein eigenständiger Ordner in /plugins/plugin_name/ mit: plugin_name.php (Hauptschnittstelle), /conf/ (automatisch geladene Konfiguration), /lib/ (automatisch geladene Bibliotheken), /locale/ (Übersetzungen pro Sprache), /handlers/ (AJAX-Endpoints .mod.php), /css/, /js/, /images/, /sql/ (Tabelleninstallation), /tests/, /doc/ (Dokumentation .md und Hilfe .help.json), und /data/cache/ für persistente Daten. Installation bedeutet den Ordner ablegen. Entfernung bedeutet ihn herausnehmen.
Wie zeige ich JavaScript-Dialoge in BeamReactor an?+
BeamReactor ersetzt die nativen alert/confirm/prompt durch benutzerdefinierte Dialoge in javascript/dialogs.js.php. Vier Funktionen: alertWindow('Titel', 'Nachricht') für Alarme, confirmWindow('Titel', 'Frage?', {}, callback) für Bestätigungen, promptWindow('Titel', 'Label:', {}, callback) für Eingaben, infoWindow('Titel', 'Info') für Informationen. Niemals native alert(), confirm() oder prompt() verwenden.
Wie übergebe ich PHP-Übersetzungen an JavaScript?+
Definieren Sie in der Plugin-Locale-Datei ein Array $js_translations und rufen Sie setJavascriptLocale($js_translations) auf. Beispiel: $js_translations = ['mein_plugin' => ['error_msg' => $dialmeinplugin[5]], 'global' => ['error' => $dial[32]]]; setJavascriptLocale($js_translations);. Auf der JavaScript-Seite greifen Sie über PLUGIN_TRANSLATION.mein_plugin.error_msg auf die Übersetzungen zu. Die Übersetzungen werden als globales JavaScript-Objekt in den Head injiziert.
Kann ich exit oder die in einem Plugin verwenden?+
Nein. Plugins dürfen niemals exit oder die verwenden. Das einzig erlaubte die im gesamten Plugin-Code ist if(!function_exists('frameheader')) die('forbidden'); in der ersten Zeile, das den BeamReactor-Kontext überprüft. Um die Ausführung zu stoppen, verwenden Sie return. Um einen Fehler zu behandeln, zeigen Sie die Nachricht im Frame an und machen dann return. Wenn ein Plugin exit oder die verwendet, kann die Engine nicht feststellen, was fehlgeschlagen ist, und die Diagnose wird unmöglich.
Wie funktionieren die Sicherheitsstufen?+
BeamReactor verwendet eine feste Hierarchie: OVERMIND > ADMIN > MODERATOR > HIGHUSER > USER. BASE_LEVEL_*-Konstanten sind in cog.inc.php definiert. Jedes Plugin kann eigene Stufen über PLUGIN_NAME_LEVEL_* in seiner Konfiguration definieren. $basedisplevel verwendet immer BASE_LEVEL_*, niemals PLUGIN_LEVEL_*. Benutzerdefinierte define()-Aufrufe kommen nach $basedisplevel. Das System vervollständigt fehlende Stufen automatisch über base_user_levels().
Wie funktioniert das automatische Laden von Klassen?+
Dateien mit .lib.inc.php und .conf.inc.php werden automatisch von der Engine geladen. Für zusätzliche Klassen registrieren Sie einen PSR-4-Autoloader in der Plugin-Konfiguration mit spl_autoload_register(). Der Namespace folgt der Konvention Beamreactor\PluginName\. Klassendateien gehören in /lib/ und werden über den relativen Pfad zum Namespace aufgelöst. Dies ermöglicht es mehreren Plugins, ohne Namenskollisionen nebeneinander zu bestehen.

Zwei-Faktor-Authentifizierung (2FA)

Sie fügt eine unerlässliche Schutzschicht hinzu, indem sie einen zusätzlichen Identitätsnachweis verlangt. Sie stellt sicher, dass selbst bei Diebstahl Ihres Passworts der Zugriff auf Ihre Daten für Dritte unmöglich bleibt. Dies ist die effektivste Abwehrmaßnahme gegen Identitätsdiebstahl und Account-Übernahmen.

Benötigen Sie persönliche Hilfe?

Ticketing — Für registrierte Benutzer. Öffnen Sie ein Ticket, verfolgen Sie seinen Fortschritt und kommunizieren Sie mit dem technischen Support. Ihr Verlauf wird gespeichert.

Direktkontakt — Für kommerzielle Anfragen, Partnerschaften oder Fragen vor dem Kauf. Kein Konto erforderlich.
Kontaktformular →

Aktueller Changelog

- June 23, 2026, 12:50 am: Updated WriteNotepad MCP tool to properly align with the database-driven implementation and user pseudonymization (HMAC-SHA256) instead of using flat files.
- June 22, 2026, 11:36 pm: Secured versions.rss.php using fleet_peers database to validate remote sites and track their last_seen timestamp.
- June 22, 2026, 11:23 pm: Fixed HTTP response codes being lost during the final output buffer assembly in index.php (ensures 403, 404, etc. are properly sent to the client instead of reverting to 200). Added whitelist in hax.inc.php to prevent Updater from being banned.
- June 22, 2026, 10:47 pm: Removed stray print_r in updater manifest fetch and added display of cURL/HTTP errors in the DOM if fetching the update manifest fails.
- June 22, 2026, 1:28 am: Fixed type error in SiteIndexer::extractContentFromHTML where MdParser returned an array instead of a string.
- June 20, 2026, 3:34 pm: Mise à jour du notepad (comportement général, obfuscation des noms plus robuste), des css du plugin todo, de certaines locales
- June 20, 2026, 3:25 pm: Planifié : création d'un outil MCP pour l'accès au calendrier, avec restriction des permissions à l'utilisateur courant.
- June 13, 2026, 1:20 pm: Mise à jour du calendrier (changement des locales pour déplacer la logique d'affichage des catégories)
- June 13, 2026, 1:19 pm: Readded Grok to the MCP with the proper grok/gpt routing. Fixed the MCP for RTE compatibility. Updated the RTE
- June 11, 2026, 12:19 am: Creation de 2 mini plugins pour l'entrainement aux verbes irréguliers Allemands et au vocabulaire Anglais. Reimplémentation de la skin CSS1 pour rendre la structure claire pour des développeurs tiers. Mise à jour de la classe Calendar pour permettre le déclenchement d'évènements corrélés liés à la classe TODO et à la CMDB. Reflexions autour d'un module STIX d'export de tentatives d'attaques pour synchronisation vers des systèmes de syndication globaux.
- June 11, 2026, 12:15 am: Fixed potential XSS vulnerabilities in the CAP Parser and updated the rss_syndicator. Updated the URL datatype to force a scheme. Removed some calls to the now deprecated cleandata function. Updated the Claude/Anthropic compatibility model. updated the prompt for Gemini that would refuse to work under certain circumstances"
- May 28, 2026, 8:45 pm: Implicit conversion from float 104.25311203319502 to int loses precision (error_logger)
- May 27, 2026, 11:40 pm: Grosse opération de réduction des zones d'attaque potentielles en transferant les locales vers un format JSON:\n\nRename mécanique des $dialXX historiques → $dial<plugin_literal> partout (104 plugins traités, ~1500 occurrences).\ngetlocale() étendu pour gérer JSON en priorité + fallback .inc.php.\nCache plugins.cache.php étendue: porte plugin_meta[lang][plugin] avec meta extraite par regex. login_success et plugin_catalog passent de N includes/requête à un lookup tableau (optimisation de chargement).\nPattern déclaratif _plugincall_query + _plugincall_template.\nHistorique modifié pour permettre la soumission de paragraphes complets.
- May 22, 2026, 4:38 pm: Modification de la page d'accueil BeamReactor pour montrer la compatibilité LLM universelle tant côté MCP que tiers/fournisseur/interne (auto hébergée) avec configuration simple.
- May 22, 2026, 3:38 pm: Fix de l'export SQL(mauvais échappement de backslash multiples)
- May 20, 2026, 10:31 pm: Implementation du couple frameheader/framefooter dans le mdreader, mise en valeur des blocs de code, changement de structure de certaines includes pour limiter les temps de chargement au strict nécessaire.
- May 19, 2026, 5:48 pm: Reorganisation des plugins. Banna, intrusion_scanner, parser_enforcer, audit, bans_sync, fleet_peers passent dans la catégorie sécurité, Invoices dans la boutique, support tickets dans communauté...
- May 19, 2026, 5:31 pm: Table fleet_peers pour les ciphers, remise en place du système de partage des bans pair a pair dans la flotte des sites BeamReactor, meilleur usage du parser dans banna, statistics, abuse. Mise en place de la catégorie 10 "sécurité" pour le tableau de bord.
- May 12, 2026, 7:34 pm: 'fixed issues with the custom LLM demo plugin
- May 12, 2026, 7:33 pm: Amélioration des traductions Java, retrait de l'ancien système 2FA, mise en place des fonctions forensic dans le datatype string ainsi que des forensicDecode et forensicRender dans le Parser, affichages sécurisés dans current_user et banna en utilisant les nouvelles fonctions forensic basées sur les defense logs, passage des includes en camelCase, fixed missing versions in misc JS files, js versions are now handled by the versions.rss, fixe
- May 10, 2026, 6:12 pm: Nombreuses mises à jour du systeme de bans pour activer le fitlrage cidr au niveau de ban.inc.php, correctifs d'aspects dans les dta d'Aegis pour l'affichage téléphonie portable, déplacement de last_visitors de la table stats vers la table defense_logs pour eviter l'anonymisation, mise à jour de current_users pour ignorer le webmaster
- May 4, 2026, 12:50 pm: Refactored PHPDoc dates from YYYY-MM-DD to YYYY.MM.DD across 679 files.
- May 3, 2026, 2:06 pm: Enième mise à jour de Payment/PaymentStripe. Mise à jour du MCP pour permettre l'intervention sur le code, avec une fenêtre modale pour chaque intervention. Persona "system". Lien entre ContextHelper et MCP pour récuperer les profils, les historiques et stocker les interventions MCP dans l'environnement LLM général.
- April 27, 2026, 10:14 pm: class session, changement de isAuthenticated() (utilisé pour le chargement de classes JS) pour favoriser l'usage de la méthode secure() originale.
- April 27, 2026, 10:13 pm: Mise à jour des loaders, retrait des fonctions inutiles autoDiscoverAll() et discoverPlugins(). Correction du 2FA, implémentation du générateur de code QR et de l'endpoint correspondant pour éviter la dépendance externe. Correction de la classe TwoFA pour prendre en compte ces modifications. Retrait de TOCTOU dans la classe CMDB (createOwner(), register(), subscribe()). Changement du nom de cookie de session, changé un rand() par un random_bytes(
- April 26, 2026, 1:35 pm: Rectification de race conditions (TOCTOU DB) dans les modules stripe et paypal. Mise en place d'un upsert dans la classe SQL.
- April 22, 2026, 11:25 pm: Fix du flow et des valeurs TTC sur l'ensemble du système marketing. Mise à jour des pages d'accès BeamReactor
- April 19, 2026, 10:36 pm: Correction des affichages TTC, correctifs (multiples) de la structure d'abonnement stripe, des classes et des plugins y afférents (*order*, payment, products_order_check, products_order_confirm)... Ajout du JSON VIES à la table 'orders'.
- April 19, 2026, 10:33 pm: Remplacement de l'array des strings VIES par un module (endpoint) VIES approprié avec check du numéro de TVA intra à chaque étape.
- April 14, 2026, 12:59 pm: Mise en place de la facturation numérique. Meilleure prise en compte des abonnements liés a l'achat de produits via Stripe (avant partiellement manuel, maintenant entièrement automatisé).

Vollständige Historie →

Keine Antwort gefunden?

Öffnen Sie ein Ticket oder nehmen Sie Kontakt auf.

de en fr