首頁 > 後端開發 > 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
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板