Проблема с выводом из базы данных yii2 - PullRequest
0 голосов
/ 02 сентября 2018

У меня в базе данных есть путь к файлам, которые я хочу получить. как:

<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%" />

1 Ответ

0 голосов
/ 03 сентября 2018

Оболочка HTMLPurifier в Yii2 принимает второй аргумент :

echo HtmlPurifier::process($html, [
    // options go here
]);

Для <embed> вы должны иметь возможность использовать HTML.SafeEmbed :

echo HtmlPurifier::process($html, [
    'HTML.SafeEmbed' => true,
]);

К сожалению, для <audio> основная проблема здесь заключается в том, что очиститель HTML не поддерживает HTML5, что значительно усложнит добавление.

Существуют пользовательские патчи, позволяющие HTML Purifier понимать HTML5 , но, насколько мне известно, ни один из них не был проверен, и поэтому трудно сказать, что это будет делать для безопасности вашего сайта. , (Можно утверждать, что HTML Purifier с пользовательскими определениями HTML5 все же лучше, чем вообще без HTML Purifier.)

Я дал некоторые грубые инструкции о том, как заставить очиститель HTML (саму библиотеку, а не ее обертку Yii2) знать только о теге <audio> над другим вопросом . Цитирование соответствующих частей:

Вам придется взглянуть на «Настроить!» документация для конечного пользователя , в которой рассказывается, как добавлять теги и атрибуты, о которых не знает HTML Purifier.

Цитировать наиболее яркий пример кода из связанной документации (этот код рассказывает HTML-очистителю о теге <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);

Каждый из параметров соответствует одному из заданных нами вопросов. Обратите внимание, что мы добавили звездочку в конец атрибута действия к указать, что это требуется. Если кто-то указывает форму без этого атрибут, тег будет ось. Кроме того, дополнительная строка в конце специальная дополнительная декларация, которая предотвращает вложение форм в друг друга.

После того, как вы следовали этим инструкциям, чтобы сделать вашу процедуру очищения известно о <audio>, добавив тег <audio> в вашу конфигурацию белый список будет работать.

Итак, вкратце, если вы хотите иметь возможность очищать только <audio> теги, не теряя их полностью, вам нужно будет немного изучить возможности тегов и добавить информацию в HTML Purifier.

Вы можете основывать свой код на том, что вы можете найти в HTML5Definition.php файле *1048* xemlock / htmlpurifier-html5 *, если вы не хотите работать с ним с нуля.

...