diff options
author | Andrey Andreev <narf@devilix.net> | 2014-03-18 17:44:53 +0100 |
---|---|---|
committer | Andrey Andreev <narf@devilix.net> | 2014-03-18 17:44:53 +0100 |
commit | e7a2aa09df05547211776bf493adb6da476f3858 (patch) | |
tree | 84f104c1e2079a22fb5409a517986ae44d4ee4f3 | |
parent | 1394304472f1c917b8f6680c57bf50c780744f2d (diff) |
xss_clean() improvement
Fixes this: https://github.com/EllisLab/CodeIgniter/issues/2667#issuecomment-37819186
-rw-r--r-- | system/core/Security.php | 8 | ||||
-rw-r--r-- | tests/codeigniter/core/Security_test.php | 6 |
2 files changed, 10 insertions, 4 deletions
diff --git a/system/core/Security.php b/system/core/Security.php index faa52d746..1dfea18f8 100644 --- a/system/core/Security.php +++ b/system/core/Security.php @@ -578,13 +578,13 @@ class CI_Security { do { - $m1 = $m2 = 0; + $str_compare = $str; - $str = preg_replace('/(�*[0-9a-f]{2,5})(?![0-9a-f;])/iS', '$1;', $str, -1, $m1); - $str = preg_replace('/(&#\d{2,4})(?![0-9;])/S', '$1;', $str, -1, $m2); + $str = preg_replace('/(�*[0-9a-f]{2,5})(?![0-9a-f;])/iS', '$1;', $str); + $str = preg_replace('/(&#\d{2,4})(?![0-9;])/S', '$1;', $str); $str = html_entity_decode($str, ENT_COMPAT, $charset); } - while ($m1 OR $m2); + while ($str_compare !== $str); return $str; } diff --git a/tests/codeigniter/core/Security_test.php b/tests/codeigniter/core/Security_test.php index 433ad313f..14e042ee2 100644 --- a/tests/codeigniter/core/Security_test.php +++ b/tests/codeigniter/core/Security_test.php @@ -71,6 +71,12 @@ class Security_test extends CI_TestCase { $this->assertEquals("Hello, i try to [removed]alert('Hack');[removed] your site", $harmless_string); } + public function test_xss_clean_entity_double_encoded() + { + $input = '<a href="&#106&#97&#118&#97&#115&#99&#114&#105&#112&#116&#58&#99&#111&#110&#102&#105&#114&#109&#40&#49&#41">Clickhere</a>'; + $this->assertEquals('<a 1>Clickhere</a>', $this->security->xss_clean($input)); + } + // -------------------------------------------------------------------- public function test_xss_hash() |