• Stars
    star
    446
  • Rank 97,888 (Top 2 %)
  • Language
    PHP
  • License
    MIT License
  • Created over 9 years ago
  • Updated 2 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

A Laravel wrapper for HTMLPurifier by ezyang

Purify

A Laravel wrapper for HTMLPurifier by ezyang.

Index

Requirements

  • PHP >= 7.4
  • Laravel >= 7.0

Installation

To install Purify, run the following command in the root of your project:

composer require stevebauman/purify

Then, publish the configuration file using:

php artisan vendor:publish --provider="Stevebauman\Purify\PurifyServiceProvider"

Usage

Cleaning a String

To clean a users input, simply use the clean method:

use Stevebauman\Purify\Facades\Purify;

$input = '<script>alert("Harmful Script");</script> <p style="border:1px solid black" class="text-gray-700">Test</p>';

// Returns '<p>Test</p>'
$cleaned = Purify::clean($input);
Cleaning an Array

Need to purify an array of user input? Just pass in an array:

use Stevebauman\Purify\Facades\Purify;

$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>Test</p>',
//  '<p>Test</p>',
// ]
var_dump($cleaned);
Dynamic Configuration

Need a different configuration for a single input? Pass in a configuration array into the second parameter:

Note: Configuration passed into the second parameter is not merged with your default configuration.

use Stevebauman\Purify\Facades\Purify;

$config = ['HTML.Allowed' => 'div,b,a[href]'];

$cleaned = Purify::config($config)->clean($input);

Configuration

Inside the configuration file, multiple HTMLPurifier configuration sets can be specified, similar to Laravel's built-in database, mail and logging config. Simply call Purify::config($name)->clean($input) to use another set of configuration.

For example, if we need to have a separate configuration for a comment system, we can setup this configuration in the config/purify.php file:

// config/purify.php

'configs' => [
    // ...

    'comments' => [
        // Some configuration ...
    ],
]

Then, utilize it anywhere in your application by its name:

use Stevebauman\Purify\Facades\Purify;

$cleanedContent = Purify::config('comments')->clean(request('content'));

For HTMLPurifier configuration documentation, please visit the HTMLPurifier Website:

http://htmlpurifier.org/live/configdoc/plain.html

Cache

After running Purify once, HTMLPurifier will auto-cache your serialized definitions into the serializer.cache definition you have configured in config/purify.php.

Important:

If you have configured Purify to utilize the CacheDefinitionCache in the serializer option, this command will issue a Cache::clear() on the cache driver you have configured it to use.

If you have configured Purify to utilize the FilesystemDefinitionCache in the serializer option, this command will clear the directory that you have configured it to store in.

It is recommended to setup a unique filesystem path or disk (via config/filesystems.php) or cache store (via config/cache.php) for Purify if you intended to clear the serialized definitions using this command.

If you ever update the definitions configuration option, you must clear this HTMLPurifier cache.

You may do so via a purify:clear command:

php artisan purify:clear

Disabling Caching

To disable caching all together, you may set the serializer path to null:

// config/purify.php

'serializer' => null,

This will cause your definitions to be serialized upon each application request.

This is especially useful when debugging or tweaking definition files to see immediate results.

Important: Caching is recommended in production environments.

Practices

If you're looking into sanitization, you're likely wanting to sanitize inputted user HTML content that is then stored in your database to be rendered onto your application.

In this scenario, it's likely best practice to sanitize on the way out instead of the on the way in. The database doesn't care what text it contains.

This way you can allow anything to be inserted in the database, and have strong sanization rules on the way out.

To accomplish this, you may use the provided PurifyHtmlOnGet cast class on your Eloquent model:

use Stevebauman\Purify\Casts\PurifyHtmlOnGet;

class Post extends Model
{
    protected $casts = [
        'content' => PurifyHtmlOnGet::class,
    ];
}

Or, implement it yourself via an Eloquent attribute mutator:

use Stevebauman\Purify\Facades\Purify;

class Post extends Model
{
    public function getContentAttribute($value)
    {
        return Purify::clean($value);
    }
}

You can even configure the configuration that is used when casting by appending it's name to the cast:

// config/purify.php

'configs' => [
    // ...

    'other' => [
        // Some configuration ...
    ],
]
protected $casts = [
    'content' => PurifyHtmlOnGet::class.':other',
];

This helps tremendously if you change your sanization requirements later down the line, then all rendered content will follow these sanization rules.

If you'd like to purify HTML while setting the value, you can use the inverse PurifyHtmlOnSet cast instead.

Custom HTML definitions

The HTML.Doctype configuration option denotes the schema to ultimately abide to. You may want to extend these schema definitions to support custom elements or attributes (e.g. <foo>...</foo>, or <span foo="...">) by specifying a custom HTML element "definitions".

Purify ships with additional HTML5 definitions that HTMLPurifier does not (yet) support of the box (via the Html5Definition class).

To create your own HTML definition, create a new class and have it implement Definition:

namespace App;

use HTMLPurifier_HTMLDefinition;
use Stevebauman\Purify\Definitions\Definition;

class CustomDefinition implements Definition
{
    /**
     * Apply rules to the HTML Purifier definition.
     *
     * @param HTMLPurifier_HTMLDefinition $definition
     *
     * @return void
     */
    public static function apply(HTMLPurifier_HTMLDefinition $definition)
    {
        // Customize the HTML purifier definition.
    }
}

Then, reference this class in the config/purify.php file in the definitions key:

// config/purify.php

'definitions' => \App\CustomDefinitions::class,

If you'd like to extend the built-in default Html5Definition, you can apply it to your custom definition:

use Stevebauman\Purify\Definitions\Html5Definition;

class CustomDefinition implements Definition
{
    public static function apply(HTMLPurifier_HTMLDefinition $definition)
    {
        Html5Definition::apply($definition);
        
        // ...
    }
}
Basecamp Trix Definition

Here's an example for customizing the definition in order to support Basecamp's Trix WYSIWYG editor (credit to Antonio Primera):

namespace App;

use HTMLPurifier_HTMLDefinition;
use Stevebauman\Purify\Definitions\Definition;

class TrixPurifierDefinitions implements Definition
{
    /**
     * Apply rules to the HTML Purifier definition.
     *
     * @param HTMLPurifier_HTMLDefinition $definition
     *
     * @return void
     */
    public static function apply(HTMLPurifier_HTMLDefinition $definition)
    {
        $definition->addElement('figure', 'Inline', 'Inline', 'Common');
        $definition->addAttribute('figure', 'class', 'Text');
        $definition->addElement('figcaption', 'Inline', 'Inline', 'Common');
        $definition->addAttribute('figcaption', 'class', 'Text');
        $definition->addAttribute('figcaption', 'data-trix-placeholder', 'Text');

        $definition->addAttribute('a', 'rel', 'Text');
        $definition->addAttribute('a', 'tabindex', 'Text');
        $definition->addAttribute('a', 'contenteditable', 'Enum#true,false');
        $definition->addAttribute('a', 'data-trix-attachment', 'Text');
        $definition->addAttribute('a', 'data-trix-content-type', 'Text');
        $definition->addAttribute('a', 'data-trix-id', 'Number');

        $definition->addElement('span', 'Block', 'Flow', 'Common');
        $definition->addAttribute('span', 'data-trix-cursor-target', 'Enum#right,left');
        $definition->addAttribute('span', 'data-trix-serialize', 'Enum#true,false');

        $definition->addAttribute('img', 'data-trix-mutable', 'Enum#true,false');
        $definition->addAttribute('img', 'data-trix-store-key', 'Text');
    }
}

Upgrading from v4 to v5

To upgrade from v4, install the latest version by running the below command in the root of your project:

composer require stevebauman/purify

Then, navigate into your published config/purify.php configuration file and copy the settings array -- except for the following keys:

  • HTML.DocType:
  • Core.Encoding:
  • Cache.SerializerPath:
'settings' => [
-   'Core.Encoding' => 'utf-8',
-   'Cache.SerializerPath' => storage_path('app/purify'),
-   'HTML.Doctype' => 'XHTML 1.0 Strict',
+   'HTML.Allowed' => 'h1,h2,h3,h4,h5,h6,b,strong,i,em,a[href|title],ul,ol,li,p[style],br,span,img[width|height|alt|src]',
+   'HTML.ForbiddenElements' => '',
+   'CSS.AllowedProperties' => 'font,font-size,font-weight,font-style,font-family,text-decoration,padding-left,color,background-color,text-align',
+   'AutoFormat.AutoParagraph' => false,
+   'AutoFormat.RemoveEmpty' => false,
],

Important: If you've created a unique storage path for Cache.SerializerPath, take note of this as well, so you can migrate it into the new configuration file.

Once copied, delete the config/purify.php file, and run the below command:

php artisan vendor:publish --provider="Stevebauman\Purify\PurifyServiceProvider"

Then, inside the newly published config/purify.php configuration file, paste the keys (overwriting the current) into the configs.default array:

'configs' => [
    'default' => [
        'Core.Encoding' => 'utf-8',
        'HTML.Doctype' => 'HTML 4.01 Transitional',
+       'HTML.Allowed' => 'h1,h2,h3,h4,h5,h6,b,strong,i,em,a[href|title],ul,ol,li,p[style],br,span,img[width|height|alt|src]',
+       'HTML.ForbiddenElements' => '',
+       'CSS.AllowedProperties' => 'font,font-size,font-weight,font-style,font-family,text-decoration,padding-left,color,background-color,text-align',
+       'AutoFormat.AutoParagraph' => false,
+       'AutoFormat.RemoveEmpty' => false,
    ],
],

If you've created a unique serializer path (previously set via the old Cache.SerializerPath configuration key mentioned above), then you may reconfigure this in the new serializer configuration key:

'serializer' => storage_path('app/purify'),

You're all set!

Upgrading from v5 to v6

In v6, the HTMLPurifier Serializer storage mechanism was updated for Laravel Vapour support, allowing you to store the serialized HTMLPurifier definitions in a Redis cache, or an external filesystem.

To upgrade from v5, install the latest version by running the below command in the root of your project:

composer require stevebauman/purify

Then, navigate into your published config/purify.php configuration file and replace the serializer configuration option with the below:

-    'serializer' => storage_path('app/purify'),

+    'serializer' => [
+       'disk' => env('FILESYSTEM_DISK', 'local'),
+       'path' => 'purify',
+       'cache' => \Stevebauman\Purify\Cache\FilesystemDefinitionCache::class,
+    ],
+
+    // 'serializer' => [
+    //    'driver' => env('CACHE_DRIVER', 'file'),
+    //    'cache' => \Stevebauman\Purify\Cache\CacheDefinitionCache::class,
+    // ],

This will update the syntax used to control the serializer cache mechanism. You may now uncomment the below serializer cache definition if you would like to use a Laravel Cache driver (such as Redis) to store the serialized definitions.

More Repositories

1

location

Detect a users location by their IP Address.
PHP
1,104
star
2

showcode

Create beautiful images of code.
Vue
456
star
3

hypertext

A PHP HTML to pure text transformer.
PHP
148
star
4

unfinalize

Remove "final" keywords from classes and methods in vendor packages.
PHP
135
star
5

curlwind

Generate Tailwind utility stylesheets on demand.
CSS
128
star
6

autodoc-facades

Auto-generate PHP doc annotations for Laravel facades
PHP
89
star
7

laravel-husk

A thin and light scaffolded Laravel Dusk environment.
PHP
88
star
8

translation

An easy database driven automatic translator for Laravel 5
PHP
75
star
9

eloquent-table

An HTML table generator for laravel collections
PHP
46
star
10

github-summarizer

A PHP GitHub summarizer using Chat GPT.
PHP
43
star
11

revision

Revisions for Eloquent Models
PHP
39
star
12

maintenance

A Preventative Maintenance Application (CMMS) for Laravel
PHP
37
star
13

log-reader

An easy log reader for Laravel 5
PHP
23
star
14

wmi

A package for WMI manipulation using PHP and COM.
PHP
10
star
15

calendar-helper

A Laravel calendar implementation with Google Calendar
PHP
8
star
16

helpdesk

An IT Helpdesk for managing issues and other related information.
PHP
6
star
17

maintenance-app

The Maintenance Application
JavaScript
6
star
18

pdf

A Dompdf Wrapper for Laravel.
PHP
5
star
19

platform-logs

A cartalyst's platform log manager
PHP
4
star
20

profilepicture-cli

Download all of your 4K images from https://ProfilePicture.ai automatically
PHP
4
star
21

laravel-husk-gridsome

PHP
3
star
22

platform-localization

A localization manager for cartalyst's platform
PHP
3
star
23

laravel-husk-nuxt

A Laravel Husk example using Nuxrt
PHP
3
star
24

Corp

An AdLDAP Helper Package for Larvel 4/5
PHP
2
star
25

administration

An administration backend scaffolding package for Laravel.
PHP
2
star
26

active

An active HTML class helper that echo's strings based on the current route.
PHP
2
star
27

showcode-api-docs

Showcode API docs
JavaScript
1
star
28

viewer

A presenter-like package but used for attaching modular views on a retrieved eloquent record
PHP
1
star
29

WinSchedule

Actual PHP task scheduling in Windows using COM.
PHP
1
star
30

stevebauman-blog

A repository for hosting blog comments for stevebauman.ca
1
star
31

flash

Sweet Alert flash notifications in Laravel.
PHP
1
star
32

WinPerm

A Windows File / Folder Permission Parser in PHP.
PHP
1
star