protonemedia/laravel-xss-protection
GitHub: protonemedia/laravel-xss-protection
一款 Laravel 中间件,用于在请求层面清理用户输入,从源头防护 XSS 攻击。
Stars: 148 | Forks: 9
# Laravel XSS 防护中间件
[](https://packagist.org/packages/protonemedia/laravel-xss-protection)
[](https://github.com/protonemedia/laravel-xss-protection/actions/workflows/run-tests.yml)
[](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 防护, 中间件, 代码库, 安全, 开源项目, 数据清洗, 服务端安全, 漏洞修复, 网络安全, 网络安全培训, 超时处理, 跨站脚本攻击, 输入过滤, 输入验证, 防御机制, 隐私保护