允许'自动' HTMLPurifier中图像标记的宽度/高度属性值

时间:2017-10-06 09:15:28

标签: php htmlpurifier

目前我的htmlpurifier并不允许自动'图像标记上的高度和宽度属性的值,但仅限于数值。

$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
$purifier = new HTMLPurifier($config);

我如何继续允许自动值?

1 个答案:

答案 0 :(得分:1)

虽然CSS属性widthheight支持auto值,但HTML属性widthheight执行支持auto。请参阅"Objects, Images, and Applets in HTML documents" > "Width and height"以及"Length"的定义。

HTML Purifier的一个功能是强制您提供的HTML符合标准。简而言之,这会降低在浏览器中利用未定义行为的能力,从而提高安全性。

但是,在这种情况下,默认情况下HTML Purifier实际上甚至更严格并且不允许百分比。这与auto问题无关 - 但值得注意的是,您必须将HTML.MaxImgLength设置为null才能启用百分比。这表明你应该考虑一下你是否真的想要这个。

最简单的不提供 autowidth属性,可以最好地模拟您想要的行为(height)。

尽管如此,您仍然可以告诉HTML Purifier以不同的方式处理这种情况:

修补

(即更改行为 更改HTML Purifier源代码。)

在这种情况下,修补代码并不比覆盖代码容易得多,因此我不推荐使用它,但了解如何修补HTML Purifier可以帮助您理解为什么覆盖它有效:​​

如果要修补HTML Purifier以允许widthheight支持auto值,则应修补 library / HTMLPurifier / HTMLModule / Image.php 。目前的限制在以下几行:

                // According to the spec, it's Length, but percents can
                // be abused, so we allow only Pixels.
                'height' => 'Pixels#' . $max,
                'width' => 'Pixels#' . $max,

您需要向 library / HTMLPurifier / AttrDef / HTML / 添加一个类,以便在定义中轻松解决。例如,Pixels指的是 library / HTMLPurifier / AttrDef / HTML / Pixels.php 中的类HTMLPurifier_AttrDef_HTML_Pixels。我建议使用PixelsLength作为支持值auto的类的模板。

重写

(即更改行为,不用更改HTML Purifier源代码。)

如果要覆盖HTML Purifier行为,请查看HTML Purifier站点上的Customize!文档。

从表面上看,覆盖行为看起来很像修补过程:

您仍然应该编写一个类似 library / HTMLPurifier / AttrDef / HTML / Pixels.php library / HTMLPurifier / AttrDef / HTML / Length.php ,但把它放在HTMLPurifier代码库之外的某个地方。

拥有该类后,您可以使用以下配置代码覆盖默认的widthheight行为:

$htmlDef = $this->configuration->getHTMLDefinition(true);
$htmlDef->addAttribute('img', 'width', new YourOwnClass());
$htmlDef->addAttribute('img', 'height', new YourOwnClass());

在实现这一目标的过程中可能存在一些障碍(自从我在这个级别上修改了HTML Purifier以来已经过了几年了!),但是这应该会让你走上一条通往HTML的好方法净化器代码。 :)