lab1521/neaty-html

使用 Tidy 清理 HTML 标记

v1.0.9 2016-08-15 12:07 UTC

This package is not auto-updated.

Last update: 2024-09-14 19:42:13 UTC


README

Build Status SensioLabsInsight

清理 HTML。适用于编写接受 HTML 标记的内容或博客。需要 PHP tidy 类。请先安装此扩展。

在您的网站上接受包含(包括标记/标签等)的 HTML 内容,在某种程度上是关于您网站及其用户安全性的一个担忧。令人恐惧的 XSS 或跨站脚本攻击始终是一种威胁。然而,凭借开源的力量,我们可以跟上常见威胁并减轻问题,以确保我们的网站或博客的安全。

安装

composer require lab1521/neaty-html

如何使用

<?php
require('../vendor/autoload.php');
use Lab1521\NeatyHTML\NeatyHTML;

//Goal: Remove onerror attribute which prevents eval to alert
$badImage = '<img src=x:alert(window) onerror=eval(src) alt="bad image">';
$goodImage = '<img src="images/good.gif" alt="good image">';

$neaty = new NeatyHTML($badImage . $goodImage);

//Outputs <img src="x:alert(window)" alt="bad image"><img src="images/good.gif" alt="good image">
echo $neaty->tidyUp();

//Goal: Remove unrecognized images and keep local sources only
$neaty->blockedTags(['img']);
$neaty->tagOverrides([
    'img' => [
        [
            'attribute' => 'src',
            'values' => ['images/'] //restricts to local folder
        ],
    ]
]);

//Goal: Remove $badImage
$neaty->loadHtml($badImage . $goodImage);

//Outputs $goodImage only
echo $neaty->tidyUp();

限制

当前 PHP 的 DomDocument 类不支持 HTML5 标签/属性。因此,会抛出 NeatyDOMException 异常。

Laravel 特定使用方法

服务提供者

对于您的 Laravel 应用,打开 config/app.php,然后在 providers 数组中追加

/*
 * Package Service Providers...
 */

Lab1521\NeatyHTML\NeatyHTMLServiceProvider::class,

使用 Facades

在相同的文件 config/app.php 中,'aliases' 数组中添加一个新项

'NeatyHTML' => Lab1521\NeatyHTML\Facades\NeatyHTML::class,

示例用法

<?php
Route::get('/', function () {
    //Goal: Remove onerror attribute which prevents eval to alert
    $badImage = '<img src=x:alert(window) onerror=eval(src) alt="bad image">';
    $goodImage = '<img src="images/good.gif" alt="good image">';

    $neaty = NeatyHTML::loadHtml($badImage . $goodImage);

    //Goal: Remove unrecognized images and keep local sources only
    $neaty->blockedTags(['img']);
    $neaty->tagOverrides([
        'img' => [
            [
                'attribute' => 'src',
                'values' => ['images/'] //restricts to local folder
            ],
        ]
    ]);

    //Outputs $goodImage only
    return $neaty->tidyUp();
    // return view('welcome');
});

自定义验证规则

NeatyHTML 提供了一个名为 'html' 的自定义验证规则,它将检查包含标记的 POST 输入,并在验证失败时传递错误消息。请注意,NeatyHTMLServiceProvider 默认是延迟加载的,因此我们需要在控制器方法中注入此类,以便使用自定义验证功能。这样我们只在需要时使用 NeatyHTML,这是很好的。

<?php
use Lab1521\NeatyHTML\NeatyHTML;

class PostController extends Controller
{
    public function store(Request $request, NeatyHTML $neaty)
    {
        $this->validate($request, [
            'title'    => 'required',
            'body'     => 'required|html' // <-- custom rule
        ]);

        // Your awesome code here ...
        $body = $neaty->tidyUp($request['body']);
    }
}