HTMLPurifier iframe Vimeo и Youtube видео

Как я могу использовать 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, вы можете настроить следующий параметр без необходимости писать этот код.

См. http://drupal.org/node/711728#comment-5600344

Также не забудьте установить

 URI.DisableExternalResources: false 

если вы уже установили его в true .