dilneiss/purify

一个用于 Laravel 的 HTML 清理器 / 消毒剂

v4.0.1 2022-02-09 01:05 UTC

This package is auto-updated.

Last update: 2024-09-09 07:07:05 UTC


README

GitHub Actions Scrutinizer Code Quality Latest Stable Version Total Downloads License

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,以便重新缓存。