hdvinnie/laravel-html-purifier

为 Laravel 提供的 HTML 清理器

v3.0.0 2024-03-13 15:38 UTC

This package is auto-updated.

Last update: 2024-09-13 16:39:49 UTC


README

为 Laravel 提供的 HTML 清理器

Software License Packagist Packagist Downloads

这是一个简单的 Laravel 服务提供者,让您可以轻松地在 Laravel 中使用 HTMLPurifier。根据他们的网站描述

HTML Purifier 是一个符合标准的 HTML 过滤库,用 PHP 编写。HTML Purifier 不仅将删除所有恶意代码(也称为 XSS),它还会使用经过彻底审计的、安全的但允许的白名单,确保您的文档符合标准,这是只有具备对 W3C 规范的全面了解才能实现的。厌倦了使用 BBCode,因为当前的 HTML 过滤器不完善或不安全?拥有 WYSIWYG 编辑器,但从未能够使用它?正在寻找用于您构建的应用程序的高质量、符合标准、开源组件?HTML Purifier 是您所需要的!

安装

适用于 Laravel 5.5+

使用 Composer 需求此包

composer require hdvinnie/laravel-html-purifier

服务提供者将自动发现。您不需要在任何地方添加提供者。

适用于 Laravel 5.0 到 5.4

使用 Composer 需求此包

composer require hdvinnie/laravel-html-purifier

config/app.php 中找到 providers 键并注册 HTMLPurifier 服务提供者。

    'providers' => [
        // ...
        HDVinnie\Purifier\PurifierServiceProvider::class,
    ]

config/app.php 中找到 aliases 键并注册 Purifier 别名。

    'aliases' => [
        // ...
        'Purifier' => HDVinnie\Purifier\Facades\Purifier::class,
    ]

使用

在您的请求或中间件中使用这些方法,无论您需要在何处清理 HTML

\clean(Input::get('inputname'));

Purifier::clean(Input::get('inputname'));

动态配置

\clean('This is my H1 title', 'titles');
\clean('This is my H1 title', array('Attr.EnableID' => true));

Purifier::clean('This is my H1 title', 'titles');
Purifier::clean('This is my H1 title', array('Attr.EnableID' => true));

使用 URI 过滤器

Purifier::clean('This is my H1 title', 'titles', function (HTMLPurifier_Config $config) {
    $uri = $config->getDefinition('URI');
    $uri->addFilter(new HTMLPurifier_URIFilter_NameOfFilter(), $config);
});

或者,在 Laravel 7+ 中,如果您想清理 Eloquent 模型中的 HTML,可以使用我们的自定义转换

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use HDVinnie\Purifier\Casts\CleanHtml;
use HDVinnie\Purifier\Casts\CleanHtmlInput;
use HDVinnie\Purifier\Casts\CleanHtmlOutput;

class User extends Model
{
    protected $casts = [
        'bio'            => CleanHtml::class, // cleans both when getting and setting the value
        'description'    => CleanHtmlInput::class, // cleans when setting the value
        'history'        => CleanHtmlOutput::class, // cleans when getting the value
    ];
}

配置

要使用自己的设置,请发布配置。

php artisan vendor:publish --provider="HDVinnie\Purifier\PurifierServiceProvider"

配置文件 config/purifier.php 应该如下所示

return [
    'encoding'           => 'UTF-8',
    'finalize'           => true,
    'ignoreNonStrings'   => false,
    'cachePath'          => storage_path('app/purifier'),
    'cacheFileMode'      => 0755,
    'settings'      => [
        'default' => [
            'HTML.Doctype'             => 'HTML 4.01 Transitional',
            'HTML.Allowed'             => 'div,b,strong,i,em,u,a[href|title],ul,ol,li,p[style],br,span[style],img[width|height|alt|src]',
            'CSS.AllowedProperties'    => 'font,font-size,font-weight,font-style,font-family,text-decoration,padding-left,color,background-color,text-align',
            'AutoFormat.AutoParagraph' => true,
            'AutoFormat.RemoveEmpty'   => true,
        ],
        'test'    => [
            'Attr.EnableID' => 'true',
        ],
        "youtube" => [
            "HTML.SafeIframe"      => 'true',
            "URI.SafeIframeRegexp" => "%^(http://|https://|//)(www.youtube.com/embed/|player.vimeo.com/video/)%",
        ],
        'custom_definition' => [
            'id'  => 'html5-definitions',
            'rev' => 1,
            'debug' => false,
            'elements' => [
                // http://developers.whatwg.org/sections.html
                ['section', 'Block', 'Flow', 'Common'],
                ['nav',     'Block', 'Flow', 'Common'],
                ['article', 'Block', 'Flow', 'Common'],
                ['aside',   'Block', 'Flow', 'Common'],
                ['header',  'Block', 'Flow', 'Common'],
                ['footer',  'Block', 'Flow', 'Common'],
				
				// Content model actually excludes several tags, not modelled here
                ['address', 'Block', 'Flow', 'Common'],
                ['hgroup', 'Block', 'Required: h1 | h2 | h3 | h4 | h5 | h6', 'Common'],
				
				// http://developers.whatwg.org/grouping-content.html
                ['figure', 'Block', 'Optional: (figcaption, Flow) | (Flow, figcaption) | Flow', 'Common'],
                ['figcaption', 'Inline', 'Flow', 'Common'],
				
				// http://developers.whatwg.org/the-video-element.html#the-video-element
                ['video', 'Block', 'Optional: (source, Flow) | (Flow, source) | Flow', 'Common', [
                    'src' => 'URI',
					'type' => 'Text',
					'width' => 'Length',
					'height' => 'Length',
					'poster' => 'URI',
					'preload' => 'Enum#auto,metadata,none',
					'controls' => 'Bool',
                ]],
                ['source', 'Block', 'Flow', 'Common', [
					'src' => 'URI',
					'type' => 'Text',
                ]],

				// http://developers.whatwg.org/text-level-semantics.html
                ['s',    'Inline', 'Inline', 'Common'],
                ['var',  'Inline', 'Inline', 'Common'],
                ['sub',  'Inline', 'Inline', 'Common'],
                ['sup',  'Inline', 'Inline', 'Common'],
                ['mark', 'Inline', 'Inline', 'Common'],
                ['wbr',  'Inline', 'Empty', 'Core'],
				
				// http://developers.whatwg.org/edits.html
                ['ins', 'Block', 'Flow', 'Common', ['cite' => 'URI', 'datetime' => 'CDATA']],
                ['del', 'Block', 'Flow', 'Common', ['cite' => 'URI', 'datetime' => 'CDATA']],
            ],
            'attributes' => [
                ['iframe', 'allowfullscreen', 'Bool'],
                ['table', 'height', 'Text'],
                ['td', 'border', 'Text'],
                ['th', 'border', 'Text'],
                ['tr', 'width', 'Text'],
                ['tr', 'height', 'Text'],
                ['tr', 'border', 'Text'],
            ],
        ],
        'custom_attributes' => [
            ['a', 'target', 'Enum#_blank,_self,_target,_top'],
        ],
        'custom_elements' => [
            ['u', 'Inline', 'Inline', 'Common'],
        ],
    ],

];