diff --git a/src/Chamilo/CoreBundle/Component/HTMLPurifier/Filter/RemoveOnAttributes.php b/src/Chamilo/CoreBundle/Component/HTMLPurifier/Filter/RemoveOnAttributes.php index 3447b5f39e5..7a7ef925ee5 100644 --- a/src/Chamilo/CoreBundle/Component/HTMLPurifier/Filter/RemoveOnAttributes.php +++ b/src/Chamilo/CoreBundle/Component/HTMLPurifier/Filter/RemoveOnAttributes.php @@ -17,10 +17,16 @@ public function preFilter($html, $config, $context) public static function filter($html) { - // Strip null bytes before regex matching to prevent bypass via on\x00load patterns + // Strip null bytes before regex matching to prevent bypass via on\x00load patterns. $html = str_replace("\0", '', $html); - $pattern = '/\s+on\w+\s*=\s*(?:"[^"]*"|\'[^\']*\'|[^\s>]+)/i'; + $pattern = '/(?:=\s*(?:"[^"]*"|\'[^\']*\'|[^\s>]+))(*SKIP)(*F)|(?:\s+|\/+|(?<=["\']))on\w+\s*=\s*(?:"[^"]*"|\'[^\']*\'|[^\s>]+)/i'; - return preg_replace($pattern, '', $html); + return preg_replace_callback( + '/<(?:[^>"\']+|"[^"]*"|\'[^\']*\')*>/s', + function ($matches) use ($pattern) { + return preg_replace($pattern, '', $matches[0]); + }, + $html + ); } }