protonemedia/laravel-xss-protection

GitHub: protonemedia/laravel-xss-protection

一款 Laravel 中间件,用于在请求层面清理用户输入,从源头防护 XSS 攻击。

Stars: 148 | Forks: 9

# Laravel XSS 防护中间件 [![Latest Version on Packagist](https://img.shields.io/packagist/v/protonemedia/laravel-xss-protection.svg?style=flat-square)](https://packagist.org/packages/protonemedia/laravel-xss-protection) [![run-tests](https://static.pigsec.cn/wp-content/uploads/repos/2026/04/7b8398ca61073230.svg)](https://github.com/protonemedia/laravel-xss-protection/actions/workflows/run-tests.yml) [![Total Downloads](https://img.shields.io/packagist/dt/protonemedia/laravel-xss-protection.svg?style=flat-square)](https://packagist.org/packages/protonemedia/laravel-xss-protection) 用于保护您的应用程序免受跨站脚本攻击 (XSS) 的 Laravel 中间件。它利用 [voku/anti-xss](https://github.com/voku/anti-xss) 包清理请求输入,并且也能清理 [Blade echo 语句](https://laravel.com/docs/8.x/blade#displaying-data)。该包的灵感来源于 [Security Core](https://github.com/GrahamCampbell/Security-Core) 包。 * PHP 8.2 及更高版本 * Laravel 10 及更高版本 ## PHP 8.4+ 兼容性 此包在 `vendor-lib` 目录中包含了 [voku/portable-utf8](https://github.com/voku/portable-utf8) 的内置版本。上游包尚未发布兼容 PHP 8.4 的版本(修复已合并但未发布标签),因此我们捆绑了修复后的版本,以避免关于隐式可空参数的弃用警告。 ## 安装 您可以通过 composer 安装此包: ``` composer require protonemedia/laravel-xss-protection ``` 您可以使用以下命令发布配置文件: ``` php artisan vendor:publish --tag="xss-protection-config" ``` ## 中间件用法 您可以在处理表单提交的路由中使用 `ProtoneMedia\LaravelXssProtection\Middleware\XssCleanInput` 中间件。 ``` use App\Http\Controllers\CreateAccountController; use ProtoneMedia\LaravelXssProtection\Middleware\XssCleanInput; Route::post('account', CreateAccountController::class)->middleware(XssCleanInput::class); ``` 如果您的应用程序有许多由不同控制器处理的表单,您可以选择将其注册为全局中间件。 ``` // inside app\Http\Kernel.php protected $middleware = [ // ... \ProtoneMedia\LaravelXssProtection\Middleware\XssCleanInput::class, ]; ``` 如果您全局注册了该中间件,可以使用静态 `skipWhen` 方法排除请求。您可以添加一个回调来与请求进行交互: ``` XssCleanInput::skipWhen(function (Request $request) { return $request->is('admin.*'); }); ``` 您还可以使用静态 `skipKeyWhen` 方法排除键。这也允许您与值和请求进行交互。 ``` XssCleanInput::skipKeyWhen(function (string $key, $value, Request $request) { return in_array($key, [ 'current_password', 'password', 'password_confirmation', ]); }); ``` ## 配置 ### 文件上传 默认情况下,中间件允许文件上传。但是,您可以通过将 `middleware.allow_file_uploads` 配置键设置为 `false` 来禁止文件上传。 ### Blade echo 语句 默认情况下,中间件会清理 [Blade echo 语句](https://laravel.com/docs/8.x/blade#displaying-data),例如 `{{ $name }}`、`{{{ $name }}}` 和 `{!! $name !!}`。您可以通过将 `middleware.allow_blade_echoes` 配置键设置为 `true` 来允许 echo 语句。 ### 完全替换恶意输入 默认情况下,中间件会将恶意输入转换为 `null`。您可以通过将 `middleware.completely_replace_malicious_input` 配置键设置为 `false`,将中间件配置为仅转换恶意部分。这样,像 `hey ` 这样的输入字符串将被转换为 `hey` 而不是 `null`。 ### 终止请求 您可以配置中间件在发现任何恶意内容时终止请求,而不是转换恶意输入。您可以通过将 `middleware.terminate_request_on_malicious_input` 设置为 `true` 来实现,这将抛出一个状态码为 403 的 `HttpException`。 ### 分发事件 您可以配置中间件在发现恶意输入时分发一个事件。将 `middleware.dispatch_event_on_malicious_input` 设置为 `true` 将分发一个 `ProtoneMedia\LaravelXssProtection\Events\MaliciousInputFound` 事件,其中包含已清理的键、原始请求和已清理的请求。 ``` use Illuminate\Support\Facades\Event; use ProtoneMedia\LaravelXssProtection\Events\MaliciousInputFound; Event::listen(function (MaliciousInputFound $event) { $event->sanitizedKeys; $event->originalRequest; $event->sanitizedRequest; }); ``` ### `voku/anti-xss` 的附加配置 从 1.6.0 版本开始,您可以为 `voku/anti-xss` 包提供附加配置。您可以通过填充 `middleware.anti_xss` 键来实现。 ``` 'anti_xss' => [ 'evil' => [ 'attributes' => ['href'], 'tags' => ['video'], ], 'replacement' => '*redacted*', ] ``` ## 更新日志 请查看 [CHANGELOG](CHANGELOG.md) 以获取有关最近更改的更多信息。 ## 测试 ``` $ composer test ``` ## 其他 Laravel 包 - [Inertia Modal](https://inertiaui.com/inertia-modal/docs/introduction):使用 Inertia Modal,您可以轻松地在模态框或侧滑抽屉中打开任何路由,而无需更改现有的路由或控制器。 * [`Inertia Table`](https://inertiaui.com/inertia-table?utm_source=github&utm_campaign=laravel-xss-protection):Inertia.js 的终极表格,内置查询构建器。 * [`Laravel Blade On Demand`](https://github.com/protonemedia/laravel-blade-on-demand):用于在内存中编译 Blade 模板的 Laravel 包。 * [`Laravel Cross Eloquent Search`](https://github.com/protonemedia/laravel-cross-eloquent-search):用于在多个 Eloquent 模型中搜索的 Laravel 包。 * [`Laravel Eloquent Scope as Select`](https://github.com/protonemedia/laravel-eloquent-scope-as-select):停止在 PHP 中重复您的 Eloquent 查询作用域和约束。此包允许您通过将它们作为子查询添加来重用查询作用域和约束。 * [`Laravel FFMpeg`](https://github.com/protonemedia/laravel-ffmpeg):此包为 Laravel 提供了与 FFmpeg 的集成。文件的存储由 Laravel 的 Filesystem 处理。 * [`Laravel MinIO Testing Tools`](https://github.com/protonemedia/laravel-minio-testing-tools):针对 MinIO S3 服务器运行您的测试。 * [`Laravel Mixins`](https://github.com/protonemedia/laravel-mixins):Laravel 实用工具集合。 * [`Laravel Paddle`](https://github.com/protonemedia/laravel-paddle):Laravel 的 Paddle.com API 集成,支持 webhooks/events。 * [`Laravel Task Runner`](https://github.com/protonemedia/laravel-task-runner):像编写 Blade 组件一样编写 Shell 脚本,并在本地或远程服务器上运行它们。 * [`Laravel Verify New Email`](https://github.com/protonemedia/laravel-verify-new-email):此包增加了对验证新电子邮件地址的支持:当用户更新其电子邮件地址时,在新地址通过验证之前,它不会替换旧地址。 ## 安全 如果您发现任何与安全相关的问题,请发送电子邮件至 code@protone.media,而不是使用 issue 跟踪器。请不要通过电子邮件提问,如果您有问题,请提出 issue。 ## 许可证 MIT 许可证 (MIT)。请查看 [许可证文件](LICENSE.md) 以获取更多信息。 ## Treeware 此包是 [Treeware](https://treeware.earth)。如果您在生产环境中使用它,我们请求您 [**为世界买一棵树**](https://plant.treeware.earth/pascalbaljetmedia/laravel-analytics-event-tracking) 来感谢我们的工作。通过为 Treeware 森林做贡献,您将为当地家庭创造就业机会并恢复野生动物栖息地。
标签:API密钥检测, Blade 模板, Composer 包, DNS解析, Laravel, OpenVAS, PHP, voku/anti-xss, Web 安全, XSS 防护, 中间件, 代码库, 安全, 开源项目, 数据清洗, 服务端安全, 漏洞修复, 网络安全, 网络安全培训, 超时处理, 跨站脚本攻击, 输入过滤, 输入验证, 防御机制, 隐私保护