Kopfdaten und Grenzen
- Release
- 7.0.0 → 7.0.1
- Commits
- 140
- Geänderte Dateien
- 886
- Analyse
- 11.08.2026
- Schwerpunkt
- Sicherheit und Barrierefreiheit
Nicht untersucht
Verglichen wurden die im lokalen Repository verifizierten Tags 7.0.0+260526 (26.05.2026) und 7.0.1+260611 (10.06.2026) mit git log --oneline 7.0.0+260526..7.0.1+260611 und git diff --stat 7.0.0+260526..7.0.1+260611. Nicht ausgewertet wurden der Inhalt des mitgelieferten vendor/-Baums, die kompilierten Bundles unter assets/packages/*/build und editor/build, die minifizierten Stylesheets der Adminthemes sowie die Übersetzungskataloge. Dadurch bleibt offen, ob der Austausch der Vorlagen-Bibliothek und der Umbau der Seitenleisten über die zitierten Quelldateien hinaus weitere Verhaltensänderungen mitbringen. Indirekte Effekte über transitive Drittabhängigkeiten lassen sich durch reine Diff-Analyse nicht vollständig erfassen. Aus dem Kapitel „Weitere relevante Änderungen" wurden fünf Einträge geringerer Relevanz weggelassen, darunter die zusätzlichen Besitzprüfungen des Aktualisierungswerkzeugs, die Textüberarbeitung der Sicherheitseinstellungen, die Auswahl mehrerer Antworten über Seitengrenzen im neuen Editor sowie zwei Anpassungen an der Testpipeline.
Executive Summary
Dieses Release ist in erster Linie ein Sicherheitsrelease mit einem umfangreichen Barrierefreiheitsumbau der Verwaltungsoberfläche im Gepäck. Vier Lücken werden geschlossen, darunter eine SQL-Injection in der Fernsteuerungsschnittstelle und eine Host-Header-Injection im Passwort-Reset; parallel verschwindet Vue aus dem Adminbereich, und die Vorlagen-Bibliothek springt auf eine deutlich neuere Fassung. Am ehesten unbemerkt geht die Absicherung gegen Host-Header-Injection schief: Beim ersten erfolgreichen Login schreibt die Anwendung eine Datei mit erlaubten Hostnamen, die genau den gerade verwendeten Namen enthält — jeder weitere Hostname wird danach mit einem Fehler abgewiesen. Ebenfalls leise bricht die Umstellung der Umfragenavigation auf ausschließlich POST, weil Verweise, die bisher per Adresszeile weiterblätterten, nun ohne Meldung auf derselben Seite verharren. Für Theme-Entwickler kommt hinzu, dass die Verwaltungsansichten flächendeckend neue ARIA-Attribute erhalten und eine bisher verwendete Hilfsklasse durch ihr Bootstrap-5-Gegenstück ersetzt wurde.
- Erlaubte Hostnamen werden beim ersten Login festgeschrieben
- Vue entfällt im Adminbereich
- Vorlagen-Bibliothek angehoben und Attributzugriff umgestellt
- Umfragenavigation nur noch über POST
- Barrierefreiheitsumbau der Verwaltungsansichten
- SQL-Injection beim Einladen und Erinnern von Teilnehmenden
- Hochgeladene Dateien der Fernsteuerung ohne Dateiendung
- Migration auf Datenbankversion 708
Upgrade-Empfehlung
🧪 Vorher testen
Das Release schließt vier Lücken und sollte zeitnah eingespielt werden. Die automatisch erzeugte Datei mit erlaubten Hostnamen kann Installationen hinter einem Proxy oder mit mehreren Domänen jedoch unerreichbar machen, und der Wegfall von Vue trifft Erweiterungen, die an der Verwaltungsoberfläche hängen. Beides gehört vor dem Produktivlauf auf eine Kopie.
Lesepfad
| Zielgruppe | Relevante Kennungen und Kapitel |
|---|---|
| Administratoren | A1, A2, A3, A4, A5, A6, A7, A8, Weitere relevante Änderungen, Empfehlung |
| Plugin-Entwickler | A2, A3, A5, Weitere relevante Änderungen, Empfehlung |
| Theme-Entwickler | A2, A3, A4, A5, Weitere relevante Änderungen, Empfehlung |
| Integratoren | A1, A4, A6, A7, A8, Weitere relevante Änderungen, Empfehlung |
| API-Nutzer | A6, A7, Weitere relevante Änderungen, Empfehlung |
Die wichtigsten Änderungen
A1: Erlaubte Hostnamen werden beim ersten Login festgeschrieben
Hintergrund: Die Anwendung baute die Adresse für den Passwort-Reset bisher mit der allgemeinen Methode für absolute Verweise. Diese greift auf den vom Client gesendeten Hostnamen zurück, sodass ein manipulierter Host-Header in die versandte Mail wanderte. Das Release führt eine Variante ein, die den Hostnamen gegen eine Liste erlaubter Namen prüft und im Zweifel nichts zurückgibt; die aufrufenden Stellen brechen dann mit einer Meldung ab, statt eine unsichere Adresse zu verschicken. Die Liste steht in einer eigenen Konfigurationsdatei, die beim Anwendungsstart eingelesen wird. Existiert sie nicht, legt der erste erfolgreiche Login sie an und trägt den gerade verwendeten Hostnamen ein.
Konsequenz: Passwort-Reset-Mails enthalten künftig nur noch Adressen mit einem vertrauenswürdigen Hostnamen; ist keiner ermittelbar, wird die Mail nicht versandt und der Benutzer erhält einen Konfigurationshinweis. Der eigentliche Stolperstein ist die automatische Erzeugung: Sobald die Datei geschrieben ist, weist die Anwendung jede Anfrage ab, deren Hostname weder darin steht noch dem konfigurierten öffentlichen Verweisziel entspricht. Installationen unter mehreren Domänen, hinter einem Proxy mit abweichendem internen Namen oder mit zusätzlicher Testadresse liefern danach einen Fehler statt der Seite. Ist das Konfigurationsverzeichnis nicht beschreibbar, unterbleibt die Erzeugung, und es bleibt bei der bisherigen, nachsichtigen Prüfung. In der globalen Sicherheitskonfiguration zeigt eine neue Anzeige die hinterlegten Namen.
Vorher / Nachher:
// Vorher (application/models/services/PasswordManagement.php)
/* Usage of Yii::app()->createAbsoluteUrl, disable publicurl, See mantis #19619 */
$loginUrl = \Yii::app()->createAbsoluteUrl(
'admin/authentication/sa/newPassword',
['param' => $this->user->validation_key]
);
// Nachher
$loginUrl = \Yii::app()->createValidatedAbsoluteUrl(
'admin/authentication/sa/newPassword',
['param' => $this->user->validation_key]
);
if ($loginUrl === false) {
return false;
}
// Neu (application/controllers/admin/Authentication.php)
// If allowed_hosts.php does not exist, write the current host as valid
$allowedHosts = App()->loadAllowedHosts();
if (empty($allowedHosts)) {
$currentHost = App()->request->getServerName();
if (App()->writeAllowedHosts([$currentHost])) {
Konfiguration: Die Datei ist application/config/allowed_hosts.php. Ihr Aufbau ergibt sich aus der Schreibroutine, die auch die Schutzzeile am Dateianfang setzt; jeder Eintrag ist ein reiner Domänenname ohne Schema und ohne Port:
// Neu (application/core/Traits/LSApplicationTrait.php)
$filePath = Yii::app()->getConfig('configdir') . DIRECTORY_SEPARATOR . 'allowed_hosts.php';
$content = "<?php if (!defined('BASEPATH')) exit('No direct script access allowed');\n"
. "/**\n"
. " * Allowed Hosts Configuration\n"
...
. "\n\$hosts = [\n";
foreach ($sanitized as $host) {
$content .= " " . var_export($host, true) . ",\n";
}
$content .= "];\n"
. "\nreturn [ 'allowedHosts' => \$hosts ];\n";
Fehlt die Datei oder ist ihre Liste leer, verhält sich die Prüfung nachsichtig und lässt jeden Hostnamen durch; sie wird dann beim nächsten Login neu erzeugt.
Nach dem Update testen: Melde dich nach dem Update über genau den Hostnamen an, unter dem die Installation produktiv erreichbar ist, und kontrolliere anschließend den Inhalt der erzeugten Datei sowie die neue Anzeige in den globalen Sicherheitseinstellungen. Rufe danach jeden weiteren Namen auf, unter dem die Installation erreichbar sein soll, und ergänze fehlende Einträge von Hand, bevor Benutzer betroffen sind.
Betroffene Dateien: application/core/Traits/LSApplicationTrait.php, application/controllers/admin/Authentication.php, application/core/LSHttpRequest.php, application/core/LSYii_Application.php, application/models/services/PasswordManagement.php
Relevante Commits: b394cb6432
CVE / Advisory: Der Commit ist ausdrücklich als Sicherheitsfix markiert und nennt die Fehlernummer 20548 im Fehlerverfolgungssystem des Projekts; eine CVE-Kennung ist im Repository nicht auffindbar.
A2: Vue entfällt im Adminbereich
Hintergrund: Die seitliche Navigation der Verwaltungsoberfläche und die globale Seitenleiste waren als Vue-Anwendungen umgesetzt. Das Release ersetzt beide durch reines JavaScript mit eigener Zustandsverwaltung und eigenen Baugruppen; die Paketdefinitionen und Bauskripte der betroffenen Pakete wurden entsprechend umgestellt. Der zentrale Ereignisverteiler des Adminbereichs, der bisher von der Vue-Basisklasse erbte, ist jetzt eine eigenständige Klasse mit nachgebildeter Schnittstelle. Im selben Zug entfällt die Anwendungskomponente des mitgelieferten Bootstrap-Forks samt der zugehörigen Klasse und der Einbindung ihres Namensraums.
Konsequenz: Erweiterungen, die im Adminbereich auf Vue aufsetzen — etwa indem sie eigene Komponenten in die Seitenleiste hängen oder die Reaktivität des Ereignisverteilers nutzen —, finden diese Grundlage nicht mehr vor und scheitern im Browser. Der Ereignisverteiler bietet weiterhin Methoden gleichen Namens zum Auslösen und Abonnieren von Ereignissen, jedoch ohne die Zusatzeigenschaften einer Vue-Instanz. Serverseitig entfällt die Komponente, über die Erweiterungen und Themes bisher auf den Bootstrap-Fork zugriffen; Aufrufe darauf laufen ins Leere und erzeugen einen Laufzeitfehler. Für Theme-Entwickler ändern sich zusätzlich das ausgelieferte Markup und die Stilvorlagen der Seitenleisten, weil die Komponenten neu geschrieben wurden. Administratoren, die ihre Installation selbst aus den Paketquellen bauen, müssen die geänderten Bauketten der betroffenen Pakete nachvollziehen.
Vorher / Nachher:
// Vorher (assets/packages/adminbasics/src/components/eventbus.js)
import Vue from 'vue';
Vue.config.devtools = true;
class EventBus extends Vue {
// Nachher
class EventBus {
constructor() {
this.events = {};
this.eventsBound = {};
}
// Vorher (application/config/internal.php)
// yiistrap_fork configuration
'bootstrap5' => array(
'class' => 'yiistrap_fork.components.TbApi',
),
Im Zielrelease ist dieser Abschnitt entfallen; ebenso die Zeile, die den Namensraum der Komponenten des Forks einbindet, und die Eigenschaftsdeklaration in der Anwendungsklasse.
Neuer Bezugswert: Woher Erweiterungen die bisher über die entfallene Komponente bezogenen Hilfsfunktionen künftig beziehen, ist aus dem Diff nicht ersichtlich und bleibt damit offen; die zugehörige Klassendatei ist ersatzlos entfernt.
Nach dem Update testen: Öffne die Verwaltungsoberfläche mit geöffneter Browserkonsole und kontrolliere Seitenleiste, Schnellmenü und Fragenbaum auf Fehlermeldungen. Lade anschließend jede eigene Erweiterung, die eigene Oberflächenteile im Adminbereich einhängt, und prüfe, ob ihre Ereignisse weiterhin ankommen.
Betroffene Dateien: assets/packages/adminbasics/src/components/eventbus.js, assets/packages/adminsidepanel/src, assets/packages/globalsidepanel/src, application/config/internal.php, application/extensions/bootstrap5/components/TbApi.php (entfernt)
Relevante Commits: f44616cdc6, fbe290f0d1
A3: Vorlagen-Bibliothek angehoben und Attributzugriff umgestellt
Hintergrund: Die Abhängigkeit auf die Vorlagen-Bibliothek war auf eine feste Fassung festgenagelt und wird nun auf einen Bereich ab einer deutlich neueren Fassung gehoben. Die neue Fassung erlaubt es nicht mehr, PHP-Sprachkonstrukte unmittelbar als Vorlagenfunktion zu hinterlegen; die Anwendung leitet die beiden betroffenen Funktionen deshalb über neu eingeführte Hüllmethoden. Zusätzlich wurden in den ausgelieferten Vorlagen der Fragenübersicht die Zugriffe über die allgemeine Attributfunktion durch die Indexschreibweise ersetzt.
Konsequenz: Umfragethemen, die eine eigene Kopie der Navigationsvorlagen mitbringen, behalten die alte Schreibweise und werden von der Umstellung nicht erfasst; ob die alte Form unter der neuen Fassung noch dasselbe Ergebnis liefert, ist aus dem Diff nicht belegbar und sollte am eigenen Theme geprüft werden — Vermutung, gestützt darauf, dass die ausgelieferten Vorlagen an genau diesen Stellen geändert wurden. Erweiterungen, die eigene Vorlagenfunktionen registrieren und dabei ein PHP-Sprachkonstrukt als Zielangabe verwenden, erzeugen unter der neuen Fassung einen Fehler beim Rendern und müssen wie im Kern auf eine Hüllmethode umgestellt werden. Für Administratoren, die ihre Installation selbst aus den Paketquellen bauen, ändert sich der aufgelöste Abhängigkeitsbaum; ein Neuaufbau der Abhängigkeiten ist erforderlich. Die im Kern hinterlegten Vorlagenfunktionen für Prüfung auf Leere und auf Gesetztsein bleiben unter ihren bisherigen Namen verfügbar.
Vorher / Nachher:
composer.json, vorher:
"twig/twig": "3.11.3",
composer.json, nachher:
"twig/twig": "^3.27.1",
// Vorher (application/config/internal.php)
'empty' => 'empty',
...
'isset' => 'isset',
// Nachher
'empty' => 'LS_Twig_Extension::isEmpty',
...
'isset' => 'LS_Twig_Extension::isSet',
// Neu (application/core/LS_Twig_Extension.php)
/**
* Wrapper for PHP's empty() language construct (not callable directly in Twig 3.27+).
*
* @param mixed $value
* @return bool
*/
public static function isEmpty($value)
{
return empty($value);
}
{# Vorher (themes/survey/vanilla/views/subviews/navigation/question_index_menu.twig) #}
{% if attribute(indexItem.stepStatus, 'index-item-unanswered') is defined and attribute(indexItem.stepStatus, 'index-item-unanswered') == true %}
{# Nachher #}
{% if indexItem.stepStatus['index-item-unanswered'] is defined and indexItem.stepStatus['index-item-unanswered'] == true %}
Nach dem Update testen: Rufe eine Umfrage mit aktivierter Fragenübersicht in jedem eigenen Theme auf und prüfe, ob die Zustandsklassen für unbeantwortete, fehlerhafte und aktuelle Einträge weiterhin gesetzt werden. Rendere anschließend jede eigene Vorlage, die selbst registrierte Vorlagenfunktionen verwendet, und kontrolliere das Fehlerprotokoll.
Betroffene Dateien: composer.json, application/config/internal.php, application/core/LS_Twig_Extension.php, themes/survey/vanilla/views/subviews/navigation/question_index_menu.twig, themes/survey/fruity_twentythree/views/subviews/navigation/question_index_menu.twig
Relevante Commits: 8f06b58787, 64e58af393
CVE / Advisory: Beide Commits sind ausdrücklich als Sicherheitsfix markiert und nennen eine Schwachstelle in der Vorlagen-Bibliothek; eine CVE-Kennung oder ein Advisory-Link ist im Repository nicht auffindbar.
A4: Umfragenavigation nur noch über POST
Hintergrund: Die Funktion, die den gewünschten Navigationsschritt eines Teilnehmenden ermittelt, las den Wert bisher aus allen Anfrageparametern, also aus Formulardaten ebenso wie aus der Adresszeile. Das Release schränkt beide Lesevorgänge auf Formulardaten ein: sowohl den ausdrücklichen Bewegungsparameter als auch die veraltete Schreibweise, bei der der Name des Schritts selbst als Parameter auftritt.
Konsequenz: Ein Weiterblättern lässt sich nicht mehr durch einen Verweis in der Adresszeile auslösen. Betroffen sind eigene Umfragethemen, die Navigationsschaltflächen als Verweis statt als Formularschaltfläche umsetzen, sowie Integrationen und Testskripte, die Umfragen über zusammengesetzte Adressen durchlaufen. In beiden Fällen erscheint keine Fehlermeldung: Die Seite wird schlicht erneut ausgeliefert, und der Ablauf bleibt stehen. Für Teilnehmende, die die mitgelieferten Themes verwenden, ändert sich nichts, weil dort ohnehin Formulare abgeschickt werden. Der Sprachwechsel und das Zwischenspeichern laufen über dieselbe Funktion und unterliegen damit derselben Einschränkung.
Vorher / Nachher:
// Vorher (application/helpers/frontend_helper.php)
$move = Yii::app()->request->getParam('move');
/* @deprecated since we use button and not input with different value. */
foreach ($aAcceptedMove as $sAccepteMove) {
if (Yii::app()->request->getParam($sAccepteMove)) {
$move = $sAccepteMove;
}
}
// Nachher
$move = Yii::app()->request->getPost('move');
/* @deprecated since we use button and not input with different value. */
foreach ($aAcceptedMove as $sAccepteMove) {
if (Yii::app()->request->getPost($sAccepteMove)) {
$move = $sAccepteMove;
}
}
Nach dem Update testen: Durchlaufe eine mehrseitige Umfrage in jedem eigenen Theme über die Vor- und Zurück-Schaltflächen und prüfe, ob der Seitenwechsel stattfindet. Prüfe anschließend jedes Skript und jede Integration, die Umfragen automatisiert durchläuft, auf Aufrufe, die den Navigationsschritt in der Adresszeile mitgeben.
Betroffene Dateien: application/helpers/frontend_helper.php
Relevante Commits: e38103708e
A5: Barrierefreiheitsumbau der Verwaltungsansichten
Hintergrund: Rund ein Fünftel der Commits dieses Release entfällt auf Barrierefreiheit. Betroffen sind die Benutzer- und Rollenverwaltung, die Themenverwaltung, die Beschriftungssätze, die Kopfleiste, die Bestätigungsdialoge und die Dialoge der Massenaktionen. Die Änderungen ergänzen ARIA-Attribute, vergeben stabile Kennungen für die Verknüpfung von Beschriftung und Bedienelement, korrigieren die Überschriftenebenen und ersetzen die bisher genutzte Hilfsklasse für nur akustisch ausgegebene Inhalte durch das Gegenstück aus Bootstrap 5. Insgesamt sind über hundert Dateien unterhalb der Verwaltungsansichten und der Adminerweiterungen betroffen.
Konsequenz: Eigene Adminthemes und Erweiterungen, deren Stilvorlagen oder Skripte auf der bisherigen Hilfsklasse aufsetzen, verlieren deren Wirkung: Inhalte, die nur Screenreadern gelten sollten, werden dann sichtbar oder umgekehrt. Ebenso greifen eigene Selektoren nicht mehr, die auf der bisherigen DOM-Struktur der Dialoge, Tabellenüberschriften und Reiter beruhen. Ein Fehler entsteht dabei nicht, die Darstellung weicht lediglich ab. Erweiterungen, die eigene Tabellen in die Dialoge der Massenaktionen einspeisen, erhalten nun eine automatisch gesetzte Tabellenüberschrift, sofern sie die vorgesehene Klasse mitliefern. Für Administratoren verbessert sich die Bedienbarkeit mit Tastatur und Screenreader spürbar, ohne dass eine Einstellung nötig wäre.
Vorher / Nachher:
// Vorher (application/extensions/admin/grid/MassiveActionsWidget/views/_selected_items.php)
<caption class="sr-only"><?php echo isset($caption) ? $caption : gT('Selected items'); ?></caption>
// Nachher
<caption class="visually-hidden"><?php echo isset($caption) ? $caption : gT('Selected items'); ?></caption>
Nach dem Update testen: Öffne in jedem eigenen Adminthema die Benutzerverwaltung, die Beschriftungssätze und einen Dialog einer Massenaktion und prüfe, ob nur akustisch gedachte Inhalte weiterhin unsichtbar bleiben. Durchlaufe anschließend die Reiter der Themenverwaltung ausschließlich mit der Tastatur.
Betroffene Dateien: application/views/userRole/partials/_form.php, application/extensions/admin/grid/MassiveActionsWidget/views/_selected_items.php, application/extensions/admin/grid/MassiveActionsWidget/assets/listActions.js, application/views/admin/labels, application/views/userRole/index.php
Relevante Commits: e4c46e290a, bbe195d32d, 36e4b97d0b, f4ba0f7023
A6: SQL-Injection beim Einladen und Erinnern von Teilnehmenden
Hintergrund: Die Auswahl der zu benachrichtigenden Teilnehmenden setzte die übergebenen Kennungen unmittelbar als Zeichenkette in die Bedingung der Abfrage ein. Über die Fernsteuerungsschnittstelle sind diese Kennungen frei wählbar, sodass sich beliebiges SQL einschleusen ließ. Das Release ersetzt die zusammengesetzte Bedingung durch die Methode der Datenbankschicht, die eine gebundene Mengenbedingung erzeugt.
Konsequenz: Die Lücke ist serverseitig geschlossen; an Aufrufen der Schnittstelle ist nichts zu ändern, und bestehende Integrationen laufen unverändert weiter. Betreiber, deren Fernsteuerungsschnittstelle für Dritte erreichbar ist, sollten das Update dennoch vorziehen, weil die Ausnutzung lediglich einen gültigen Sitzungsschlüssel und das Recht zum Versand voraussetzt. Ob und in welchem Umfang die Lücke in der eigenen Installation genutzt wurde, ist aus dem Diff heraus nicht bestimmbar und lässt sich nur aus den Protokollen der Datenbank und des Webservers erschließen.
Vorher / Nachher:
// Vorher (application/models/TokenDynamic.php)
$command->addCondition("tid IN ('" . implode("', '", $aTokenIds) . "')");
// Nachher
$command->addInCondition("tid", $aTokenIds);
Nach dem Update testen: Rufe über die Fernsteuerungsschnittstelle den Einladungs- und den Erinnerungsversand mit einer Auswahl gültiger Teilnehmerkennungen auf und prüfe, ob genau diese Teilnehmenden angeschrieben werden. Wiederhole den Aufruf mit einer leeren Auswahl und kontrolliere, dass kein unerwarteter Versand stattfindet.
Betroffene Dateien: application/models/TokenDynamic.php
Relevante Commits: 98cfee55df
CVE / Advisory: Der Commit ist ausdrücklich als Sicherheitsfix markiert und nennt die Fehlernummer 20549 im Fehlerverfolgungssystem des Projekts; eine CVE-Kennung ist im Repository nicht auffindbar.
A7: Hochgeladene Dateien der Fernsteuerung ohne Dateiendung
Hintergrund: Der Dateiupload über die Fernsteuerungsschnittstelle setzte den Namen der abgelegten Datei aus einem festen Präfix, einer Zufallsfolge und der Endung der Ursprungsdatei zusammen. Die Schutzregel im Uploadverzeichnis erfasste jedoch nur Namen ohne Unterstrich nach der Zufallsfolge, sodass die abgelegte Datei unmittelbar über den Webserver abrufbar blieb. Das Release lässt die Endung im Dateinamen weg und weitet die Schutzregel zugleich auf Namen mit Unterstrich aus.
Konsequenz: Neu hochgeladene Dateien liegen ohne Endung im Uploadverzeichnis und werden vom Webserver nicht mehr direkt ausgeliefert. Integrationen, die den Rückgabewert des Uploads zu einem Pfad zusammensetzen und dabei die Endung anhängen, greifen ins Leere und erhalten keine Datei mehr; ein Fehler wird dabei nicht ausgelöst. Bereits vorhandene Dateien behalten ihren alten Namen und werden von der erweiterten Schutzregel nun ebenfalls erfasst. Die Schutzregel wirkt nur dort, wo der Webserver Verzeichniskonfigurationen dieser Art auswertet; auf Installationen, die ohne solche Auswertung betrieben werden, muss die entsprechende Regel in der Serverkonfiguration selbst hinterlegt werden.
Vorher / Nachher:
// Vorher (application/helpers/remotecontrol/remotecontrol_handle.php)
$randfilename = 'fu_' . randomChars(15) . '_' . $pathinfo['extension'];
// Nachher
$randfilename = 'fu_' . randomChars(15);
# Vorher (upload/surveys/.htaccess)
<FilesMatch "^fu_[a-z0-9]*$">
# Nachher
<FilesMatch "^fu_[a-z0-9_]*$">
Neuer Bezugswert: Der Rückgabewert des Uploads führt die Endung der Ursprungsdatei weiterhin in einem eigenen Feld, neben dem ursprünglichen Namen und dem abgelegten Namen; dieser Teil des Rückgabewerts erscheint nicht im Diff und ist gegenüber dem Ausgangsrelease unverändert. Integrationen sollten den abgelegten Namen von dort unverändert übernehmen, statt ihn aus Zufallsteil und Endung selbst zusammenzusetzen.
Nach dem Update testen: Lade über die Fernsteuerungsschnittstelle eine Datei hoch und prüfe, dass der zurückgegebene abgelegte Name keine Endung mehr trägt und die Datei über den Webserver nicht unmittelbar abrufbar ist. Wiederhole die Abrufprüfung für eine vor dem Update abgelegte Datei.
Betroffene Dateien: application/helpers/remotecontrol/remotecontrol_handle.php, upload/surveys/.htaccess
Relevante Commits: 79e3d41b1c
CVE / Advisory: Der Commit ist ausdrücklich als Sicherheitsfix markiert und nennt die Fehlernummer 20489 im Fehlerverfolgungssystem des Projekts; eine CVE-Kennung ist im Repository nicht auffindbar.
A8: Migration auf Datenbankversion 708
Hintergrund: Das Fragethema für Matrixfragen mit den Antwortstufen Ja, Unsicher und Nein trug einen Titel, dessen Reihenfolge nicht zur tatsächlich gerenderten Reihenfolge passte. Das Release korrigiert Titel und Beschreibung dieses Themas in der Datenbank und passt zugleich den Kommentar in der ausgelieferten Vorlage an. Die Aktualisierung greift nur, wenn der bisherige Wert noch unverändert ist.
Konsequenz: In der Themenauswahl und in allen Ansichten, die den Namen des Fragethemas anzeigen, erscheint die korrigierte Reihenfolge. Integrationen und Auswertungen, die Fragethemen anhand ihres Titeltextes erkennen oder filtern, finden den alten Text nicht mehr und liefern eine leere Treffermenge, ohne dass ein Fehler entsteht. Eigene Anpassungen an Titel oder Beschreibung bleiben unangetastet, weil die Aktualisierung an den bisherigen Wert gebunden ist. Die Reihenfolge der Antwortoptionen selbst ändert sich nicht; korrigiert wird allein deren Beschreibung.
Vorher / Nachher:
// Neu (application/helpers/update/updates/Update_708.php)
$this->db->createCommand()->update(
'{{question_themes}}',
['title' => 'Array (Yes/Uncertain/No)'],
'name = :name AND title = :oldTitle',
[
':name' => 'arrays/yesnouncertain',
':oldTitle' => 'Array (Yes/No/Uncertain)',
]
);
// Vorher (application/config/version.php)
$config['versionnumber'] = '7.0.0';
$config['dbversionnumber'] = 707;
// Nachher
$config['versionnumber'] = '7.0.1';
$config['dbversionnumber'] = 708;
Migrationsdetails: Die interne Datenbankversion steigt von 707 auf 708; die Migration ist nach dem Zitat rein wertebasiert und ohne Strukturänderung, weil sie ausschließlich Aktualisierungen auf der Tabelle der Fragethemen ausführt und weder Spalten noch Bedingungen anlegt. Sie ist idempotent, weil die Bedingung den bisherigen Wert verlangt und ein zweiter Lauf keine Zeile mehr trifft; eine Rückwärtskompatibilität trägt das Zitat nicht, ein Zurücksetzen der Werte ist darin nicht vorgesehen.
Nach dem Update testen: Öffne die Auswahl der Fragethemen und prüfe, ob der Eintrag für die Matrixfrage mit drei Stufen die korrigierte Reihenfolge im Titel trägt. Prüfe anschließend jede Auswertung und jede Integration, die Fragethemen anhand ihres Titeltextes auswählt.
Betroffene Dateien: application/helpers/update/updates/Update_708.php, application/config/version.php, application/views/survey/questions/answer/arrays/yesnouncertain/answer.twig
Relevante Commits: a83116cba0
Weitere relevante Änderungen
Härtung beim Löschen von Teilnehmerverknüpfungen
Sicherheit · Kein Bruch · Administratoren
Die Verknüpfungen zwischen zentraler Teilnehmerdatenbank und Umfrage werden jetzt über gebundene Bedingungen statt über eine zusammengesetzte Abfrage gelöscht. (049fa816e5)
Autorisierungs-Header an PHP durchgereicht
RemoteControl API · Kein Bruch · Administratoren, Integratoren, API-Nutzer
Die mitgelieferte Verzeichniskonfiguration reicht den Autorisierungs-Header nun an PHP weiter, was auf Installationen ohne deren Auswertung eigenständig nachzuziehen ist. (1af3016e4c)
Eigene Themes auf Basis des Standardthemes im neuen Editor zugelassen
Themes und Rendering · Kein Bruch · Theme-Entwickler, Administratoren
Der neue Editor akzeptiert jetzt auch Umfragethemen, die vom mitgelieferten Standardthema abgeleitet sind, statt nur dieses selbst. (22e1a8dbf6)
Unterfragen-Validierung greift nur bei Relevanz
Survey Runtime · Kein Bruch · Administratoren
Die Validierungsgleichung einer Unterfrage wird nicht mehr auf Unterfragen angewandt, die im aktuellen Ablauf gar nicht relevant sind. (906c1c3c2d)
Leere Fragengruppen werden übersprungen
Survey Runtime · Kein Bruch · Administratoren, Theme-Entwickler
Eine Gruppe mit nur einer Frage, deren Unterfragen sämtlich irrelevant sind, erscheint nicht mehr als leere Seite. (8f18939cc6)
Ausdruck für Fragetext bei Dateiuploadfragen gesetzt
Survey Runtime · Kein Bruch · Administratoren
Der Zugriff auf den Fragetext über den Ausdrucksmanager liefert bei Dateiuploadfragen nun einen Wert statt einer leeren Zeichenkette. (4c065c15eb)
Bedingungen werden beim Neuaufbau mitgeführt
Survey Runtime · Kein Bruch · Administratoren
Beim Neuaufbau der Fragen einer Umfrage werden die zugehörigen Bedingungsausdrücke jetzt mit aktualisiert statt auf dem alten Stand zu verharren. (11eaa29b11)
Ausdrucksfehler im Quotentext werden gemeldet
Survey Runtime · Kein Bruch · Administratoren
Fehlerhafte Ausdrücke im Text einer Quote lassen sich jetzt prüfen, statt unbemerkt zu bleiben. (004bd7125e)
Sammelauswahl bei der Datenintegritätsprüfung
Datenbank · Kein Bruch · Administratoren
Die Datenintegritätsprüfung erhält eine Schaltfläche, die alle angebotenen Einträge auf einmal zur Bereinigung auswählt. (ac93bc11bb)
Eckenradius-Symbole für abgeleitete Themes ergänzt
Themes und Rendering · Kein Bruch · Theme-Entwickler
Die Symbole für den Eckenradius erscheinen jetzt auch in den Themenoptionen abgeleiteter Themes statt nur beim Basisthema. (265896ac02)
Seitenleiste lädt Pakete nur noch bei Bedarf
Performance · Kein Bruch · Administratoren, Plugin-Entwickler
Die Registrierung der Skriptpakete läuft jetzt nur außerhalb von Teilanfragen, was die Verzögerung beim Navigieren in der Seitenleiste beseitigt. (4dd67eb4c6)
Fragenabruf verträgt fehlenden Vorgabewert
RemoteControl API · Kein Bruch · API-Nutzer, Integratoren
Der Abruf der Fragen-Eigenschaften liefert bei fehlendem Vorgabewert nun einen Nullwert statt eines Fehlers. (41c9f06f01)
Zuordnung nach Bereich
| Bereich | Vollständig beschrieben | Weitere Einträge |
|---|---|---|
| Sicherheit | A1, A3, A6, A7 | ja |
| Datenbank | A8 | ja |
| RemoteControl API | A6, A7 | ja |
| Survey Runtime | A3, A4 | ja |
| Themes und Rendering | A2, A3, A4, A5 | ja |
| Plugin-Kompatibilität | A2, A3, A5 | – |
| Performance | keine | ja |
Nicht betroffene Bereiche
Die Mindestanforderung an die PHP-Fassung, wie sie das Installationsmodell in application/models/InstallerConfigForm.php als Konstante führt, erscheint nicht im Diff dieser Fassungen; sie ist nach dieser Beobachtung dieselbe wie im Ausgangsrelease.
Die Verschlüsselung der Antwort- und Teilnehmerdaten, wie sie application/helpers/encryption_helper.php bereitstellt, erscheint nicht im Diff; die Ver- und Entschlüsselung arbeitet nach dieser Beobachtung unverändert.
Der Diff enthält unterhalb von application/helpers/update/updates keine zweite neu angelegte Migrationsstufe; der Sprung der internen Datenbankversion beträgt nach dem Zitat unter A8 genau einen Schritt. Aussagen darüber, ob Spalten, Indizes oder Bedingungen anderer Tabellen unangetastet bleiben, lassen sich daraus nicht ableiten und sind nicht bestimmbar.
Empfehlung
Welche Kennungen für welche Zielgruppe gelten, steht im Lesepfad.
Administratoren
Vor dem Update: Sichere Datenbank, Konfigurationsverzeichnis und Uploadverzeichnis vollständig. Stelle zusammen, unter welchen Hostnamen die Installation erreichbar sein muss, einschließlich interner Namen hinter einem Proxy, und lege die Datei mit den erlaubten Hostnamen vorab selbst an, statt sie beim ersten Login erzeugen zu lassen (A1). Erhebe, welche Erweiterungen eigene Oberflächenteile im Adminbereich einhängen (A2) und welche eigenen Themes Kopien der Navigationsvorlagen mitbringen (A3).
Unmittelbar nach dem Update: Prüfe jeden vorgesehenen Hostnamen und die neue Anzeige in den globalen Sicherheitseinstellungen (A1). Kontrolliere Seitenleiste und Schnellmenü mit geöffneter Browserkonsole (A2) und durchlaufe eine mehrseitige Umfrage in jedem eigenen Theme (A4). Prüfe zuletzt die Themenauswahl auf den korrigierten Titel (A8).
Rollback: Ein Rückschritt auf 7.0.0 setzt die Anwendungsdateien zurück, entfernt aber nicht die neu angelegte Datei mit erlaubten Hostnamen; ob die ältere Fassung sie unbeachtet lässt oder auswertet, ist aus dem Diff heraus nicht bestimmbar und in einer Testumgebung zu prüfen. Im Zweifel benenne die Datei vor dem Rückschritt um (A1). Die Migration auf die neue Datenbankversion ist nach dem Zitat unter A8 rein wertebasiert und ohne Strukturänderung, sie verändert aber Titel und Beschreibung eines Fragethemas, und ein Zurücksetzen dieser Werte ist im Zitat nicht vorgesehen; die Datenbank-Versionsnummer selbst bleibt auf dem neuen Stand, sodass ein Rückschritt ohne Einspielen der Sicherung nicht ohne Weiteres möglich ist.
Plugin-Entwickler
Prüfe zuerst, ob dein Plugin im Adminbereich auf Vue aufsetzt oder die Anwendungskomponente des mitgelieferten Bootstrap-Forks aufruft; beides ist entfallen und erzeugt einen Laufzeitfehler (A2). Stelle danach eigene Vorlagenfunktionen um, die ein PHP-Sprachkonstrukt als Zielangabe hinterlegen, und verwende stattdessen eine eigene Hüllmethode (A3). Prüfe zuletzt eigene Oberflächenteile gegen die geänderte Struktur und die ersetzte Hilfsklasse der Verwaltungsansichten (A5) sowie die Registrierung eigener Skriptpakete gegen die geänderte Behandlung von Teilanfragen (siehe Weitere relevante Änderungen).
Theme-Entwickler
Prüfe zuerst eigene Umfragethemen mit Kopien der Navigationsvorlagen auf die Zustandsklassen der Fragenübersicht (A3). Stelle danach Navigationsschaltflächen, die als Verweis umgesetzt sind, auf Formularschaltflächen um (A4). Ersetze in eigenen Adminthemes die Bezüge auf die bisherige Hilfsklasse für nur akustisch ausgegebene Inhalte und prüfe Selektoren gegen die geänderte Struktur der Dialoge und Reiter (A5). Rechne beim Adminthema mit geändertem Markup und geänderten Stilvorlagen der Seitenleisten (A2); abgeleitete Umfragethemen können den neuen Editor jetzt nutzen und zeigen die Eckenradius-Symbole an (siehe Weitere relevante Änderungen).
Integratoren
Hinterlege für jede ausgelieferte Installation die erlaubten Hostnamen ausdrücklich, statt sie beim ersten Login erzeugen zu lassen, und berücksichtige dabei Proxy- und Testadressen (A1). Stelle danach Skripte um, die Umfragen über zusammengesetzte Adressen durchlaufen (A4), sowie Verarbeitungen, die den Namen hochgeladener Dateien selbst zusammensetzen (A7). Passe Auswertungen an, die Fragethemen anhand ihres Titeltextes auswählen (A8). Der Einladungs- und Erinnerungsversand über die Fernsteuerungsschnittstelle bleibt aufrufseitig unverändert (A6); auf Installationen, deren Webserver keine Verzeichniskonfigurationen auswertet, ist die Weitergabe des Autorisierungs-Headers eigenständig nachzuziehen (siehe Weitere relevante Änderungen).
API-Nutzer
Übernimm den abgelegten Dateinamen aus dem Rückgabewert des Uploads unverändert und setze ihn nicht mehr aus Zufallsteil und Endung zusammen; die Endung steht weiterhin in einem eigenen Rückgabefeld (A7). Am Einladungs- und Erinnerungsversand ist nichts anzupassen, die Absicherung wirkt serverseitig (A6). Rechne beim Abruf der Fragen-Eigenschaften mit einem Nullwert, wo bisher ein Fehler auftrat, und prüfe die Weitergabe des Autorisierungs-Headers auf der eigenen Serverkonfiguration (siehe Weitere relevante Änderungen).