From 23c8ed79dd7c65bca75f984646522f01fbec467b Mon Sep 17 00:00:00 2001 From: Michael M Slusarz Date: Mon, 3 May 2010 23:04:25 -0600 Subject: [PATCH] Bug #8715: Handle multiple data declarations per tag. --- .../Text_Filter/lib/Horde/Text/Filter/Xss.php | 23 +++++++++++++--------- .../test/Horde/Text/Filter/fixtures/xss95.html | 1 + .../Text_Filter/test/Horde/Text/Filter/xss.phpt | 2 ++ 3 files changed, 17 insertions(+), 9 deletions(-) create mode 100644 framework/Text_Filter/test/Horde/Text/Filter/fixtures/xss95.html diff --git a/framework/Text_Filter/lib/Horde/Text/Filter/Xss.php b/framework/Text_Filter/lib/Horde/Text/Filter/Xss.php index 9242ecfa1..7c71ad1ad 100644 --- a/framework/Text_Filter/lib/Horde/Text/Filter/Xss.php +++ b/framework/Text_Filter/lib/Horde/Text/Filter/Xss.php @@ -214,15 +214,6 @@ class Horde_Text_Filter_Xss extends Horde_Text_Filter_Base $patterns[$pattern] = '<$1' . $this->_params['replace'] . '_tag'; } - /* Strip out data URLs living in an A HREF element (Bug #8715). */ - $malicious = '/<((?:a|�*65;?|�*41;?|�*97;?|�*61;?)\b[^>]+?)' . - '(?:h|�*72;?|�*48;?|�*104;?|�*68;?)\s*' . - '(?:r|�*82;?|�*52;?|�*114;?|�*72;?)\s*' . - '(?:e|�*69;?|�*45;?|�*101;?|�*65;?)\s*' . - '(?:f|�*70;?|�*46;?|�*102;?|�*66;?)\s*=' . - '("|\')?\s*data:(?(2)[^"\')>]*|[^\s)>]*)(?(2)\\2)/is'; - $patterns[$malicious] = '<$1'; - /* Comment out style/link tags. */ if ($this->_params['strip_styles']) { if ($this->_params['strip_style_attributes']) { @@ -290,6 +281,20 @@ class Horde_Text_Filter_Xss extends Horde_Text_Filter_Base */ public function postProcess($text) { + /* Strip out data URLs living in an A HREF element (Bug #8715). + * Done here because we need to match more than 1 possible data + * entry per tag. */ + $data_from = '/<((?:a|�*65;?|�*41;?|�*97;?|�*61;?)\b[^>]+?)' . + '(?:h|�*72;?|�*48;?|�*104;?|�*68;?)\s*' . + '(?:r|�*82;?|�*52;?|�*114;?|�*72;?)\s*' . + '(?:e|�*69;?|�*45;?|�*101;?|�*65;?)\s*' . + '(?:f|�*70;?|�*46;?|�*102;?|�*66;?)\s*=' . + '("|\')?\s*data:(?(2)[^"\')>]*|[^\s)>]*)(?(2)\\2)/is'; + $data_to = '<$1'; + do { + $text = preg_replace($data_from, $data_to, $text, -1, $count); + } while ($count); + ini_restore('pcre.backtrack_limit'); // Restore CDATA data diff --git a/framework/Text_Filter/test/Horde/Text/Filter/fixtures/xss95.html b/framework/Text_Filter/test/Horde/Text/Filter/fixtures/xss95.html new file mode 100644 index 000000000..b7aa7abec --- /dev/null +++ b/framework/Text_Filter/test/Horde/Text/Filter/fixtures/xss95.html @@ -0,0 +1 @@ +Click me diff --git a/framework/Text_Filter/test/Horde/Text/Filter/xss.phpt b/framework/Text_Filter/test/Horde/Text/Filter/xss.phpt index b44afaa7e..c63ec0db8 100644 --- a/framework/Text_Filter/test/Horde/Text/Filter/xss.phpt +++ b/framework/Text_Filter/test/Horde/Text/Filter/xss.phpt @@ -222,6 +222,8 @@ xss84.html xss85.html PT SRC="http://ha.ckers.org/a.js"> +xss95.html +Click me xss96.html Click me xss97.html -- 2.11.0