HTMLPurifier iframe Vimeo e Youtube video

Como posso usar HTMLPurifier para filtrar xss, mas também para permitir o iframe Vimeo e Youtube de vídeo?

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); 

O HTMLPurifier versão 4.4.0 possui novas diretivas de configuração para permitir o YouTube e os iframes 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 

Acabei de ler esta input de blog e criei com sucesso e usei o filtro personalizado. Eu fiz algumas alterações ao código e adicionei o suporte do 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('##i', '', $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 = '#]+?)>#'; 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 ''; } else { return ''; } } } 

Adicionando o filtro à configuração do purificador HTML

 $config->set('Filter.Custom', array(new HTMLPurifier_Filter_MyIframe())); 

Isso deve fazer o truque

 $text = ""; 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); 

Para quem está lutando (como habilitar iframe e 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); 

Livrar-se do% HTML.Trusted,% Filter.YouTube e% HTML.DefinitionID. Eles provavelmente estão interagindo mal com o SafeObject / FlashCompat.

Usando o drupal 7.19 e o módulo htmlpurifier, você pode configurar a seguinte configuração sem precisar escrever esse código.

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

Também não se esqueça de configurar

 URI.DisableExternalResources: false 

se você configurou isso como true antes.