如何在htmlpurifier中允许谷歌字体?

How to allow google fonts in htmlpurifier?

提问人:DLK 提问时间:7/18/2022 最后编辑:DLK 更新时间:7/19/2022 访问量:124

问:

我在通过 url 允许谷歌字体时遇到了问题,我允许字体并设置CSS.AllowedProperties$config->set('CSS.MaxImgLength', NULL);

添加了以下链接:$config->set('HTML.Allowed', 'link[href|rel]);

将样式表添加到:$config->set('CSS.AllowedProperties', 'stylesheet);

添加到定义中:$def->addAttribute('iframe','allowfullscreen','link', 'Bool');

我在 3 小时内尝试了许多其他解决方案,但无法奏效。 出现错误:

无法检索未定义的属性类型链接

这些是我想允许的网址

<link href="https://fonts.googleapis.com/css?family=Roboto+Condensed:300,400,700&display=swap&subset=cyrillic,cyrillic-ext,greek,greek-ext,latin-ext,vietnamese" rel="stylesheet">

<link href="https://fonts.googleapis.com/css?family=Open+Sans:300,400,600,700&display=swap" rel="stylesheet">

这是我的完整设置

  function strTrim($dirty_html, $config = FALSE){
     require_once('ThirdParty/HTMLPurifier/library/HTMLPurifier.auto.php');
     if (is_array($dirty_html)) {
        foreach ($dirty_html as $key => $val) {
            $clean_html[$key] = strTrim($val, $config);
        }
     } else {
        $config = HTMLPurifier_Config::createDefault();
        $config->set('Core.Encoding', 'utf-8');
        $config->set("AutoFormat.AutoParagraph", false);
        $config->set("Core.NormalizeNewlines", true);
        $config->set('HTML.Allowed', 'link[href|rel],iframe[src|title|frameborder|allowfullscreen|class|width|height],p,b,strong,a[href|title],abbr[title],blockquote[cite],code,pre[class],em,i,strike,u,s,sub,sup,ol,ul,li,hr,img[title|alt|src|class|style],h1,h2,h3,h4,h5,h6,object[width|height|data],param[name|value],embed[src|type|allowscriptaccess|width|height],br,*[style]');
        $config->set('CSS.AllowedProperties', 'font,font-size,font-weight,font-style,font-family,text-decoration,margin-left,margin-right,float,color,background-color,text-align,width,max-width,padding-left,border,stylesheet');
        $config->set('HTML.MaxImgLength', NULL);
        $config->set('CSS.MaxImgLength', NULL);
        $config->set('HTML.SafeObject', true);
        $config->set('HTML.SafeEmbed', true);
        $config->set('Output.FlashCompat', true);
        $config->set('AutoFormat.RemoveEmpty', true);
        $config->set('AutoFormat.RemoveEmpty.RemoveNbsp', true);
        $config->set('HTML.SafeIframe', true);
        $config->set('URI.SafeIframeRegexp', '%^//(www.youtube(?:-nocookie)?.com/embed/|player.vimeo.com/video/)%');
        $def = $config->getHTMLDefinition(true);
        $def->addAttribute('iframe','allowfullscreen','link', 'Bool');
        $purifier = new HTMLPurifier($config);
        $clean_html = $purifier->purify($dirty_html);
     }
     return $clean_html;
  }

感谢您的帮助。

php html css htmlpurifier

评论


答:

1赞 pinkgothic 7/19/2022 #1

诚然,我对你的配置感到非常困惑。我确实理解您为什么要尝试添加 ,但我不明白您为什么要设置,或者为什么要添加(据我所知,没有这样的 CSS 属性),并且不是有效的 AttrType(第三个参数)。您能解释一下您这样做的动机,或者链接到您正在遵循的指南吗?link[href|rel]HTML.AllowedCSS.MaxImgLengthstylesheetCSS.AllowedPropertieslinkaddAttribute

不幸的是,你不能使用,因为它是页眉的一部分,而 HTML Purifier 仅适用于 HTML 正文片段。根据我对您的用例的了解,您可以使用的最接近的配置设置是 ,但它仍然是一个失误,而不是命中,因为它只考虑块,而不是 .<link>Filter.ExtractStyleBlocks<style><link>

您可能有兴趣 https://stackoverflow.com/a/41510846/245790 了解不支持的原因以及如何处理该问题。<link>

评论

0赞 DLK 7/19/2022
非常感谢您的回答和更正,您是这里唯一回答htmlpurifier问题的人,我很感激,不幸的是,您不能使用<link>链接是一个标签,所以我不得不将其添加到,如果我不这样做,我必须使用,那么在我的情况下它不允许。这是我最新的链接设置示例:如何在htmlpurifier中允许谷歌字体或链接?我有那么多知识:)您可以自由地使我成为 CodeIgniter4 的最佳解决方案:)addElement();CSS.MaxImgLength', NULLCSS.AllowedProperties