首页 > 后端开发 > php教程 > 保护 Laravel Reverb 的安全

保护 Laravel Reverb 的安全

Barbara Streisand
发布: 2025-01-01 06:00:19
原创
610 人浏览过

Securing Laravel Reverb

在构建现代应用程序时,Laravel 脱颖而出,成为 Web 开发的流行选择。凭借其庞大的生态系统,Laravel Reverb 等工具有助于增强开发人员体验,从而更轻松地管理后端流程。然而,与任何工具一样,安全性必须是重中之重。

我将尝试探索关键实践和可行步骤来保护 Laravel Reverb 并确保您的实现免受潜在漏洞的影响。

1​.了解 Laravel Reverb 的作用

Laravel Reverb 充当消息代理和事件管理器,促进服务之间的通信。默认情况下,它与 Laravel 的队列和事件系统深度集成。然而,由于它涉及实时数据处理,错误配置可能会使敏感操作遭受攻击。

潜在风险

  • 未经授权访问排队事件。
  • 操作事件数据。
  • 端点过度曝光。

2​.保护您的队列配置

Laravel Reverb 依赖于队列驱动程序。配置错误的队列系统可能会导致漏洞。

环境特定驱动程序:为 Redis 等生产环境使用安全驱动程序。避免在生产中使用数据库或同步。这些驱动程序可能会带来性能和安全问题。数据库驱动程序会增加大量数据库负载,使其容易受到 DoS 攻击,并且如果数据库受到损害,可能会暴露敏感作业数据。同步驱动程序同步执行作业,增加了因错误而暴露敏感信息的风险,并造成攻击者可利用的瓶颈来使应用程序过载。

QUEUE_CONNECTION=redis
登录后复制
登录后复制

Redis 身份验证: 对 Redis 连接使用强密码。

REDIS_PASSWORD=your_secure_password
登录后复制
登录后复制

TLS 加密: 如果远程使用基于云的队列,请启用 TLS 以实现安全通信。当 Redis 或其他队列驱动程序托管在外部时,这一点尤其重要。对于安全网络上的内部托管队列,可能不需要 TLS。

3​.验证事件数据

始终验证事件和侦听器之间传递的数据。 Laravel 提供了验证工具,应在事件调度和监听阶段应用。

示例:

use Illuminate\Support\Facades\Validator;

class SecureEvent
{
    public function __construct(array $data)
    {
        Validator::make($data, [
            'user_id' => 'required|integer',
            'action'  => 'required|string|max:255',
        ])->validate();

        $this->data = $data;
    }
}
登录后复制
登录后复制

4​.安全 API 端点

Laravel Reverb 经常公开用于管理事件和队列的 API 端点。限制对这些端点的访问。

示例:

中间件保护:使用身份验证和授权中间件。

Route::middleware(['auth:sanctum', 'verified'])->group(function () {
    Route::post('/reverb/dispatch', [ReverbController::class, 'dispatch']);
});
登录后复制
登录后复制

速率限制:通过限制 API 请求来防止滥用。

QUEUE_CONNECTION=redis
登录后复制
登录后复制

5​.安全通道配置

Laravel Reverb 通道决定事件的广播方式以及谁可以访问它们。配置错误的通道可能会暴露敏感数据或允许未经授权的访问。

公共频道:

任何知道频道名称的人都可以访问公共频道。避免使用公共渠道获取敏感信息。

示例:

REDIS_PASSWORD=your_secure_password
登录后复制
登录后复制

仅将公共渠道用于非敏感数据,例如通知或一般更新。

私人频道:

私人频道在加入前需要身份验证。将它们用于与经过身份验证的用户相关的事件。

示例:

use Illuminate\Support\Facades\Validator;

class SecureEvent
{
    public function __construct(array $data)
    {
        Validator::make($data, [
            'user_id' => 'required|integer',
            'action'  => 'required|string|max:255',
        ])->validate();

        $this->data = $data;
    }
}
登录后复制
登录后复制

存在频道:

在线通道通过允许服务器实时跟踪哪些用户在线来扩展私人通道。实施严格的身份验证,防止未经授权的访问。

示例:

Route::middleware(['auth:sanctum', 'verified'])->group(function () {
    Route::post('/reverb/dispatch', [ReverbController::class, 'dispatch']);
});
登录后复制
登录后复制

6​.队列存储过载

当一次添加太多作业时会发生队列过载,从而导致延迟。使用 Laravel 的 ThrottlesExceptions 中间件来限制作业处理(例如 5 个作业/秒)并使用 Supervisor 等工具管理工作人员以确保系统稳定性。

Route::middleware('throttle:60,1')->group(function () {
    Route::post('/reverb/dispatch', [ReverbController::class, 'dispatch']);
});
登录后复制

7​.事件重放攻击

重放攻击重新发送拦截的事件以利用您的系统。向事件添加唯一的 ID 和时间戳,在客户端和服务器上验证它们以防止重复并确保仅处理新事件。

实施唯一令牌:

Broadcast::channel('public-channel', function () {
    return true;  
});
登录后复制

通过在客户端跟踪 uniqueId 来防止重复处理同一事件:

Broadcast::channel('private-channel.{userPublicId}', function ($user, $userPublicId) {
    return $user->public_id === $userPublicId && auth()->check(); // Ensure Public ID matches and user is authenticated
});
登录后复制

使用中间件确保事件时间戳是最近的:

Broadcast::channel('presence-channel.{roomId}', function ($user, $roomId) {
    return $user->isInRoom($roomId); // Validate room access
});
登录后复制

8​.安全后端 SSL 连接

即使您使用 Cloudflare 等服务作为代理来处理边缘的 SSL,在服务器上的 VirtualHost 中配置 SSL 也很重要。这可确保端到端加密并降低潜在风险。

实施:

1​。安装Certbot并获取证书:

namespace App\Jobs;

use Log;
use Illuminate\Bus\Queueable;
use Illuminate\Queue\Middleware\ThrottlesExceptions;
use Illuminate\Contracts\Queue\ShouldQueue;

class ProcessNotification implements ShouldQueue
{
    use Queueable;

    public function middleware()
    {
        // Throttle: Allow max 5 jobs per second for this queue
        return [new ThrottlesExceptions(5, 1)];
    }

    public function handle()
    {
        // Logic to process the notification
        Log::info('Processing notification');
    }
}
登录后复制

2​。更新您的虚拟主机以使用 SSL:

namespace App\Events;

use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Support\Str;

class ChatMessageSent implements ShouldBroadcast
{
    use Dispatchable, InteractsWithSockets;

    public string $message;
    public string $uniqueId; // Prevent replay attacks
    public int $timestamp;

    public function __construct(string $message)
    {
        $this->message = $message;
        $this->uniqueId = Str::uuid();
        $this->timestamp = time();
    }

    public function broadcastWith()
    {
        return [
            'message' => $this->message,
            'uniqueId' => $this->uniqueId,
            'timestamp' => $this->timestamp,
        ];
    }

    public function broadcastOn()
    {
        return ['chat-room'];
    }
}
登录后复制

3​。在 Cloudflare 中启用完整(严格)SSL 模式。

9​.所有通信均使用 HTTPS

为了确保 Reverb 与客户端或服务器之间的安全通信,请使用 HTTPS。更新以下环境变量,特别关注设置 REVERB_SCHEME 和 REVERB_PORT 以确保使用 HTTPS 协议和安全端口 443:

const processedEvents = new Set();

Echo.channel('chat-room')
    .listen('ChatMessageSent', (event) => {
        if (!processedEvents.has(event.uniqueId)) {
            processedEvents.add(event.uniqueId);
            console.log('New message:', event.message);
        }
    });

登录后复制

以上是保护 Laravel Reverb 的安全的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:dev.to
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板