dilneiss / purify
一个用于 Laravel 的 HTML 清理器 / 消毒剂
Requires
- php: >=7.1
- ezyang/htmlpurifier: ^4.9.0
Requires (Dev)
- orchestra/testbench: ~3.7|~4.0|~5.0|~6.0|~7.0
- phpunit/phpunit: ~7.0|~8.0|~9.0
README
Purify 是 Laravel 对 HTMLPurifier 的包装,由 ezyang 提供。
要求
- PHP >= 7.1
- Laravel >= 5.5
安装
要在项目中安装 Purify,请在项目根目录下运行以下命令
composer require stevebauman/purify
然后,使用以下命令发布配置文件
php artisan vendor:publish --provider="Stevebauman\Purify\PurifyServiceProvider"
如果你正在使用 Lumen,你应该手动复制配置文件 purify.php
,并将此行添加到你的 bootstrap/app.php
$app->register(Stevebauman\Purify\PurifyServiceProvider::class);
使用方法
清理字符串
要清理用户输入,只需使用 clean 方法
$input = '<script>alert("Harmful Script");</script> <p style="border:1px solid black" class="text-gray-700">Test</p>'; // Returns '<p class="text-gray-700">Test</p>' $cleaned = Purify::clean($input);
清理数组
需要净化用户输入的数组?只需传入一个数组
$array = [ '<script>alert("Harmful Script");</script> <p style="border:1px solid black" class="text-gray-700">Test</p>', '<script>alert("Harmful Script");</script> <p style="border:1px solid black" class="text-gray-700">Test</p>', ]; $cleaned = Purify::clean($array); // array [ // '<p class="text-gray-700">Test</p>', // '<p class="text-gray-700">Test</p>', // ] var_dump($cleaned);
动态配置
需要为单个输入使用不同的配置?将配置数组传入第二个参数
$config = ['HTML.Allowed' => 'div,b,a[href]']; $cleaned = Purify::clean($input, $config);
注意:传入第二个参数的配置不会与你的当前配置合并。
$config = ['HTML.Allowed' => 'div,b,a[href]']; $cleaned = Purify::clean($input, $config);
替换 HTML Purifier 实例
需要用你自己的实例替换 HTML Purifier 实例?请调用 setPurifier()
方法
$purifier = new HTMLPurifier(); Purify::setPurifier($purifier);
实践
如果你在考虑消毒,你很可能会对存储在数据库中以在应用程序中渲染的用户输入的 HTML 内容进行消毒。
在这种情况下,最好在 输出 时进行消毒,而不是在 输入 时。记住,数据库不关心它包含的文本。
这样你就可以允许将任何内容插入数据库,并在输出时有强大的消毒规则。
如果你以后更改消毒要求,这将非常有帮助,因为所有渲染的内容都将遵循这些消毒规则。
配置
在配置文件中,整个设置数组直接传递给 HTML Purifier 配置,因此请随意自定义它。有关配置文档,请访问 HTML Purifier 网站
http://htmlpurifier.org/live/configdoc/plain.html
自定义配置规则
在 HTML Purifier 实例上创建自定义规则有多种方法。
以下是一个示例服务提供程序,你可以将其用作添加规则到实例的起点。此提供程序提供了与 Basecamp 的 Trix WYSIWYG 编辑器的兼容性
感谢 Antonio Primera 解决一些 HTML Purifier 配置问题(与 trix 相关)。
<?php namespace App\Providers; use HTMLPurifier_HTMLDefinition; use Stevebauman\Purify\Facades\Purify; use Illuminate\Support\ServiceProvider; class PurifySetupProvider extends ServiceProvider { const DEFINITION_ID = 'trix-editor'; const DEFINITION_REV = 1; /** * Bootstrap the application services. * * @return void */ public function boot() { /** @var \HTMLPurifier $purifier */ $purifier = Purify::getPurifier(); /** @var \HTMLPurifier_Config $config */ $config = $purifier->config; $config->set('HTML.DefinitionID', static::DEFINITION_ID); $config->set('HTML.DefinitionRev', static::DEFINITION_REV); if ($def = $config->maybeGetRawHTMLDefinition()) { $this->setupDefinitions($def); } $purifier->config = $config; } /** * Register the application services. * * @return void */ public function register() { // } /** * Adds elements and attributes to the HTML purifier * definition required by the trix editor. * * @param HTMLPurifier_HTMLDefinition $def */ protected function setupDefinitions(HTMLPurifier_HTMLDefinition $def) { $def->addElement('figure', 'Inline', 'Inline', 'Common'); $def->addAttribute('figure', 'class', 'Text'); $def->addElement('figcaption', 'Inline', 'Inline', 'Common'); $def->addAttribute('figcaption', 'class', 'Text'); $def->addAttribute('figcaption', 'data-trix-placeholder', 'Text'); $def->addAttribute('a', 'rel', 'Text'); $def->addAttribute('a', 'tabindex', 'Text'); $def->addAttribute('a', 'contenteditable', 'Enum#true,false'); $def->addAttribute('a', 'data-trix-attachment', 'Text'); $def->addAttribute('a', 'data-trix-content-type', 'Text'); $def->addAttribute('a', 'data-trix-id', 'Number'); $def->addElement('span', 'Block', 'Flow', 'Common'); $def->addAttribute('span', 'data-trix-cursor-target', 'Enum#right,left'); $def->addAttribute('span', 'data-trix-serialize', 'Enum#true,false'); $def->addAttribute('img', 'data-trix-mutable', 'Enum#true,false'); $def->addAttribute('img', 'data-trix-store-key', 'Text'); } }
在此服务提供程序创建后,请确保将其插入到你的 config/app.php
文件中的 providers
数组中,并更新你的 config/purify.php
文件中的 HTML.Allowed
字符串。
注意:记住,在此定义创建后,并已运行
Purify::clean()
,该定义将被缓存,如果你想更改定义,则需要从你的storage/app/purify
文件夹中清除它。否则,您必须更改定义的版本号或 ID,以便重新缓存。