diff --git a/CHANGELOG.md b/CHANGELOG.md
index 3de326de..a29f2733 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,6 @@
## Changelog
+* 5.2.5 - 2026-03-30 - Added escaping for report_matched value
* 5.2.4 - 2026-03-02 - Updated API documentation
* 5.2.3 - 2026-02-05 - Alerts now get deleted when a user's site access is revoked
* 5.2.2 - 2026-01-19 - Added tooltips in add/edit alerts, manage alerts & in the inline text for the delivery method
diff --git a/plugin.json b/plugin.json
index 56505926..bcc9ad87 100644
--- a/plugin.json
+++ b/plugin.json
@@ -1,7 +1,7 @@
{
"name": "CustomAlerts",
"description": "Create custom Alerts to be notified of important changes on your website or app! ",
- "version": "5.2.4",
+ "version": "5.2.5",
"require": {
"matomo": ">=5.0.0-b1,<6.0.0-b1"
},
diff --git a/templates/htmlTriggeredAlerts.twig b/templates/htmlTriggeredAlerts.twig
index b63a8d63..9152e659 100755
--- a/templates/htmlTriggeredAlerts.twig
+++ b/templates/htmlTriggeredAlerts.twig
@@ -29,7 +29,7 @@
{% endif %}
{{ alert.reportName|default(alert.report)|rawSafeDecoded }} |
{% if hasConditions %}
- {{ alert.dimension|default('') }} {{ alert.reportConditionName }} {% if alert.report_matched %}'{{ alert.report_matched|truncate(100)|raw }}'{% endif %} |
+ {{ alert.dimension|default('') }} {{ alert.reportConditionName }} {% if alert.report_matched %}'{{ alert.report_matched|truncate(100)|rawSafeDecoded }}'{% endif %} |
{% endif %}
{{ alert.reportMetric }} {{ alertsMacro.metricChangeDescription(alert) }} |
diff --git a/tests/Integration/ControllerTest.php b/tests/Integration/ControllerTest.php
index b4409d0d..9c50e633 100644
--- a/tests/Integration/ControllerTest.php
+++ b/tests/Integration/ControllerTest.php
@@ -228,6 +228,20 @@ public function test_formatAlertsNoConditions_asHtml()
$this->assertEquals($expected, $rendered, "Got following HTML response: " . var_export($rendered, true));
}
+ public function test_formatAlerts_asHtml_shouldEscapeReportMatched()
+ {
+ $payload = '
';
+ $alerts = array(
+ $this->buildAlert(1, 'MyName1', 'week', 1, 'Piwik test', 'superUserLogin', 'nb_visits', 'decrease_more_than', 5000, 'MultiSites_getOne', 'matches_exactly', $payload)
+ );
+
+ $rendered = $this->controller->formatAlerts($alerts, 'html');
+
+ $this->assertStringContainsString("Website is '<img src=x onerror=alert(1)>'", $rendered);
+ $this->assertStringNotContainsString("'{$payload}'", $rendered);
+ $this->assertStringNotContainsString("
", $rendered);
+ }
+
public function test_enrichTriggeredAlerts_shouldEnrichAlerts_IfReportExistsAndMetricIsValid()
{
$timestamp = 1389824417;