WBCE CMS – Way Better Content Editing.
You are not logged in.
Schon ewig bin ich Mitleser hier und habe schon oft vom Forum profitiert. Jetzt möchte ich mal was zurückgeben. Da ich im Bildungsbereich und mit KI zu tun habe, entwickle ich seit kurzem mit ChatGPT eigene Module für WBCE-Schulhomepages. Nun ist ein erstes "vorzeigbares" Modul fertig, das ich euch zur kritischen Durchsicht gerne zur Verfügung stelle. Ich bin natürlich kein gelernter Programmierer und muss glauben, dass mir ChatGPT 5 in der Team-Version meines AG ein gutes Modul programmiert hat. Deshalb meine Bitte an die Profis, mir Fehler bzw. Sicherheitsmängel offen hier zu melden. Das Modul soll in ein paar Wochen in einem geschützten Bereich einer Schulhomepage an die Viertklasskinder losgelassen werden. Hier die Beschreibung und technische Aspekte:
Escape Kids – interaktive Lern- und Rätselabenteuer für WBCE
Mit dem Modul Escape Kids lassen sich komplette Escape Games direkt im WBCE-CMS gestalten – ideal für Schulen, Projektgruppen oder alle, die ihren Webseitenbesuchern eine spielerische Herausforderung bieten möchten.
Im Backend können Rätsel mit Texten, Bildern, Hinweisen, individuellen Punktwerten und einem globalen Countdown erstellt werden. Die Reihenfolge lässt sich bequem per Drag & Drop anpassen. Jede Frage kann eigene Erfolgsmeldungen und Tipps enthalten. Bilder werden automatisch im passenden Medienordner abgelegt.
Im Frontend erwartet die Spielenden eine klare, responsive Oberfläche mit Fortschrittsanzeige, Countdown, Pausefunktion bei Erfolgsmeldungen und zentrierter Darstellung. Alles läuft rein im Browser – kein zusätzliches Plugin oder Framework nötig.
Technische Details:
Eigenständiges WBCE-Modul ab Version 1.6, voll kompatibel mit PHP 8
Datenhaltung in zwei eigenen Tabellen:
`mod_escape_kids_settings` (globale Spieleinstellungen)
`mod_escape_kids_puzzles` (Rätsel und Inhalte)
UTF-8-sicher, inklusive Umlautbehandlung und prepared statements
Medienmanagement: automatisches Anlegen von Unterordnern in `/media/escapegame/<spielname>/`
Frontend: reines JavaScript für Spiellogik, Countdown, Punkte und Anzeige
Backend: modernes, helles Layout mit erklärenden Tooltips (aus Sprachdatei geladen)
Mehrsprachig vorbereitet: Texte und Hilfen zentral in `/languages/`
Kein zusätzlicher Datenbank- oder Template-Eingriff notwendig
LG pfreud01
Anhang entfernt, aktuelle Version im Thread.
Last edited by pfreud01 (Yesterday 15:15:42)
Offline
Damit das Escape Game auf den Tablets der Kinder voll zur Geltung kommen kann, hab ich auch noch das Whiteboard Template zu einem Blackboard Template umgebaut, so dass das Escape Game ohne "normale" Seite außenrum schön auf schwarzem Hintergrund laufen kann. Nur ein kleiner Backlink ganz unten führt auf die WB-URL zurück, damit man das Spiel wieder verlassen kann.
LG pfreud01
Offline
<rant>
Irgendwie scheint es da draußen wenig Interesse und Testbereitschaft zu geben, schade. Manchmal komme ich mir hier ziemlich einsam vor. Liebe Leute, dieses CMS lebt vom MITMACHEN. Das heißt, dass man auch mal ein Modul testet, selbst wenn man selbst gerade keine konkrete Anwendung dafür hat, und dann seine Erfahrung hier einbringt. Es kann doch nicht sein, dass hier nahezu alles an mir hängenbleibt! Zumal das auch für diejenigen wenigen, die sich hier aktiv einbringen und nicht nur stumm herumlurken, mehr als enttäuschend ist!
</rant>
So, zum Test: Installation lief zwar durch, hat aber Fehler im Errorlog produziert, wodurch dann folglich das Speicher nicht funktioniert bzw. einen internal ERror provoziert, weil das Feld in der DB, in das geschrieben werden soll, fehlt.
2025-11-03T14:16:49+00:00 [Visitor Request] .../admin/pages/add.php
2025-11-03T14:16:49+00:00 [Warning] /config.php:[3] from /admin/pages/add.php:[217] "Constant DB_TYPE already defined"
2025-11-03T14:16:49+00:00 [Warning] /config.php:[4] from /admin/pages/add.php:[217] "Constant DB_HOST already defined"
2025-11-03T14:16:49+00:00 [Warning] /config.php:[5] from /admin/pages/add.php:[217] "Constant DB_NAME already defined"
2025-11-03T14:16:49+00:00 [Warning] /config.php:[6] from /admin/pages/add.php:[217] "Constant DB_USERNAME already defined"
2025-11-03T14:16:49+00:00 [Warning] /config.php:[7] from /admin/pages/add.php:[217] "Constant DB_PASSWORD already defined"
2025-11-03T14:16:49+00:00 [Warning] /config.php:[8] from /admin/pages/add.php:[217] "Constant DB_CHARSET already defined"
2025-11-03T14:16:49+00:00 [Warning] /config.php:[9] from /admin/pages/add.php:[217] "Constant TABLE_PREFIX already defined"
2025-11-03T14:16:49+00:00 [Warning] /config.php:[11] from /admin/pages/add.php:[217] "Constant WB_URL already defined"
2025-11-03T14:16:49+00:00 [Warning] /config.php:[12] from /admin/pages/add.php:[217] "Constant ADMIN_DIRECTORY already defined"
[03-Nov-2025 14:16:50 UTC] Unknown column 'game_name' in 'INSERT INTO'
[03-Nov-2025 14:16:50 UTC] INSERT IGNORE INTO `w1021_mod_escape_kids_settings`
(`section_id`,`page_id`,`game_name`,`game_dir`,`title`,`success_text`,`enable_timer`,`time_limit_seconds`)
VALUES (11,10,'Escape Game','default','Escape Game','Geschafft!',0,0)
2025-11-03T14:16:50+00:00 [Visitor Request] .../admin/pages/modify.php?page_id=10
2025-11-03T14:16:50+00:00 [User Notice] /framework/class.database.php:[333] from /modules/escape_kids/modify.php:[50] database->query "STATEMENT: INSERT IGNORE INTO `w1021_mod_escape_kids_settings` (`section_id`,`page_id`,`game_name`,`game_dir`,`title`,`success_text`,`enable_timer`,`time_limit_seconds`) VALUES (11,10,'Escape Game','default','Escape Game','Geschafft!',0,0)"
[03-Nov-2025 14:17:02 UTC] Unknown column 'game_name' in 'INSERT INTO'
[03-Nov-2025 14:17:02 UTC] INSERT IGNORE INTO `w1021_mod_escape_kids_settings`
(`section_id`,`page_id`,`game_name`,`game_dir`,`title`,`success_text`,`enable_timer`,`time_limit_seconds`)
VALUES (11,10,'Escape Game','default','Escape Game','Geschafft!',0,0)
2025-11-03T14:17:02+00:00 [Visitor Request] .../admin/pages/modify.php?page_id=10
2025-11-03T14:17:02+00:00 [User Notice] /framework/class.database.php:[333] from /modules/escape_kids/modify.php:[50] database->query "STATEMENT: INSERT IGNORE INTO `w1021_mod_escape_kids_settings` (`section_id`,`page_id`,`game_name`,`game_dir`,`title`,`success_text`,`enable_timer`,`time_limit_seconds`) VALUES (11,10,'Escape Game','default','Escape Game','Geschafft!',0,0)"
[03-Nov-2025 14:17:59 UTC] Unknown column 'game_name' in 'INSERT INTO'
[03-Nov-2025 14:17:59 UTC] INSERT IGNORE INTO `w1021_mod_escape_kids_settings`
(`section_id`,`page_id`,`game_name`,`game_dir`,`title`,`success_text`,`enable_timer`,`time_limit_seconds`)
VALUES (11,10,'Escape Game','default','Escape Game','Geschafft!',0,0)
2025-11-03T14:17:59+00:00 [Visitor Request] .../admin/pages/modify.php?page_id=10
2025-11-03T14:17:59+00:00 [User Notice] /framework/class.database.php:[333] from /modules/escape_kids/modify.php:[50] database->query "STATEMENT: INSERT IGNORE INTO `w1021_mod_escape_kids_settings` (`section_id`,`page_id`,`game_name`,`game_dir`,`title`,`success_text`,`enable_timer`,`time_limit_seconds`) VALUES (11,10,'Escape Game','default','Escape Game','Geschafft!',0,0)"
2025-11-03T14:17:59+00:00 [Exception] There was an unknown exception: Unknown column 'game_name' in 'SET' in line (92) of /modules/escape_kids/modify.php
Dieser Test hat mich jetzt ungefähr 5 Minuten meiner ach so kostbaren Zeit gekostet. Schade, dass sich kein anderer zum Testen gefunden hat, sonst hätte das ggf. schon letzte Woche bearbeitet werden können.
Sorgen sind wie Nudeln: man macht sich meist zu viele.
Offline
Sorry. Anfängerfehler. Ich hab tatsächlich mein Modul auf keiner weiteren anderen WBCE Instanz installiert und getestet, nur dort, wo ich es entwickelt habe. Ich verbessere und melde mich dann wieder.
Offline
florian
Danke.
Ich habe ein paar Änderungen vorgenommen, siehe nachfolgende Liste Datei im Anhang. Damit funktioniert's.
add.php:
config-require rausgenommen, nicht erforderlich und verursacht already-defined-Fehler
?> und Leerzeile am Ende entfernt, nicht erforderlich und ggf. störend
check.php:
?> und Leerzeile am Ende entfernt, nicht erforderlich und ggf. störend
index.php:
gemäß üblicher Handhabung durch 404-header ersetzt
info.php:
Version auf 1.2.1.1 erhöht
?> und Leerzeile am Ende entfernt, nicht erforderlich und ggf. störend
install.php:
config-require durch übliche Prüfung ersetzt, ob Datei direkt aufgerufen wird (sicherheitsrelevant)
fehlende Anweisungen zum Anlegen der Tabellenzeilen game_name und game_dir ergänzt
?> und Leerzeile entfernt, nicht erforderlich und ggf. störend
modify.php:
ek_redirect bei Löschen und Neues Rätsel entfernt, führte zu Umleitungsfehler
unistall.php:
config-require durch übliche Prüfung ersetzt, ob Datei direkt aufgerufen wird (sicherheitsrelevant)
global $database entfernt, nicht erforderlich
Anweisung zum Löschen des Modulverzeichnisses in media ergänzt
?> und Leerzeile am Ende entfernt, nicht erforderlich und ggf. störend
upgrade.php:
config-require durch übliche Prüfung ersetzt, ob Datei direkt aufgerufen wird (sicherheitsrelevant)
view.php:
config-require durch übliche Prüfung ersetzt, ob Datei direkt aufgerufen wird (sicherheitsrelevant)
global $database entfernt, nicht erforderlich
Last edited by florian (04.11.2025 07:19:31)
Sorgen sind wie Nudeln: man macht sich meist zu viele.
Offline
Ich habe im vorherigen Post die Liste meiner Änderungen ergänzt.
Damit lassen sich dann Rätsel anlegen und auch im Frontend durchspielen. Sehr schön geworden.
Was mir noch aufgefallen ist:
Wenn ein neues Rätsel angelegt wird und man klickt auf "+Neues Rätsel", gehen nicht gespeicherte Änderungen verloren. Ggf. macht man sich also alle zuvor geleistete Arbeit zunichte, das sollte noch abgefangen werden
Es wird beim Speichern eines Rätsels immer ein neues Rätsel angehängt, vielleicht könnte das noch geändert werden, weil sonst ggf. am Ende ein unlösbares leeres Rätsel übrig bleibt, wenn man vergisst, das zu löschen. Vielleicht lässt sich das noch aufteilen (Buttons "Speichern" / "Speichern + weiteres Rätsel")
Drag & Drop funktioniert nicht oder ich kriegs nicht hin (Firefox)
Wenn man viele Rätsel hat, wird es etwas unübersichtlich (laaaaaaaaaaaaaanger Weg bis zur Speichern-Schaltfläche, evtl. Auf/Zuklappen für Rätsel-Panes?), und ich weiß nicht, ob man nicht in einen Timeout beim Speichern läuft, wenn man 20 Rätselfragen oder mehr hat
Ggf. sollte das Anlegen/Bearbeiten einer Rätselfrage auf einer Unterseite erfolgen, also so wie das Bearbeiten der einzelnen Einträge z.B. bei Slider- oder Accordion-Modulen. Das wäre allerdings ein größerer Umbau.
Frage: wie wird die Rätseloption code verwendet?
Last edited by florian (04.11.2025 07:42:16)
Sorgen sind wie Nudeln: man macht sich meist zu viele.
Offline
Hi,
auch mal einen 5 Minuten-Test gemacht ;-)
Ja, funktioniert gut.
Meine Hinweise.
Bei +Neues Rätsel und dann dem ersten Speichern wird -wie von Florian beschrieben - noch ein leeres Rätsel angefügt.
Drag und Drop funktioniert bei mir. Brave Browser. Dabei werden die Rätsel neu nummeriert.
Bilder nicht getestet.
Schöne Grüße
HPZaun
Last edited by hpzaun (04.11.2025 23:30:47)
Offline
florian
Mal schauen ob ich Zeit finde am WE eine Testinstanz aufsetzen und mal meinen Freund "Claude" an deinen Code zu schicken.
Aber schön zu sehen das sich auch andere mit KI an das Thema Module wagen.
Würdest du, wenn du soweit fertig damit bist, über deine Erfahrungen "Coden mit KI" mit uns teilen?
Hier gibt es bereits ein Thema dazu: Coden mit KI
Offline
florian
Danke für eure Rückmeldung. Ich hab ChatGPT mit florians Liste "konfrontiert" und um Stellungnahme besonders zu den sicherheitsrelevanten Änderungen gebeten.
TL;DR – Einschätzung zu den sicherheitsrelevanten Punkten
Das Ersetzen von require config.php durch die übliche Direktaufruf-Prüfung + 404-Header ist State of the Art in WBCE-Modulen:
verhindert direkte Skript-Ausführung außerhalb des CMS,
verhindert „already defined“-Fehler,
reduziert Angriffsfläche.
Die Tabellenergänzungen in install.php und upgrade.php sorgen dafür, dass Neuinstallationen und Upgrades zuverlässig laufen (keine halbfertigen Schemata).
Kein ?> am Ende ist eine generelle Sicherheits-/Robustheitsmaßnahme gegen ungewollte Ausgabe, die Header/Redirects kaputt macht.
PRG nur für POST: verhindert Navigationswarnungen, aber vermeidet Umleitungsfehler bei GET-Aktionen.
Wenn du möchtest, fasse ich dir die konkreten Patch-Diffs (pro Datei) in einem Block zusammen, damit du sie 1:1 übernehmen kannst.
Wäre halt für mich als unbedarfter Copy-und-Paste-Coder ohne Informatikstudium schon hilfreich, wenn die KI das von vorneherein beherzigen würde, wenn es angeblich eh "State of the Art in WBCE-Modulen" ist. Ich kann es ja wie gesagt selber gar nicht. Deshalb ist fachliches kritisches Feedback von euch m.E. auch so wichtig, damit ich und andere Nur-mit-KI-Coder nicht eine Sicherheitslücke nach der anderen auf die Welt loslassen.
Ich schau mal, was der GPT noch verbessern kann und lade das dann hier wieder hoch.
Last edited by pfreud01 (07.11.2025 10:00:57)
Offline
florian
Hier verbesserte Version. Drag und Drop entfernt und Speicherfehler hoffentlich gelöst.
LG pfreud01
Edit: Neuere Version unten im Thread!
Last edited by pfreud01 (Yesterday 17:05:08)
Offline
So. Habe mal eine Testinstallation gemacht. Zuerst die 1.2.11 installiert und dann das Update auf die 1.3.0
Das hat alles soweit funktioniert wie erwartet.
Habe eine Seite angelegt und einfach mal ein paar Wilde Fragen eingegeben.
Hier mal was mir aus dem Stehgreif aufgefallen ist:
Befülle die Eingabefelder mit placeholder https://wiki.selfhtml.org/wiki/HTML/Att … laceholder Dann muß man die nicht erst löschen
Darstellungsfehler im Backend. Eingabefeld "Fragetyp" und "Antwortmöglichkeiten" überschneiden sich.
"Antwortmöglichkeiten (je Zeile)" solte nur angeziegt werden wenn multiple angewählt ist
Wenn alle Rätsel zugeklappt sind, solte sich der Cursaur ändern das man weiß wo man klicken muß um diese aufzuklappen
Wenn du "neues Rätsel" anklickst, werden alle anderen Rätsel ebenfalls aufgeklappt. und man muß viel Scollen.
Wenn ich ein neues Rätsel anlege, aber es nicht mit "Nur dieses Rätsel speichern" speichere, ist es nach einem Refresh trotzdem vorhanden. Auch wenn ich nichts eingetragen habe.
Wenn man eine Antwort nicht weiß, dann kommt man nicht weiter. Besser wäre es zu sagen "Bääätsch Falsche Antwort, keine Punkte" auf zum nächsten Punkt
Offline
Bei der Lokalisierung (Finde ich gut das du die drin hast!) müssen die Englischen Begriffe noch ergänzt werden. Und eine Möglichkeit diese auszuwählen wäre auch ganz praktisch.
Offline
Ok. Habs mal meine Freund Claude vor die Füße geworfen. Bezüglich Sicherheit und so... es gab eine 3 von 10......
Zu dem einen oder anderen kann vielleicht Florian oder einer der anderen Spezialisten hier noch einen kompetenten Kommentar abgeben .
Hoffe das verschreckt dich nicht.
Ich gebe das hier mal einfach ungefiltert weiter:
Ich führe zuerst eine Webrecherche zu WBCE 1.6.4 und den aktuellen Best Practices durch.Ich habe eine gründliche Analyse des "Escape Kids" Moduls für WBCE CMS durchgeführt. Basierend auf meiner Recherche zu WBCE 1.6.4 und den aktuellen Best Practices prüfe ich jetzt den Code auf Sicherheitslücken und Konsistenz.
## ? **Sicherheitsanalyse des Escape Kids Moduls**
### **? KRITISCHE SICHERHEITSLÜCKEN**
#### 1. **SQL Injection Vulnerabilities** ⚠️
- **view.php (Zeilen 15-17)**: Direkte Verwendung von `$_GET['section_id']` in SQL-Abfragen
```php
$settingsR = $database->query("SELECT * FROM `$table_settings` WHERE `section_id`=$section_id");
```
**Problem**: Keine Prepared Statements verwendet! WBCE hatte bereits mehrfach SQL Injection Schwachstellen, besonders in Version 1.6.0.#### 2. **Fehlende FTAN-Validierung im Frontend** ?
- **check.php**: API-Endpunkt ohne FTAN-Schutz
- Der Code validiert nur im Backend (modify.php), aber Frontend-AJAX-Requests sind ungeschützt
- WBCE Module sollten FTAN/IDKEY für Formulare implementieren#### 3. **XSS-Schwachstellen** ⚠️
- **view.php (JavaScript-Ausgabe)**: Unzureichende Escaping bei der JSON-Ausgabe
```javascript
const DIR = <?php echo json_encode($game_dir); ?>;
```
- WBCE 1.6.1 hatte mehrere Stored XSS Schwachstellen#### 4. **Pfad-Traversal-Risiko** ?
- **modify.php**: Keine Validierung des Bildupload-Pfads
```php
$target = $mediaDir.'/'.$game_dir.'/'.$fname;
```### **❌ WBCE Best Practice Verstöße**
#### 1. **PHP 8 Kompatibilität**
- WBCE 1.6.0+ unterstützt PHP 8.2
- **Problem**: Verwendung von `MYSQLI_ASSOC` statt `PDO` oder Prepared Statements
- **Problem**: `count(get_included_files()) ==1` ist veraltet#### 2. **Fehlende Sicherheitsheader**
```php
if(count(get_included_files()) ==1){$z="HTTP/1.0 404 Not Found";header($z);die($z);}
```
- Sollte stattdessen `defined('WB_PATH') OR die(header('Location: /index.php'));` verwenden#### 3. **Unvollständige Eingabevalidierung**
- **check.php**: Keine Validierung der JSON-Eingabe
- **modify.php**: `ek_slug()` Funktion ist unsicher (erlaubt `/` im Pfad!)#### 4. **Fehlende Berechtigungsprüfung**
- **view.php**: Keine Prüfung auf Seitenzugriff
- **check.php**: Keine Admin-Authentifizierung### **? Weitere Probleme**
1. **Encoding-Probleme**: Inkonsistente UTF-8 Behandlung (Zeichen wie "ä" deuten auf Encoding-Fehler)
2. **Timer-Pause-Bug**: Komplizierte Timer-Logik mit potentiellen Race Conditions
3. **Fehlende Versionsprüfung**: Keine Kompatibilitätsprüfung mit WBCE Version
4. **Unsichere Defaults**: `enable_timer` und `time_limit_seconds` ohne Validierung### **✅ Empfohlene Sofortmaßnahmen**
1. **SQL Injection beheben**:
```php
// Statt:
$database->query("SELECT * FROM `$table_settings` WHERE `section_id`=$section_id");// Verwende:
$stmt = $database->db_handle->prepare("SELECT * FROM `$table_settings` WHERE `section_id`=?");
$stmt->bind_param('i', $section_id);
```2. **FTAN für Frontend hinzufügen**:
```php
// In check.php hinzufügen:
require_once(WB_PATH.'/framework/class.admin.php');
$admin = new admin('Pages', 'pages_view', false);
if (!$admin->checkFTAN()) {
die(json_encode(['ok'=>false,'msg'=>'Security check failed']));
}
```3. **XSS-Schutz verbessern**:
```php
// Verwende htmlspecialchars() konsequent:
function safe_output($str) {
return htmlspecialchars($str, ENT_QUOTES | ENT_HTML5, 'UTF-8');
}
```4. **Pfad-Validierung**:
```php
// Validiere Pfade:
if (preg_match('/\.\./', $game_dir)) {
die('Invalid directory');
}
```### **? Sicherheitsbewertung: 3/10**
Das Modul hat erhebliche Sicherheitsprobleme und entspricht nicht den aktuellen WBCE Standards. Module von unbekannten Quellen können Sicherheitsrisiken darstellen und sollten gründlich geprüft werden. Eine umfassende Überarbeitung ist dringend erforderlich, bevor es in einer Produktivumgebung eingesetzt werden sollte.
Offline
Und noch eine Letze Anmerkung. Ich habe Claude gefragt was man in einen Prompt einfügen sollte um Sicherheitslücken und Fehler zu minimieren.
Tipp: Frage die KI nach dem korrekten Prompt. Orientiere dich dabei an dem was Claude geantwortet hat.
Konkrete Checkliste für den Prompt ....
Erstelle ein WBCE 1.6.4 Modul mit folgenden Anforderungen:
SICHERHEIT (KRITISCH):
□ Alle SQL-Queries mit Prepared Statements
□ FTAN-Token bei allen Formularen
□ XSS-Schutz: htmlspecialchars() für alle Ausgaben
□ Eingabevalidierung: filter_var(), intval(), etc.
□ Keine direkte Verwendung von $_GET, $_POST ohne ValidierungWBCE-STANDARDS:
□ Header-Schutz in jeder PHP-Datei
□ Admin-Authentifizierung wo nötig
□ Korrekte Tabellen-Präfixe (TABLE_PREFIX)
□ Proper Error HandlingQUALITÄT:
□ UTF-8 durchgehend
□ Kommentare auf Englisch oder Deutsch (konsistent)
□ Keine hartcodierten Pfade
□ Konfigurierbares Verhalten
```### **Beispiel-Prompt für dein Escape-Game:**
```
Erstelle ein WBCE CMS 1.6.4 Escape-Game Modul.KONTEXT:
- WBCE Version: 1.6.4
- PHP Version: 8.2
- Zweck: Rätsel-Spiel für Kinder mit TimerSICHERHEIT (HÖCHSTE PRIORITÄT):
1. Verwende Prepared Statements für ALLE Datenbank-Operationen
2. Implementiere FTAN-Schutz für Backend UND Frontend-Requests
3. Validiere alle Eingaben mit filter_var() oder intval()
4. Escape alle Ausgaben mit htmlspecialchars($var, ENT_QUOTES, 'UTF-8')
5. Prüfe Bildupload: Dateityp, Größe, Pfad-ValidierungSTRUKTUR:
- install.php: Tabellen mit Prepared Statements
- modify.php: Backend mit FTAN, nur für Admins
- view.php: Frontend, sicher gegen XSS
- check.php: AJAX-Endpoint MIT AuthentifizierungZeige mir bitte zuerst die Sicherheitskonzepte, bevor du mit dem Code beginnst.
```### **? Goldene Regel:**
> "Wenn der Prompt nicht explizit Sicherheit erwähnt, wird die KI sie wahrscheinlich vernachlässigen!"### **Tipp für die Zukunft:**
Lass die KI zuerst einen **Sicherheitsplan** erstellen, bevor sie codet:
```
"Bevor du Code schreibst, liste alle Sicherheitsmaßnahmen auf, die du implementieren wirst."
Um es mal nicht unerwähnt zu lassen: Ich finde es klasse was du da auf die Beine bekommen hast. Lasse dich nicht entmutigen und arbeite weiter daran!! Sei mutig und frage ruhig immer wieder nach
Offline
florian, pfreud01
Danke für deinen tollen und ausführlichen Input!
Ich kenne mich hinsichtlich Härtung gegen xss, sql-injection etc. bestenfalls rudimentär aus. Vielleicht kann webbird was dazu sagen.
Claude scheint mir aber einerseits ein bisschen alarmistisch zu sein und andererseits zu optimistisch, was die realen Möglichkeiten angeht. Für prepared_statements z.B. sind die erfordelichen Bedingungen bislang nicht geschaffen, das wird also nicht funktionieren.
Last edited by florian (07.11.2025 21:55:05)
Sorgen sind wie Nudeln: man macht sich meist zu viele.
Offline
Jedenfalls ist die Zusammenstellung, was die KI beachten soll, für mich GOLD wert! Danke für die Liste. Ich werde morgen die KI damit beauftragen, das Modul durchzuschauen.
Bezüglich der anderen Anregungen, wie man das Modul verbessern könnte: Ich muss das erstmal zurückstellen. Für meinen Einsatzzweck reicht die Funktionalität erst mal und für mehr fehlt mir leider die Zeit. Was nicht heißt, dass ihr das nicht machen dürft. Ich würde eine von der Community aufgehübschte Version natürlich auch selber nutzen wollen.
Wichtig ist für mich, dass ich keine "meiner" offiziellen Schulhomepages in Gefahr bringe.
Offline
[...]
Claude scheint mir aber einerseits ein bisschen alarmistisch zu sein und andererseits zu optimistisch, was die realen Möglichkeiten angeht. [...]
Dazu habe ich euch u.a. folgendes "unterschlagen"
Obwohl das eigentlich eine sehr wichtige Aussage ist.
Das zeigt leider ein grundlegendes Problem: KI-generierter Code (egal ob von mir, ChatGPT oder anderen) kann oberflächlich funktionieren, aber oft fehlen die wichtigen Sicherheitsaspekte, die bei echter WBCE-Entwicklung kritisch sind.
[...]
PS: Das zeigt auch, dass KI-Tools (mich eingeschlossen) zwar helfen können, aber gerade bei Sicherheitskritischem Code immer eine menschliche Review brauchen!
Jedenfalls ist die Zusammenstellung, was die KI beachten soll, für mich GOLD wert! Danke für die Liste. Ich werde morgen die KI damit beauftragen, das Modul durchzuschauen.[...]
Meine Empfehlung. Sichere dir den aktuellen Stand deines Moduls.
Lasse GPT neu anfangen. Lass eine Web Recherche über die Entwicklung von WBCE Modulen für die aktuelle Version 1.6.4 durchführen und dann das Modul einmal komplett analysieren. Manchmal ist es besser wenn man sich von "Altlasten" bzw "schlechten Erinnerungen" trennt. Sonst macht das LLM immer wieder die gleichen Fehler die man vorher schon mit viel Geduld ausgebügelt hat.
Bin auf jedenfall gespannt wie es weitergeht.
Last edited by beach (08.11.2025 08:58:43)
Offline
pfreud01
So. Hier eine komplett neue Version 2.0.0. Optisch nicht fertig und auch im Backend fehlen zur alten Version etliche Funktionen. Das muss noch alles aufgehübscht werden, aber darum geht es jetzt noch nicht. Ich hab beim Coden auf die Sicherheitsaspekte bestanden und bitte darum, diese Version dem Bruder Claude vorzusetzen.
Alles, was besser als 3/10 ist, bedeutet Weitermachen und Aufhübschen. Wenn nicht, weiß ich nicht, ob ich mir das zeitlich antue.
LG pfreud01
Last edited by florian (09.11.2025 07:03:08)
Offline
Anhang vergessen? 
Offline
Sorry, ich musste direkt den Anhang löschen, weil darin an mehreren Stellen der vollständige absolute Serverpfad der Installation stand. - Codefragement hier mal anonymisiert:
(function () {
if (defined('TABLE_PREFIX') && defined('DB_HOST')) return;$seek = [__DIR__];
$sf = $_SERVER['SCRIPT_FILENAME'] ?? '';
$dr = $_SERVER['DOCUMENT_ROOT'] ?? '';
if ($sf) $seek[] = dirname($sf);
if ($dr) $seek[] = rtrim($dr,'/');$seen = [];
foreach ($seek as $start) {
$cur = rtrim((string)$start, '/');
if ($cur === '' || isset($seen[$cur])) continue;
$seen[$cur] = true;
for ($i=0; $i<25 && $cur && $cur!==dirname($cur); $i++) {
$cfg = $cur.'/config.php';
if (is_file($cfg)) { include_once $cfg; }
if (defined('TABLE_PREFIX') && defined('DB_HOST')) return;
$cur = dirname($cur);
}
}
$hint = '/homepages/99/123456789/htdocs/wbce-domain/config.php';
if (is_file($hint)) { include_once $hint; }
if (!defined('TABLE_PREFIX') || !defined('DB_HOST')) {
echo '<div class="error">WBCE core (config.php) nicht gefunden.</div>'; return;
}
})();
/* ----------------------------------------------------------------------- */require __DIR__.'/inc/helpers.php';
Mir ist nicht klar, wozu das nutze ist. Ich habe den Eindruck, dass die KI da übers ZIel hinaus geschossen ist. Entweder die config.php ist da, wo sie hingehört, oder sie ist es nicht, da müssen nicht erst - wenn ich das richtig verstehe - diverse Verzeichnisse geprüft werden.
Last edited by florian (09.11.2025 07:11:37)
Sorgen sind wie Nudeln: man macht sich meist zu viele.
Offline
beach
Hier jetzt ohne echten Pfad, ansonsten ohne Änderungen.
Edit: Anhang gelöscht - aktuelle Version weiter unten
Last edited by florian (Yesterday 15:40:26)
Sorgen sind wie Nudeln: man macht sich meist zu viele.
Offline
Installation zeigt merkwürdiges Phänomen, hatte ich so auch noch nicht:
Prozess bleibt auf der Erweiterungen-Seite stehen. Keine Erfolgsmeldung, kein Leeren des Eingabefelds nach Klick auf "Installieren".
Modul funktioniert aber trotzdem - sowohl im BE als auch im FE, keine Einträge im Errorlog ![]()
Das selbe (keine Bestätigung, kein Reload) dann auch beim ansonsten ordnungsgemäßen Deinstallieren.
Last edited by florian (09.11.2025 07:31:01)
Sorgen sind wie Nudeln: man macht sich meist zu viele.
Offline
Danke florian, sehr umsichtig. Solche Böcke nerven einfach, und das trotz deutlichem Hinweis auf Einhaltung der Sicherheitsbestimmungen. Absolute Pfade nicht verwenden muss man ihm offensichtlich auch noch extra befehlen.
ChatGPT wollte unbedingt mit /framework/class.secure.php arbeiten, das gibt es aber in der 1.6.4 gar nicht. Deshalb scheint er da einen Suchmechanismus eingebaut zu haben, um es zu finden. Und natürlich war der erste Entwurf falsch gepackt, also mit Unterordner im Zip.
Last edited by pfreud01 (Yesterday 14:12:12)
Offline
Neue Version - hat etwas mehr Zeit in Anspruch genommen:
### ? Technische Gegebenheiten des Moduls *escape_kids 2.0.0*
**Systemkompatibilität**
* CMS: **WBCE CMS 1.6.4**
* PHP: **≥ 8.2**
* Datenbank: **MySQL 5.7 / MariaDB 10+ (InnoDB, utf8mb4)**
* Keine Abhängigkeit von `class.secure.php` oder älteren WBCE-Framework-Klassen
**Struktur**
* `install.php` – Erstellt Tabellen (`mod_escape_kids_games`, `mod_escape_kids_questions`, `mod_escape_kids_results`) über *Prepared Statements*
* `modify.php` – Backend-Verwaltung (Admin-geschützt, FTAN-validiert, sichere Uploads)
* `view.php` – Frontend-Spiel mit dauerhaftem Timer, XSS-sicher
* `check.php` – Authentifizierter AJAX-Endpoint zur Antwort-Prüfung
* `uninstall.php` – Löscht Tabellen und Medienordner sicher
* `inc/helpers.php` – FTAN- und Upload-Hilfsfunktionen
* `index.php` / `info.php` – Modul-Metadaten
**Sicherheitsarchitektur**
* Alle DB-Operationen per **Prepared Statements**
* **FTAN-Schutz** für Backend und Frontend
* **Input-Validierung:** `filter_var()`, `intval()`, Grenzenprüfung
* **Output-Escaping:** `htmlspecialchars($var, ENT_QUOTES, 'UTF-8')`
* **Upload-Kontrolle:** MIME-Typ, Größe ≤ 5 MB, Pfadprüfung, zufällige Dateinamen
* **Medien-Pfad:** `/media/escape_kids` (geschützt durch `.htaccess`)
* **Keine absoluten Pfade**, nur `WB_PATH` / `WB_URL`
**Tabellen**
* `mod_escape_kids_games` → Spiele-Konfiguration
* `mod_escape_kids_questions` → Aufgaben mit Bild, Lösung, Hinweis
* `mod_escape_kids_results` → Spielstände mit `DATETIME`-Zeitstempeln (durchlaufender Timer)
**Frontend-Funktionalität**
* Spiel-Timer läuft über alle Fragen hinweg
* Hinweise bei Falscheingabe
* Erfolgsnachricht + optionales Erfolgsbild (Upload oder Entfernung möglich)
* Alle Texte, Bilder und Zeiten editierbar
**Backend-UI**
* Kompakte Eingabefelder für Dauer & Versuche
* Fragen-Tabelle mit verschiebbaren Reihen (SVG-Buttons)
* Bild-Upload / -Löschung pro Frage
* Erfolgstext-Editor mit Bildoption
---
Bitte testen und Bruder Claude vorsetzen. Das Design muss noch geändert werden.
LG pfreud01
Offline
Top, alles funktioniert, keine Einträge im Errorlog.
Installation, Deinstallation, Fragen anlegen (mit Bildern), umsortieren, löschen, Aufruf und Spielen im Frontend.
Jetzt kann's ggf. an den gestalterischen Feinschliff gehen ;-)
Sorgen sind wie Nudeln: man macht sich meist zu viele.
Offline