diff --git a/cache/htmlpurifier/.empty b/cache/htmlpurifier/.empty new file mode 100644 index 000000000..e69de29bb diff --git a/debian/tt-rss-common.postinst b/debian/tt-rss-common.postinst index d12631f3c..9c18ebd0b 100644 --- a/debian/tt-rss-common.postinst +++ b/debian/tt-rss-common.postinst @@ -21,6 +21,10 @@ case "$1" in install -d -m775 -gwww-data /var/lock/tt-rss fi + if [ ! -d /var/cache/tt-rss/htmlpurifier ]; then + install -d -m775 -gwww-data /var/cache/tt-rss/htmlpurifier + fi + if [ ! -d /var/cache/tt-rss/magpie ]; then install -d -m775 -gwww-data /var/cache/tt-rss/magpie fi diff --git a/include/functions.php b/include/functions.php index 918192cd3..5eb5b97af 100644 --- a/include/functions.php +++ b/include/functions.php @@ -100,6 +100,8 @@ require_once 'lib/pubsubhubbub/publisher.php'; + $purifier = false; + $tz_offset = -1; $utc_tz = new DateTimeZone('UTC'); $schema_version = false; @@ -2632,17 +2634,36 @@ } function sanitize($link, $str, $force_strip_tags = false, $owner = false, $site_url = false) { + global $purifier; + if (!$owner) $owner = $_SESSION["uid"]; $res = trim($str); if (!$res) return ''; - // TODO implement better HTML tag stripping and XSS protection + // create global Purifier object if needed + if (!$purifier) { + require_once 'lib/htmlpurifier/library/HTMLPurifier.auto.php'; - if (function_exists('filter_var')) { - $res = filter_var($res, FILTER_SANITIZE_STRING); + $config = HTMLPurifier_Config::createDefault(); + + $allowed = "p,a[href],i,em,b,strong,code,pre,blockquote,br,img[src|alt|title|align|hspace],ul,ol,li,h1,h2,h3,h4,s,object[classid|type|id|name|width|height|codebase],param[name|value],table,tr,td,span[class]"; + + $config->set('HTML.SafeObject', true); + @$config->set('HTML', 'Allowed', $allowed); + $config->set('Output.FlashCompat', true); + $config->set('Attr.EnableID', true); + if (!defined('MOBILE_VERSION')) { + @$config->set('Cache', 'SerializerPath', CACHE_DIR . "/htmlpurifier"); + } else { + @$config->set('Cache', 'SerializerPath', "../" . CACHE_DIR . "/htmlpurifier"); + } + + $config->set('Filter.YouTube', true); + + $purifier = new HTMLPurifier($config); } - $res = strip_tags($str, "