Laravel 5/6/7 使用 Purifier 扩展包防止 XSS 攻击

今天早睡
今天早睡
发布时间:2026-10-13 | 2人浏览过
原创

Laravel 在处理用户输入的富文本内容时,原生机制难以彻底过滤复杂的 XSS 攻击。通过集成 mews/purifier 扩展包,可调用业界标准的 HTMLPurifier 库对内容进行清洗。本文将详细说明从安装配置到实际使用的全过程,包括设置安全的标签白名单以及在不同场景下调用清理函数的方法。

安装与注册

Purifier 是 Laravel 生态中用于集成 HTMLPurifier 的官方推荐扩展包。首先,需在项目根目录下通过 Composer 引入该依赖:

composer require mews/purifier

安装完成后,Laravel 的服务容器会自动发现该包。在 Laravel 5.5 及以上版本中采用了包自动发现机制,通常无需手动在 config/app.php 中注册 Provider 和 Alias。若使用的是较老版本或未生效,需手动在 app.php 中配置:

'providers' => [
    // ...
    Mews\Purifier\PurifierServiceProvider::class,
]
'aliases' => [
    // ...
    'Purifier' => Mews\Purifier\Facades\Purifier::class,
]

配置安全规则

为了精确控制允许通过的 HTML 标签与属性(即白名单机制),需要发布配置文件并进行自定义修改。

第1步:发布配置文件

运行以下命令,将默认配置生成至项目的 config 目录:

php artisan vendor:publish

执行后会在 config/purifier.php 生成配置文件。打开该文件,找到 'settings' 数组中的 'default' 配置项,这是核心安全防线。

第2步:定义允许的标签与属性

XSS 防护的关键在于 HTML.Allowed 参数。它定义了哪些标签可以被保留。例如,允许 div、strong、i、em 等基础标签,但对链接和插入图片增加了严格限制:

'settings' => [
    'default' => [
        'HTML.Doctype'    => 'XHTML 1.0 Strict',
        // 只允许特定标签,且限制了a标签的href和title属性
        'HTML.Allowed'    => 'div,b,strong,i,em,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
    ],
],

注意:HTML.SafeIframe 相关的配置可用于嵌入 YouTube 视频等受信任的外部资源,但在非必要时建议关闭或严格限制正则表达式,以防范 iframe 注入。

使用示例

配置完成后,即可在项目代码中调用清理函数来处理不可信的用户输入。

第3步:调用清理方法

方式一:使用辅助函数 clean()
这是最便捷的调用方式,直接传入待处理字符串:

// 获取输入并立即净化
$clean_content = clean(request('input_name'));

方式二:使用 Purifier 门面
适用于需要在更复杂逻辑中调用的场景,确保在文件头部引用:use Mews\Purifier\Facades\Purifier;

$content = request('input_name');
$cleaned = Purifier::clean($content);

方式三:动态配置模式
Purifier 支持根据不同的业务场景应用不同的过滤规则(需先在配置文件 purifier.php 中定义别名):

// 使用名为 'titles' 的配置规则进行过滤
$result = clean($dirty_string, 'titles');

// 或使用门面指定配置键
$result = Purifier::clean($dirty_string, 'titles');

// 亦可临时传入配置覆盖
$result = Purifier::clean($dirty_string, ['Attr.EnableID' => true]);

排错与补充说明

1. 为什么不用传统的 strip_tags + htmlspecialchars?
传统的 PHP 函数如 strip_tags() 仅去除标签但不解析结构,无法应对嵌套错误或伪协议攻击;htmlspecialchars() 虽能转义字符,但会破坏富文本原有的格式化需求。HTMLPurifier 则是基于 HTML 规范的完整解析器,能构建 DOM 树后再重构,安全性远高于前者。

2. 配置文件未生效怎么办?
发布配置后请检查 config/purifier.php 是否存在且可读。如果修改了配置但未生效,尝试清理 Laravel 配置缓存:php artisan config:clear。

3. 关于旧版自定义函数的警告
网络上流传的手写 XSS 过滤函数(如遍历替换特殊字符)往往存在绕过漏洞。在现代 Laravel 开发中,强烈建议使用 Purifier 替代这些不安全的手工实现。

总结

通过在 Laravel 中集成 mews/purifier 并合理配置 HTML.Allowed 白名单,能够以极低的成本解决富文本编辑场景下的 XSS 安全隐患。该方法兼顾了格式保留与安全过滤,是目前 PHP 项目中处理用户输入的标准实践之一。

以上就是 Laravel 集成 Purifier 防止 XSS 跨站攻击的详细内容,更多关于 Laravel Web安全开发的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表