From 4fdd47c5183e8f5beabfb7f92482ef416069e433 Mon Sep 17 00:00:00 2001 From: Dasun Tharanga Date: Fri, 29 Mar 2024 12:57:08 +0530 Subject: [PATCH 1/3] fix: Trim invisible characters --- src/Illuminate/Foundation/Http/Middleware/TrimStrings.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php b/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php index f5ad195b0325..1148d66dec5c 100644 --- a/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php +++ b/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php @@ -65,7 +65,7 @@ protected function transform($key, $value) return $value; } - return preg_replace('~^[\s\x{FEFF}\x{200B}]+|[\s\x{FEFF}\x{200B}]+$~u', '', $value) ?? trim($value); + return preg_replace('~^[\p{Cf}\x{FEFF}\x{200B}]+|[\p{Cf}\x{FEFF}\x{200B}]+$~u', '', $value) ?? trim($value); } /** From a5dfe2226ecf6dad035094a0be803e6e0947d8c4 Mon Sep 17 00:00:00 2001 From: Dasun Tharanga Date: Fri, 29 Mar 2024 13:32:55 +0530 Subject: [PATCH 2/3] test: Add test cases --- tests/Http/Middleware/TrimStringsTest.php | 90 +++++++++++++++++++++++ 1 file changed, 90 insertions(+) diff --git a/tests/Http/Middleware/TrimStringsTest.php b/tests/Http/Middleware/TrimStringsTest.php index 98302534b6a5..4fa0f3f623c7 100644 --- a/tests/Http/Middleware/TrimStringsTest.php +++ b/tests/Http/Middleware/TrimStringsTest.php @@ -132,4 +132,94 @@ public function test_combination_of_leading_and_trailing_zero_width_non_breakabl $this->assertEquals('This title contains a combination of zero-width non-breakable space and zero-width spaces characters at the beginning and the end', $req->title); }); } + + /** + * Test leading invisible character are trimmed [U+200E]. + */ + public function test_leading_invisible_characters_are_trimmed() + { + $request = new Request; + + $request->merge([ + 'title' => '‎This title contains a invisible character at the beginning', + ]); + + $middleware = new TrimStrings; + + $middleware->handle($request, function ($req) { + $this->assertEquals('This title contains a invisible character at the beginning', $req->title); + }); + } + + /** + * Test trailing invisible character are trimmed [U+200E]. + */ + public function test_trailing_invisible_characters_are_trimmed() + { + $request = new Request; + + $request->merge([ + 'title' => 'This title contains a invisible character at the end‎', + ]); + + $middleware = new TrimStrings; + + $middleware->handle($request, function ($req) { + $this->assertEquals('This title contains a invisible character at the end', $req->title); + }); + } + + /** + * Test leading multiple invisible character are trimmed [U+200E]. + */ + public function test_leading_multiple_invisible_characters_are_trimmed() + { + $request = new Request; + + $request->merge([ + 'title' => '‎‎This title contains a invisible character at the beginning', + ]); + + $middleware = new TrimStrings; + + $middleware->handle($request, function ($req) { + $this->assertEquals('This title contains a invisible character at the beginning', $req->title); + }); + } + + /** + * Test trailing multiple invisible character are trimmed [U+200E]. + */ + public function test_trailing_multiple_invisible_characters_are_trimmed() + { + $request = new Request; + + $request->merge([ + 'title' => 'This title contains a invisible character at the end‎‎', + ]); + + $middleware = new TrimStrings; + + $middleware->handle($request, function ($req) { + $this->assertEquals('This title contains a invisible character at the end', $req->title); + }); + } + + /** + * Test combination of leading and trailing multiple invisible characters are trimmed [U+200E]. + */ + public function test_combination_of_leading_and_trailing_multiple_invisible_characters_are_trimmed() + { + $request = new Request; + + $request->merge([ + 'title' => '‎‎This title contains a combination of a invisible character at beginning and the end‎‎', + ]); + + $middleware = new TrimStrings; + + $middleware->handle($request, function ($req) { + $this->assertEquals('This title contains a combination of a invisible character at beginning and the end', $req->title); + }); + } } From b1e58627df00fe52c3ac06bcaf8db70095394c25 Mon Sep 17 00:00:00 2001 From: Dasun Tharanga Date: Fri, 29 Mar 2024 14:44:42 +0530 Subject: [PATCH 3/3] fix: Regex pattern --- src/Illuminate/Foundation/Http/Middleware/TrimStrings.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php b/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php index 1148d66dec5c..0edc84376205 100644 --- a/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php +++ b/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php @@ -65,7 +65,7 @@ protected function transform($key, $value) return $value; } - return preg_replace('~^[\p{Cf}\x{FEFF}\x{200B}]+|[\p{Cf}\x{FEFF}\x{200B}]+$~u', '', $value) ?? trim($value); + return preg_replace('~^[\s\x{FEFF}\x{200B}\x{200E}]+|[\s\x{FEFF}\x{200B}\x{200E}]+$~u', '', $value) ?? trim($value); } /**