我在数据库中有要输出的文件的路径。 像:
<audio src="/yii2-biblioteca/frontend/web/uploads/audio/lya1.mp3" controls type="audio/mpeg">
我正在使用:
<?=HtmlPurifier::process($model->audio)?>
用于输出。
我对图像使用了相同的东西,没关系,它可以工作,但是对于音频和pdf,嵌入的东西却不多。 在开始使用pdf时,我用js功能更改了一些内容,但这并不是负面影响。我把所有内容都恢复为原来的状态,但是现在不起作用。
pdf示例:<embed src="/yii2-biblioteca/frontend/web/uploads/pdf/dying.pdf" type="application/pdf" width="100%" height="100%" />
答案 0 :(得分:1)
Yii2的HTMLPurifier包装器需要a second argument:
echo HtmlPurifier::process($html, [
// options go here
]);
对于<embed>
,您应该可以使用HTML.SafeEmbed设置:
echo HtmlPurifier::process($html, [
'HTML.SafeEmbed' => true,
]);
不幸的是,对于<audio>
,这里的根本问题是HTML Purifier不支持HTML5,这会使添加起来更加复杂。
有user-supplied patches to allow HTML Purifier to understand HTML5,但是据我所知,没有一个已经过审核,因此很难说这将对您的网站安全产生什么影响。 (可以说,具有userland提供的HTML5定义的HTML Purifier仍然比没有HTML Purifier更好。)
我已经给出了一些粗略的说明,说明如何使HTML Purifier(库本身,而不是它的Yii2包装器)仅意识到another question上的<audio>
标记。引用相关内容:
您必须查看"Customize!" end-user documentation,它会告诉您如何添加HTML Purifier无法识别的标签和属性。
引用链接文档中最生动的代码示例 (此代码向HTML Purifier教授了
<form>
标签):输入一些代码的时间:
$config = HTMLPurifier_Config::createDefault(); $config->set('HTML.DefinitionID', 'enduser-customize.html tutorial'); $config->set('HTML.DefinitionRev', 1); $config->set('Cache.DefinitionImpl', null); // remove this later! $def = $config->getHTMLDefinition(true); [...] $form = $def->addElement( 'form', // name 'Block', // content set 'Flow', // allowed children 'Common', // attribute collection array( // attributes 'action*' => 'URI', 'method' => 'Enum#get|post', 'name' => 'ID' ) ); $form->excludes = array('form' => true);
每个参数都对应于我们提出的问题之一。请注意,我们在action属性的末尾添加了一个星号 指示它是必需的。如果有人指定没有该表格 属性,标记将被删除。另外,末尾的额外行是 特殊的额外声明,可防止表单嵌套在其中 彼此。
按照这些说明进行纯化程序后, 了解
<audio>
,将标记<audio>
添加到您的配置中 白名单将起作用。
因此,简而言之,如果您希望仅纯化<audio>
个标签而不会完全丢失它们,则必须对标签的功能进行一些研究并将信息添加到HTML Purifier中
如果您不想从头开始编写代码,则可以基于在xemlock/htmlpurifier-html5's HTML5Definition.php
file中找到的代码。