From ed23b97baf71cc179738f3d9b6d96838a21c00ea Mon Sep 17 00:00:00 2001 From: Andrew Nester Date: Sat, 16 Jan 2016 09:37:36 +0300 Subject: [PATCH] #10574 - Fix for BaseArrayHelper to work with invalid characters in proper way --- framework/helpers/BaseArrayHelper.php | 6 +++--- tests/framework/helpers/ArrayHelperTest.php | 9 ++++++--- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/framework/helpers/BaseArrayHelper.php b/framework/helpers/BaseArrayHelper.php index b866679949..c79b4412ad 100644 --- a/framework/helpers/BaseArrayHelper.php +++ b/framework/helpers/BaseArrayHelper.php @@ -467,15 +467,15 @@ class BaseArrayHelper public static function htmlEncode($data, $valuesOnly = true, $charset = null) { if ($charset === null) { - $charset = Yii::$app->charset; + $charset = Yii::$app ? Yii::$app->charset : 'UTF-8'; } $d = []; foreach ($data as $key => $value) { if (!$valuesOnly && is_string($key)) { - $key = htmlspecialchars($key, ENT_QUOTES, $charset); + $key = htmlspecialchars($key, ENT_QUOTES | ENT_SUBSTITUTE, $charset); } if (is_string($value)) { - $d[$key] = htmlspecialchars($value, ENT_QUOTES, $charset); + $d[$key] = htmlspecialchars($value, ENT_QUOTES | ENT_SUBSTITUTE, $charset); } elseif (is_array($value)) { $d[$key] = static::htmlEncode($value, $valuesOnly, $charset); } else { diff --git a/tests/framework/helpers/ArrayHelperTest.php b/tests/framework/helpers/ArrayHelperTest.php index ed2de00104..fcc3452d1f 100644 --- a/tests/framework/helpers/ArrayHelperTest.php +++ b/tests/framework/helpers/ArrayHelperTest.php @@ -443,7 +443,8 @@ class ArrayHelperTest extends TestCase [ '<>' => 'a<>b', '23' => true, - ] + ], + 'invalid' => "a\x80b", ]; $this->assertEquals([ 'abc' => '123', @@ -453,7 +454,8 @@ class ArrayHelperTest extends TestCase [ '<>' => 'a<>b', '23' => true, - ] + ], + 'invalid' => 'a�b', ], ArrayHelper::htmlEncode($array)); $this->assertEquals([ 'abc' => '123', @@ -463,7 +465,8 @@ class ArrayHelperTest extends TestCase [ '<>' => 'a<>b', '23' => true, - ] + ], + 'invalid' => 'a�b', ], ArrayHelper::htmlEncode($array, false)); }