Видео HTMLPurifier iframe Vimeo и Youtube

Как я могу использовать 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);

person swamprunner7    schedule 19.01.2011    source источник


Ответы (8)


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
person Malte    schedule 08.10.2012
comment
Сохраняет ли он атрибут allowfullscreen для YouTube и атрибуты webkitAllowFullScreen, mozallowfullscreen и allowFullScreen для Vimeo? - person Sonny; 30.10.2012
comment
Нет, но в моих тестах это не повлияло ни на Flash, ни на HTML5-плеер. Полноэкранный режим работал несмотря ни на что. Кроме того, его нет в спецификациях, поэтому, вероятно, его можно игнорировать. Чтобы добавить пользовательские атрибуты. - person Malte; 30.10.2012
comment
@Malte Как также разрешить iframe для видео в Facebook - person Panagiotis Koursaris; 24.08.2019
comment
@PanagiotisKoursaris добавьте его в регулярное выражение вот так %^(https?:)?//(www\.youtube(?:-nocookie)?\.com/embed/|player\.vimeo\.com/video/|www\.facebook\.com/plugins/video.php\?)% - person Malte; 02.10.2019

Я только что прочитал эту запись в блоге и успешно создан и использован пользовательский фильтр. Я внес некоторые изменения в код и добавил поддержку 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()));
person Sonny    schedule 20.12.2011
comment
я не работал для меня сначала. но затем я разрешил img (потому что фильтр использует тег img для волшебства) и сработал! $config-›set('HTML.Allowed', 'p,a[href|rel|target],img[class|src|height|width]'); - person Martin Schaer; 12.07.2012

Для тех, кто борется (как включить 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);
person Sumeet    schedule 30.06.2016
comment
Спасибо, пробовал все возможные решения этой проблемы, но ваш ответ решил ее! Бесконечно благодарен! - person southpaw93; 29.03.2018
comment
Ваш ответ решил это, но элементы ширины, высоты были удалены - person Vikas Chauhan; 11.01.2019
comment
@VikasChauhan 6-я линия - person Sumeet; 11.01.2019
comment
Это сработало, но когда я установил iframe как bool, это не сработало, потому что в коде для встраивания YouTube - атрибут allowfullscreen= не работает. Однако я изменил эту строку - $def-›addAttribute('iframe', 'allowfullscreen', 'Bool'); to $def-›addAttribute('iframe', 'allowfullscreen', 'Text'); Наконец-то сработало для меня... - person Vikas Chauhan; 15.01.2019
comment
@sumeet Как также разрешить iframe для видео в Facebook - person Panagiotis Koursaris; 24.08.2019

Это должно помочь

$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);
person Deepak Kumar    schedule 12.01.2014
comment
Просто добавил строку › $config-›set('Filter.YouTube', true); Это сработало для меня. Спасибо :-) - person Vikas Chauhan; 11.01.2019

Избавьтесь от %HTML.Trusted, %Filter.YouTube и %HTML.DefinitionID. Вероятно, они плохо взаимодействуют с SafeObject/FlashCompat.

person Edward Z. Yang    schedule 19.01.2011
comment
iframe все равно заблокирован, без учета. Знаете ли вы другие хорошие решения, но с поддержкой iframe? - person swamprunner7; 20.01.2011
comment
Ах да, вам придется добавить поддержку Iframe отдельно. Вот один из возможных способов сделать это: htmlpurifier.org/phorum/ read.php?3,4646,4646#msg-4646 И, конечно же, мы надеемся (в конечном счете) добавить его правильную поддержку в ядро. - person Edward Z. Yang; 20.01.2011
comment
Я попробовал это решение, но у меня есть проблема, вот мой последний комментарий stackoverflow.com/questions/4135755/ - person swamprunner7; 20.01.2011
comment
Почему ютуб перешел на iframe? Почему? /отчаянный крик - person El Yobo; 16.02.2011
comment
@ElYobo, потому что видео HTML5 - person Navarr; 02.03.2014

Используя drupal 7.19 и модуль htmlpurifier, вы можете настроить следующие параметры без необходимости писать этот код.

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

person trkest    schedule 14.01.2013

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

URI.DisableExternalResources: false

если вы установили его на true раньше.

person gorodezkiy    schedule 16.06.2015

Основываясь на ответе reverbnation, я понял, что по какой-то причине строка

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

работало некорректно и вместо

allowfullscreen="allowfullscreen"

HTMLPurifier выводил

allowfullscreen=""

Хотя в документации говорится, что Bool - Boolean attribute, with only one valid value: the name of the attribute, вместо этого я попытался использовать Enum:

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

Третий параметр означает, что атрибут allowfullscreen будет иметь только правильное значение -- allowfullscreen, все остальное будет проигнорировано. Таким образом, мы имеем то же поведение, что и с Bool. К счастью, это сработало для меня.

Возможно, это решение поможет кому-то.

person user2513149    schedule 06.05.2018