ozankurt/laravel-security

Laravel 的 Web 应用防火墙 (WAF) 包

0.1.2 2024-09-09 00:00 UTC

This package is auto-updated.

Last update: 2024-09-09 00:01:08 UTC


README

Downloads Tests StyleCI License

此包旨在保护您的 Laravel 应用免受各种攻击,例如 XSS、SQLi、RFI、LFI、用户代理等。它还会阻止重复攻击,并在检测到攻击时通过电子邮件和/或 Slack 发送通知。此外,它还会记录失败的登录尝试,并在多次尝试后阻止 IP 地址。

注意:某些中间件类(例如 Xss)为空,因为它们继承的 Middleware 抽象类会动态地完成所有工作。简而言之,它们都起作用;)

入门指南

1. 安装

运行以下命令

composer require ozankurt/laravel-security

2. 发布

发布配置、语言和迁移

php artisan vendor:publish --tag=security

3. 数据库

创建数据库表

php artisan migrate

4. 配置

您可以从 config/security.php 文件更改应用的安全设置

使用方法

中间件已经定义,因此只需将它们添加到路由中。firewall.all 中间件应用于配置文件 all_middleware 数组中可用的所有中间件。

Route::group(['middleware' => 'firewall.all'], function () {
    Route::get('/', 'HomeController@index');
});

您可以为每个路由应用每个中间件。例如,您可以让只有白名单中的 IP 地址访问管理员界面

Route::group(['middleware' => 'firewall.whitelist'], function () {
    Route::get('/admin', 'AdminController@index');
});

或者您可以通过将其添加到 inspections 配置中,在 whitelist 之外的人访问管理员界面时收到通知

Route::group(['middleware' => 'firewall.url'], function () {
    Route::get('/admin', 'AdminController@index');
});

适用于路由的可用中间件

firewall.all

firewall.agent
firewall.bot
firewall.geo
firewall.ip
firewall.lfi
firewall.php
firewall.referrer
firewall.rfi
firewall.session
firewall.sqli
firewall.swear
firewall.url
firewall.whitelist
firewall.xss
firewall.keyword

您还可以在 config/security.php 中为每个中间件定义 routes,并在所有路由的顶部应用该中间件或 firewall.all

通知

一旦检测到攻击,防火墙就会发送通知。在 notifications.email.to 配置中输入的电子邮件必须为有效的 Laravel 用户,以便发送通知。有关更多信息,请参阅 Laravel 的通知文档。

仪表板

要查看仪表板,您必须在 AppServiceProvider 中启用它

    use App\Models\User;
    use Illuminate\Support\Facades\Gate;

    /**
     * Bootstrap any application services.
     */
    public function boot(): void
    {
        Gate::define('viewSecurityDashboard', function (?User $user) {
            return $user?->id === 1;
        });

        // ...
    }

.env 变量

FIREWALL_ENABLED=true
FIREWALL_WHITELIST="127.0.0.0/24"

FIREWALL_DASHBOARD_ENABLED=true

FIREWALL_DB_CONNECTION="${DB_CONNECTION}"
FIREWALL_DB_PREFIX=security_

FIREWALL_CRON_ENABLED=false
FIREWALL_CRON_EXPRESSION="* * * * *"

FIREWALL_NOTIFICATIONS_ATTACK_DETECTED_ENABLED=false
FIREWALL_NOTIFICATIONS_SECURITY_REPORT_ENABLED=false
FIREWALL_NOTIFICATIONS_SUCCESSFUL_LOGIN_ENABLED=false

FIREWALL_NOTIFICATION_CHANNELS_EMAIL_ENABLED=false
FIREWALL_NOTIFICATION_CHANNELS_EMAIL_NAME="${MAIL_FROM_NAME}"
FIREWALL_NOTIFICATION_CHANNELS_EMAIL_FROM="${MAIL_FROM_ADDRESS}"
FIREWALL_NOTIFICATION_CHANNELS_EMAIL_TO="webmaster@example.com"
FIREWALL_NOTIFICATION_CHANNELS_EMAIL_QUEUE=default

FIREWALL_NOTIFICATION_CHANNELS_SLACK_ENABLED=false
FIREWALL_NOTIFICATION_CHANNELS_SLACK_EMOJI=":fire:"
FIREWALL_NOTIFICATION_CHANNELS_SLACK_FROM="Laravel Security"
FIREWALL_NOTIFICATION_CHANNELS_SLACK_TO= # webhook url
FIREWALL_NOTIFICATION_CHANNELS_SLACK_CHANNEL=null
FIREWALL_NOTIFICATION_CHANNELS_SLACK_QUEUE=default

FIREWALL_NOTIFICATION_CHANNELS_DISCORD_ENABLED=false
FIREWALL_NOTIFICATION_CHANNELS_DISCORD_WEBHOOK_URL=
FIREWALL_NOTIFICATION_CHANNELS_DISCORD_QUEUE=default

FIREWALL_NOTIFICATION_CHANNELS_DISCORD_FROM="Laravel Security"
FIREWALL_NOTIFICATION_CHANNELS_DISCORD_FROM_IMG=https://ozankurt.com/laravel-security.png
FIREWALL_NOTIFICATION_CHANNELS_DISCORD_ROUTE=
FIREWALL_NOTIFICATION_CHANNELS_DISCORD_TITLE="Attack Detected"
FIREWALL_NOTIFICATION_CHANNELS_DISCORD_FOOTER="Laravel Security"
FIREWALL_NOTIFICATION_CHANNELS_DISCORD_FOOTER_IMG=https://ozankurt.com/laravel-security.png

FIREWALL_MIDDLEWARE_IP_ENABLED=true
FIREWALL_MIDDLEWARE_AGENT_ENABLED=true
FIREWALL_MIDDLEWARE_BOT_ENABLED=true
FIREWALL_MIDDLEWARE_GEO_ENABLED=true
FIREWALL_MIDDLEWARE_LFI_ENABLED=true
FIREWALL_MIDDLEWARE_LOGIN_ENABLED=true
FIREWALL_MIDDLEWARE_PHP_ENABLED=true
FIREWALL_MIDDLEWARE_REFERRER_ENABLED=true
FIREWALL_MIDDLEWARE_RFI_ENABLED=true
FIREWALL_MIDDLEWARE_SESSION_ENABLED=true
FIREWALL_MIDDLEWARE_SQLI_ENABLED=true
FIREWALL_MIDDLEWARE_SWEAR_ENABLED=true
FIREWALL_MIDDLEWARE_URL_ENABLED=true
FIREWALL_MIDDLEWARE_WHITELIST_ENABLED=true
FIREWALL_MIDDLEWARE_XSS_ENABLED=true
FIREWALL_MIDDLEWARE_KEYWORD_ENABLED=true

更新日志

请参阅 发布 以获取有关最近更改的更多信息。

贡献

欢迎拉取请求。您必须遵循 PSR 编码标准。

安全

请查看 我们的安全策略 了解如何报告安全漏洞。

致谢

待办事项

  • logs/ips 数据表
  • 按国家分解 ip -> 数据表 + 图表
  • 按攻击类型分解 -> 数据表 + 图表

许可

MIT 许可证 (MIT)。请参阅 LICENSE 以获取更多信息。