【问题标题】:HTMLPurifier iframe Vimeo and Youtube videoHTMLPurifier iframe Vimeo 和 Youtube 视频
【发布时间】:2011-06-11 23:25:56
【问题描述】:

如何使用 HTMLPurifier 过滤 xss 以及允许 iframe Vimeo 和 Youtube 视频?

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

【问题讨论】:

    标签: php video iframe xss htmlpurifier


    【解决方案1】:

    根据混响的回答,我意识到出于某种原因

    $def->addAttribute('iframe', 'allowfullscreen', 'Bool');
    

    没有正常工作,而不是

    allowfullscreen="allowfullscreen"
    

    HTMLPurifier 正在输出

    allowfullscreen=""
    

    虽然documentation 表示Bool - Boolean attribute, with only one valid value: the name of the attribute,但我尝试改用Enum

    $def->addAttribute('iframe', 'allowfullscreen', 'Enum#allowfullscreen');
    

    第三个参数意味着allowfullscreen属性只有正确的值——allowfullscreen,其他的都将被忽略。这样我们就有了与Bool 相同的行为。幸运的是,它对我有用。

    也许这个解决方案会对某人有所帮助。

    【讨论】:

      【解决方案2】:

      对于任何正在苦苦挣扎的人(如何启用 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);
      

      【讨论】:

      • 谢谢,尝试了所有可能的解决方案,但您的回答解决了它!谢谢一百万!
      • 你的答案解决了,但宽度、高度元素被删除了
      • @VikasChauhan 第 6 行
      • 它有效,但是当我将 iframe 设置为 bool 时它不起作用,因为在 youtube 嵌入代码中 - allowfullscreen="" 属性不起作用。但是我改变了那行 - $def->addAttribute('iframe', 'allowfullscreen', 'Bool');到 $def->addAttribute('iframe', 'allowfullscreen', 'Text');终于为我工作了......
      • @sumeet 如何同时允许 Facebook 视频 iframe
      【解决方案3】:

      也别忘了设置

      URI.DisableExternalResources: false
      

      如果您之前已将其设置为 true

      【讨论】:

        【解决方案4】:

        这么多应该可以解决问题

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

        【讨论】:

        • 刚刚添加的行 > $config->set('Filter.YouTube', true);它对我有用。谢谢:-)
        【解决方案5】:

        HTMLPurifier 4.4.0 版具有允许 YouTube 和 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
        

        【讨论】:

        • 它是否保留 YouTube 的 allowfullscreen 属性和 Vimeo 的 webkitAllowFullScreenmozallowfullscreenallowFullScreen 属性?
        • 否,但在我的测试中,它对 Flash 或 HTML5 播放器都没有影响。无论如何,全屏工作。另外,它不在规格中,所以忽略它可能是安全的。有关添加自定义属性,请参阅 htmlpurifier.org/docs/enduser-customize.html#addAttribute
        • @Malte 如何也允许 Facebook 视频 iframe
        • @PanagiotisKoursaris 将其添加到正则表达式中,就像 %^(https?:)?//(www\.youtube(?:-nocookie)?\.com/embed/|player\.vimeo\.com/video/|www\.facebook\.com/plugins/video.php\?)%
        【解决方案6】:

        使用 drupal 7.19 和 htmlpurifier 模块,您可以配置以下设置,而无需编写此代码。

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

        【讨论】:

          【解决方案7】:

          我刚刚阅读了this blog entry,并成功创建并使用了自定义过滤器。我对代码进行了一些更改并添加了 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 Purifier 配置中

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

          【讨论】:

          • 一开始我并没有为我工作。但后来我允许 img (因为过滤器使用 img 标签来做魔术)并且工作! $config->set('HTML.Allowed', 'p,a[href|rel|target],img[class|src|height|width]');
          【解决方案8】:

          摆脱 %HTML.Trusted、%Filter.YouTube 和 %HTML.DefinitionID。它们可能与 SafeObject/FlashCompat 交互不佳。

          【讨论】:

          • iframe 仍然被阻止,没关系。你知道其他好的解决方案但支持 iframe 吗?
          • 哦,是的,您必须单独添加 Iframe 支持。这是一种可能的方法:htmlpurifier.org/phorum/read.php?3,4646,4646#msg-4646 当然,我们希望(最终)在核心中适当地添加对它的支持。
          • 我试过这个解决方案,但我有问题,这是我的最后一条评论stackoverflow.com/questions/4135755/…
          • 为什么 youtube 切换到 iframe?为什么? /绝望的哭泣
          • @ElYobo 因为 HTML5 视频
          猜你喜欢
          • 1970-01-01
          • 2016-02-14
          • 2014-04-04
          • 1970-01-01
          • 2014-11-20
          • 2021-05-01
          • 2015-07-05
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多