Skip to content

Commit 3fa20d7

Browse files
authored
Security fixes / Preview fix (#455)
* security fixes and theme preview * securit fix replace * Update CHANGELOG.md * 5.3.3 * namespace guide entfernt
1 parent 633d834 commit 3fa20d7

File tree

5 files changed

+21
-118
lines changed

5 files changed

+21
-118
lines changed

CHANGELOG.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,15 @@
11
# REDAXO consent_manager - Changelog
22

3+
## Version 5.3.3 - 29.01.2026
4+
5+
- **Fix:** JSON Parsing Fehler im Frontend behoben (`double-escaping` von HTML-Attributen entfernt), was zu Fehlern beim Laden der Cookie-Gruppen führte (`safeJSONParse failed`).
6+
7+
- **Fix:** Fehler beim Laden von Framework-Templates behoben (`Call to undefined method rex_fragment::subparse()`).
8+
- **Security:** XSS-Schwachstelle in `consent_manager_outputjs` behoben (Input-Sanitizing für `cid` und `v` Parameter).
9+
- **Security:** Schutz vor Host-Header Injection im Frontend-Output.
10+
- **Fix:** JavaScript Syntax-Fehler durch verbessertes Template-Escaping behoben (`json_encode` statt string replace).
11+
- **Fix:** Google Consent Mode v2 Script auf ES5 Syntax aktualisiert (SyntaxError Fix für ältere Umgebungen).
12+
313
## Version 5.3.0 - 28.01.2026
414

515
**🚀 Release-Highlights:**

Namespace-Guide.md

Lines changed: 0 additions & 100 deletions
This file was deleted.

assets/consent_cookie_helper.js

Whitespace-only changes.

fragments/ConsentManager/box.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
// Check for CSS Framework Mode
2323
$cssFrameworkMode = rex_addon::get('consent_manager')->getConfig('css_framework_mode');
2424
if ($cssFrameworkMode) {
25-
echo $this->subparse('ConsentManager/box_' . $cssFrameworkMode . '.php');
25+
echo $this->parse('ConsentManager/box_' . $cssFrameworkMode . '.php');
2626
return;
2727
}
2828

lib/Frontend.php

Lines changed: 10 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -259,17 +259,20 @@ public function outputJavascript(): never
259259
/** @phpstan-ignore-next-line */
260260
$boxtemplate = sprogdown($boxtemplate, $clang);
261261
}
262-
$boxtemplate = str_replace("'", "\\'", $boxtemplate);
263262
$boxtemplate = str_replace("\r", '', $boxtemplate);
264263
$boxtemplate = str_replace("\n", ' ', $boxtemplate);
265264

266265
echo '/* --- Parameters --- */' . PHP_EOL;
266+
// Sanitize input parameters to prevent XSS
267+
$cacheLogId = preg_replace('/[^a-zA-Z0-9_\-]/', '', rex_request::get('cid', 'string', ''));
268+
$version = preg_replace('/[^0-9.]/', '', rex_request::get('v', 'string', ''));
269+
267270
$consent_manager_parameters = [
268271
'initially_hidden' => 'true' === rex_request::get('i', 'string', 'false'),
269272
'domain' => Utility::hostname(),
270273
'consentid' => uniqid('', true),
271-
'cachelogid' => rex_request::get('cid', 'string', ''),
272-
'version' => rex_request::get('v', 'string', ''),
274+
'cachelogid' => $cacheLogId,
275+
'version' => $version,
273276
'fe_controller' => rex_url::frontend(),
274277
'forcereload' => rex_request::get('r', 'int', 0),
275278
'hidebodyscrollbar' => 'true' === rex_request::get('h', 'string', 'false'),
@@ -278,12 +281,9 @@ public function outputJavascript(): never
278281
'cookieSecure' => (bool) $addon->getConfig('cookie_secure', false),
279282
'cookieName' => $addon->getConfig('cookie_name', 'consentmanager'),
280283
];
281-
echo 'var consent_manager_parameters = ' . json_encode($consent_manager_parameters, JSON_UNESCAPED_SLASHES) . ';' . PHP_EOL . PHP_EOL;
284+
echo 'var consent_manager_parameters = ' . json_encode($consent_manager_parameters, JSON_UNESCAPED_SLASHES | JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_AMP | JSON_HEX_QUOT) . ';' . PHP_EOL . PHP_EOL;
282285
echo '/* --- Consent-Manager Box Template lang=' . $clang . ' --- */' . PHP_EOL;
283-
echo 'var consent_manager_box_template = \'';
284-
// REXSTAN: meldet «Binary operation "." between array<string>|string and '\';' results in an error.»
285-
// Das ist definitiv falsch und eine Fehlinterpretation wegen obigem «$boxtemplate = str_replace(...»
286-
echo $boxtemplate . '\';' . PHP_EOL . PHP_EOL;
286+
echo 'var consent_manager_box_template = ' . json_encode($boxtemplate, JSON_UNESCAPED_SLASHES | JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_AMP | JSON_HEX_QUOT) . ';' . PHP_EOL . PHP_EOL;
287287

288288
$lifespan = $addon->getConfig('lifespan', 365);
289289
if ('' === $lifespan) {
@@ -454,11 +454,6 @@ public static function getJS(): string
454454
$boxtemplate = is_string($sprogResult) ? $sprogResult : $boxtemplate;
455455
}
456456

457-
// Escape for JavaScript
458-
$boxtemplate = str_replace("'", "\\'", $boxtemplate);
459-
$boxtemplate = str_replace("\r", '', $boxtemplate);
460-
$boxtemplate = str_replace("\n", ' ', $boxtemplate);
461-
462457
$output = '';
463458

464459
// Parameters
@@ -477,13 +472,11 @@ public static function getJS(): string
477472
'cookieSecure' => (bool) $addon->getConfig('cookie_secure', false),
478473
'cookieName' => $addon->getConfig('cookie_name', 'consentmanager'),
479474
];
480-
$output .= 'var consent_manager_parameters = ' . json_encode($consent_manager_parameters, JSON_UNESCAPED_SLASHES) . ';' . PHP_EOL . PHP_EOL;
475+
$output .= 'var consent_manager_parameters = ' . json_encode($consent_manager_parameters, JSON_UNESCAPED_SLASHES | JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_AMP | JSON_HEX_QUOT) . ';' . PHP_EOL . PHP_EOL;
481476

482477
// Box template
483478
$output .= '/* --- Consent-Manager Box Template lang=' . $clang . ' --- */' . PHP_EOL;
484-
$output .= 'var consent_manager_box_template = \'';
485-
// $boxtemplate is guaranteed to be string after above checks
486-
$output .= $boxtemplate . '\';' . PHP_EOL . PHP_EOL;
479+
$output .= 'var consent_manager_box_template = ' . json_encode($boxtemplate, JSON_UNESCAPED_SLASHES | JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_AMP | JSON_HEX_QUOT) . ';' . PHP_EOL . PHP_EOL;
487480

488481
// Cookie expiration
489482
$lifespan = $addon->getConfig('lifespan', 365);

0 commit comments

Comments
 (0)