2011-01-19 11 views
11

Come posso utilizzare HTMLPurifier per filtrare xss ma anche per consentire iframe Vimeo e Youtube video?HTML Purificatore ifime Vimeo e Youtube video

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

risposta

0

Sbarazzarsi del% HTML.Trusted,% Filter.YouTube e% HTML.DefinitionID. Probabilmente stanno interagendo male con SafeObject/FlashCompat.

+0

iframe ancora bloccata in ogni caso, non Metter. Conoscete altre buone soluzioni ma con supporto iframe? – swamprunner7

+0

Oh sì, dovrai aggiungere il supporto Iframe separatamente. Ecco un possibile modo per farlo: http://htmlpurifier.org/phorum/read.php?3,4646,4646#msg-4646 E ovviamente speriamo di (eventualmente) aggiungere il supporto per farlo correttamente nel nucleo . –

+0

Ho provato questa soluzione, ma ho un problema, qui il mio ultimo commento http://stackoverflow.com/questions/4135755/how-do-i-allow-script-object-param-embed-and-iframe-tags-in -htmlpurifier – swamprunner7

8

Ho appena letto this blog entry e ho creato e utilizzato correttamente il filtro personalizzato. Ho fatto alcune modifiche al codice e aggiunto il supporto 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 ''; 
     } 
    } 
} 

aggiunta del filtro per il vostro purificatore di configurazione HTML

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

ha funzionato alla grande, grazie. – applechief

+1

all'inizio non ho lavorato per me. ma poi ho permesso img (perché il filtro usa il tag img per fare la magia) e ha funzionato! $ config-> set ('HTML.Allowed', 'p, a [href | rel | target], img [class | src | height | width]'); –

28

HTMLPurifier versione 4.4.0 ha nuove direttive di configurazione per consentire YouTube e Vimeo iframe:

//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 
+0

Conserva l'attributo 'allowfullscreen' per YouTube e gli attributi' webkitAllowFullScreen', 'mozallowfullscreen' e' allowFullScreen' per Vimeo? – Sonny

+1

No, ma nei miei test non ha avuto alcun effetto sul player Flash o HTML5. Schermo intero funzionava a prescindere da cosa. Inoltre, non è nelle specifiche, quindi è probabilmente sicuro da ignorare. Vedi http://htmlpurifier.org/docs/enduser-customize.html#addAttribute per l'aggiunta di attributi personalizzati. – Malte

+0

Ho appena provato questo, ottengo un iframe vuoto con così "src" –

2

Questo tanto dovrebbe fare il trucco

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

Inoltre, non dimenticare di impostare

URI.DisableExternalResources: false 

se hai impostato a true prima.

1

Per chi sta lottando (come abilitare 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','[email protected],[email protected]'); 

    $def = $config->getHTMLDefinition(true); 
    $def->addAttribute('iframe', 'allowfullscreen', 'Bool'); 

    $purifier = new \HTMLPurifier($config); 
    $purifiedHtml = $purifier->purify($html);