在建立現代應用程式時,Laravel 脫穎而出,成為 Web 開發的流行選擇。憑藉其龐大的生態系統,Laravel Reverb 等工具有助於增強開發人員體驗,從而更輕鬆地管理後端流程。然而,與任何工具一樣,安全性必須是首要任務。
我將嘗試探索關鍵實踐和可行步驟來保護 Laravel Reverb 並確保您的實現免受潛在漏洞的影響。
Laravel Reverb 充當訊息代理和事件管理器,促進服務之間的通訊。預設情況下,它與 Laravel 的佇列和事件系統深度整合。然而,由於它涉及即時資料處理,錯誤配置可能會使敏感操作遭受攻擊。
潛在風險
Laravel Reverb 依賴佇列驅動程式。配置錯誤的佇列系統可能會導致漏洞。
環境特定驅動程式:為 Redis 等生產環境使用安全驅動程式。避免在生產中使用資料庫或同步。這些驅動程式可能會帶來效能和安全性問題。資料庫驅動程式會增加大量資料庫負載,使其容易受到 DoS 攻擊,並且如果資料庫受到損害,可能會暴露敏感作業資料。同步驅動程式同步執行作業,增加了因錯誤而暴露敏感資訊的風險,並造成攻擊者可利用的瓶頸來使應用程式過載。
QUEUE_CONNECTION=redis
Redis 驗證: 對 Redis 連線使用強密碼。
REDIS_PASSWORD=your_secure_password
TLS 加密: 如果遠端使用基於雲端的佇列,請啟用 TLS 以實現安全通訊。當 Redis 或其他佇列驅動程式託管在外部時,這一點尤其重要。對於安全網路上的內部託管佇列,可能不需要 TLS。
始終驗證事件和偵聽器之間傳遞的資料。 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; } }
Laravel Reverb 經常公開用於管理事件和佇列的 API 端點。限制對這些端點的存取。
範例:
中介軟體保護:使用驗證和授權中間件。
Route::middleware(['auth:sanctum', 'verified'])->group(function () { Route::post('/reverb/dispatch', [ReverbController::class, 'dispatch']); });
速率限制:透過限制 API 請求來防止濫用。
QUEUE_CONNECTION=redis
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']); });
當一次新增太多作業時會發生佇列過載,從而導致延遲。使用 Laravel 的 ThrottlesExceptions 中間件來限製作業處理(例如 5 個作業/秒)並使用 Supervisor 等工具管理工作人員以確保系統穩定性。
Route::middleware('throttle:60,1')->group(function () { Route::post('/reverb/dispatch', [ReverbController::class, 'dispatch']); });
重播攻擊重新發送攔截的事件以利用您的系統。為事件新增唯一的 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 });
即使您使用 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 模式。
為了確保 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中文網其他相關文章!