13

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

8 に答える 8

38

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
于 2012-10-08T14:45:32.437 に答える
9

このブログエントリを読んだだけで、カスタムフィルタが正常に作成され、使用されました。コードにいくつかの変更を加え、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 '';
        }
    }
}

HTMLPurifier構成にフィルターを追加する

$config->set('Filter.Custom', array(new HTMLPurifier_Filter_MyIframe()));
于 2011-12-20T20:56:31.410 に答える
3

これだけでうまくいくはずです

$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);
于 2014-01-12T12:55:45.017 に答える
1

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

3 番目のパラメーターは、allowfullscreen属性が正しい値のみを持つことを意味します -- allowfullscreen。それ以外はすべて無視されます。このようにして、 と同じ動作をしBoolます。幸いなことに、それは私にとってはうまくいきました。

おそらく、この解決策は誰かを助けるでしょう。

于 2018-05-06T16:56:06.623 に答える
0

%HTML.Trusted、%Filter.YouTube、および %HTML.DefinitionID を取り除きます。それらはおそらく SafeObject/FlashCompat とのやり取りが不十分です。

于 2011-01-19T19:40:20.577 に答える
0

drupal 7.19 と htmlpurifier モジュールを使用すると、このコードを記述する必要なく、次の設定を構成できます。

http://drupal.org/node/711728#comment-5600344を参照してください。

于 2013-01-14T12:41:09.537 に答える
0

設定もお忘れなく

URI.DisableExternalResources: false

以前に設定した場合true

于 2015-06-16T19:01:09.950 に答える