From 1100712c9bd1221263f3e6535cfabb80353dcad5 Mon Sep 17 00:00:00 2001 From: Ollama Date: Wed, 3 Jun 2026 20:50:15 +0200 Subject: [PATCH] fix(security): Escape email addresses in mailto() to prevent XSS Email columns in bootstrap tables had escaping disabled (line 52) and mailto() function doesn't escape its parameters. This fix escapes email addresses before passing to mailto() in: - get_person_data_row() (employees) - get_customer_data_row() (customers) - get_supplier_data_row() (suppliers) Attack vector: Malicious email via CSV import renders XSS in table view. --- app/Helpers/tabular_helper.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/Helpers/tabular_helper.php b/app/Helpers/tabular_helper.php index d1b3b9281..7c6e2c927 100644 --- a/app/Helpers/tabular_helper.php +++ b/app/Helpers/tabular_helper.php @@ -226,7 +226,7 @@ function get_person_data_row(object $person): array 'people.person_id' => $person->person_id, 'last_name' => $person->last_name, 'first_name' => $person->first_name, - 'email' => empty($person->email) ? '' : mailto($person->email, $person->email), + 'email' => empty($person->email) ? '' : mailto(esc($person->email), esc($person->email)), 'phone_number' => $person->phone_number, 'messages' => empty($person->phone_number) ? '' @@ -292,7 +292,7 @@ function get_customer_data_row(object $person, object $stats): array 'people.person_id' => $person->person_id, 'last_name' => $person->last_name, 'first_name' => $person->first_name, - 'email' => empty($person->email) ? '' : mailto($person->email, $person->email), + 'email' => empty($person->email) ? '' : mailto(esc($person->email), esc($person->email)), 'phone_number' => $person->phone_number, 'total' => to_currency($stats->total), 'messages' => empty($person->phone_number) @@ -363,7 +363,7 @@ function get_supplier_data_row(object $supplier): array 'category' => $supplier->category, 'last_name' => $supplier->last_name, 'first_name' => $supplier->first_name, - 'email' => empty($supplier->email) ? '' : mailto($supplier->email, $supplier->email), + 'email' => empty($supplier->email) ? '' : mailto(esc($supplier->email), esc($supplier->email)), 'phone_number' => $supplier->phone_number, 'messages' => empty($supplier->phone_number) ? ''