Как я могу использовать HTMLPurifier для фильтрации xss, а также разрешить видеоизображение iramube iramube?
require_once 'htmlpurifier/library/HTMLPurifier.auto.php'; $config = HTMLPurifier_Config::createDefault(); $config->set('HTML.Trusted', true); $config->set('Filter.YouTube', true); $config->set('HTML.DefinitionID', '1'); $config->set('HTML.SafeObject', 'true'); $config->set('Output.FlashCompat', 'true'); $config->set('HTML.FlashAllowFullScreen', 'true'); $purifier = new HTMLPurifier($config); $temp = $purifier->purify($temp);
HTMLPurifier версии 4.4.0 имеет новые директивы конфигурации, позволяющие использовать итерации YouTube и Vimeo:
//allow iframes from trusted sources $cfg->set('HTML.SafeIframe', true); $cfg->set('URI.SafeIframeRegexp', '%^(https?:)?//(www\.youtube(?:-nocookie)?\.com/embed/|player\.vimeo\.com/video/)%'); //allow YouTube and Vimeo
Я просто прочитал эту запись в блоге и успешно создал и использовал настраиваемый фильтр. Я внесла некоторые изменения в код и добавил поддержку Vimeo:
/** * Based on: http://sachachua.com/blog/2011/08/drupal-html-purifier-embedding-iframes-youtube/ * Iframe filter that does some primitive whitelisting in a somewhat recognizable and tweakable way */ class HTMLPurifier_Filter_MyIframe extends HTMLPurifier_Filter { public $name = 'MyIframe'; /** * * @param string $html * @param HTMLPurifier_Config $config * @param HTMLPurifier_Context $context * @return string */ public function preFilter($html, HTMLPurifier_Config $config, HTMLPurifier_Context $context) { $html = preg_replace('#<iframe#i', '<img class="MyIframe"', $html); $html = preg_replace('#</iframe>#i', '</img>', $html); return $html; } /** * * @param string $html * @param HTMLPurifier_Config $config * @param HTMLPurifier_Context $context * @return string */ public function postFilter($html, HTMLPurifier_Config $config, HTMLPurifier_Context $context) { $post_regex = '#<img class="MyIframe"([^>]+?)>#'; return preg_replace_callback($post_regex, array($this, 'postFilterCallback'), $html); } /** * * @param array $matches * @return string */ protected function postFilterCallback($matches) { // Domain Whitelist $youTubeMatch = preg_match('#src="https?://www.youtube(-nocookie)?.com/#i', $matches[1]); $vimeoMatch = preg_match('#src="http://player.vimeo.com/#i', $matches[1]); if ($youTubeMatch || $vimeoMatch) { $extra = ' frameborder="0"'; if ($youTubeMatch) { $extra .= ' allowfullscreen'; } elseif ($vimeoMatch) { $extra .= ' webkitAllowFullScreen mozallowfullscreen allowFullScreen'; } return '<iframe ' . $matches[1] . $extra . '></iframe>'; } else { return ''; } } }
Добавление фильтра в конфигурацию фильтра HTML
$config->set('Filter.Custom', array(new HTMLPurifier_Filter_MyIframe()));
Это многое должно сделать трюк
$text = "<iframe width='560' height='315' src='//www.youtube.com/embed/RGLI7QBUitE?autoplay=1' frameborder='0' allowfullscreen></iframe>"; require_once 'htmlpurifier/library/HTMLPurifier.auto.php'; $config = HTMLPurifier_Config::createDefault(); $config->set('HTML.Trusted', true); $config->set('Filter.YouTube', true); echo $purifier->purify($text);
Для тех, кто борется (как включить iframe и allowfullscreen)
$config = \HTMLPurifier_Config::createDefault(); $config->set('HTML.SafeIframe', true); $config->set('URI.SafeIframeRegexp', '%^(https?:)?//(www\.youtube(?:-nocookie)?\.com/embed/|player\.vimeo\.com/video/)%'); //allow YouTube and Vimeo // This line is important allow iframe in allowed elements or it will not work $config->set('HTML.AllowedElements', array('iframe'));// <-- IMPORTANT $config->set('HTML.AllowedAttributes','iframe@src,iframe@allowfullscreen'); $def = $config->getHTMLDefinition(true); $def->addAttribute('iframe', 'allowfullscreen', 'Bool'); $purifier = new \HTMLPurifier($config); $purifiedHtml = $purifier->purify($html);
Избавьтесь от% HTML.Trusted,% Filter.YouTube и% HTML.DefinitionID. Вероятно, они плохо взаимодействуют с SafeObject / FlashCompat.
Используя drupal 7.19 и модуль htmlpurifier, вы можете настроить следующий параметр без необходимости писать этот код.
Также не забудьте установить
URI.DisableExternalResources: false
если вы уже установили его в true
.