ایمن سازی Laravel Reverb – انجمن DEV

هنگام ساخت برنامه های مدرن، لاراول به عنوان یک انتخاب محبوب برای توسعه وب برجسته می شود. با اکوسیستم بزرگ خود، ابزارهایی مانند Laravel Reverb به بهبود تجربه توسعهدهنده کمک میکنند و مدیریت فرآیندهای Backend را آسانتر میکنند. با این حال، مانند هر ابزار دیگری، امنیت باید در اولویت باشد.
من سعی خواهم کرد شیوههای کلیدی و گامهای عملی برای ایمنسازی Laravel Reverb را بررسی کنم و اطمینان حاصل کنم که پیادهسازی شما از آسیبپذیریهای احتمالی در امان است.
1. نقش Laravel Reverb را درک کنید
Laravel Reverb به عنوان یک واسطه پیام و مدیر رویداد عمل می کند و ارتباط بین سرویس ها را تسهیل می کند. بهطور پیشفرض، عمیقاً با صفها و سیستم رویدادهای لاراول ادغام میشود. با این حال، از آنجایی که شامل مدیریت زمان واقعی داده ها می شود، پیکربندی نادرست می تواند عملیات حساس را در معرض حملات قرار دهد.
خطرات بالقوه
- دسترسی غیرمجاز به رویدادهای در صف
- دستکاری داده های رویداد
- نوردهی بیش از حد نقاط پایانی
2. پیکربندی صف خود را ایمن کنید
Laravel Reverb به درایور صف متکی است. سیستم های صف پیکربندی نادرست می تواند منجر به آسیب پذیری شود.
محرک های خاص محیط زیست: از درایورهای امن برای محیط های تولیدی مانند Redis استفاده کنید. از مصرف خودداری کنید database
یا sync
در تولید این درایورها می توانند مسائل مربوط به عملکرد و امنیت را معرفی کنند. را database
درایور بار پایگاه داده قابل توجهی را اضافه می کند و آن را در برابر حملات DoS آسیب پذیر می کند و در صورت به خطر افتادن پایگاه داده به طور بالقوه داده های حساس شغل را در معرض دید قرار می دهد. را sync
راننده کارها را به صورت همزمان اجرا می کند، خطر افشای اطلاعات حساس از طریق خطاها و ایجاد گلوگاه هایی را افزایش می دهد که مهاجمان می توانند از آنها برای بارگذاری بیش از حد برنامه سوء استفاده کنند.
QUEUE_CONNECTION=redis
احراز هویت برای Redis: از یک رمز عبور قوی برای اتصالات Redis استفاده کنید.
REDIS_PASSWORD=your_secure_password
رمزگذاری TLS: اگر از یک صف مبتنی بر ابر از راه دور استفاده می کنید، TLS را برای برقراری ارتباط امن فعال کنید. این امر به ویژه هنگامی که Redis یا سایر درایورهای صف به صورت خارجی میزبانی می شوند بسیار مهم است. برای صف های میزبانی داخلی در یک شبکه امن، TLS ممکن است ضروری نباشد.
3. اعتبارسنجی داده های رویداد
همیشه داده های ارسال شده بین رویدادها و شنوندگان را تأیید کنید. لاراول ابزارهایی را برای اعتبار سنجی ارائه می کند که باید در مراحل ارسال رویداد و شنونده اعمال شوند.
مثال:
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 از سوء استفاده جلوگیری کنید.
Route::middleware('throttle:60,1')->group(function () {
Route::post('/reverb/dispatch', [ReverbController::class, 'dispatch']);
});
5. پیکربندی امن کانال
کانال های Laravel Reverb تعیین می کنند که رویدادها چگونه پخش می شوند و چه کسی می تواند به آنها دسترسی داشته باشد. کانالهای پیکربندی نادرست میتوانند دادههای حساس را افشا کنند یا اجازه دسترسی غیرمجاز را بدهند.
کانال های عمومی:
کانال های عمومی برای هر کسی که نام کانال را می داند قابل دسترسی است. از استفاده از کانال های عمومی برای اطلاعات حساس خودداری کنید.
مثال:
Broadcast::channel('public-channel', function () {
return true;
});
از کانالهای عمومی فقط برای دادههای غیر حساس مانند اعلانها یا بهروزرسانیهای عمومی استفاده کنید.
کانال های خصوصی:
کانال های خصوصی قبل از پیوستن نیاز به احراز هویت دارند. از اینها برای رویدادهای مرتبط با کاربران احراز هویت شده استفاده کنید.
مثال:
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
});
6. اضافه بار ذخیره سازی صف
اضافه بار صف زمانی اتفاق می افتد که تعداد زیادی کار به طور همزمان اضافه می شود و باعث تاخیر می شود. از میانافزار ThrottlesExceptions لاراول برای محدود کردن پردازش کار (مثلاً 5 شغل در ثانیه) و مدیریت کارگران با ابزارهایی مانند Supervisor برای اطمینان از ثبات سیستم استفاده کنید.
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');
}
}
7. حملات بازپخش رویداد
حملات تکراری، رویدادهای رهگیری شده را مجددا ارسال می کنند تا از سیستم شما سوء استفاده کنند. شناسهها و مُهرهای زمانی منحصربهفرد را به رویدادها اضافه کنید، آنها را در سرویس گیرنده و سرور اعتبارسنجی کنید تا از تکراریها جلوگیری کنید و اطمینان حاصل کنید که فقط رویدادهای تازه پردازش میشوند.
پیاده سازی رمز منحصر به فرد:
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'];
}
}
با ردیابی شناسه منحصربفرد در سمت مشتری، از مدیریت تکراری یک رویداد جلوگیری کنید:
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);
}
});
اطمینان حاصل کنید که مهرهای زمانی رویداد با استفاده از میان افزار جدید هستند:
namespace App\Http\Middleware;
use Closure;
class PreventEventReplay
{
public function handle($request, Closure $next)
{
$timestamp = $request->header('X-Timestamp');
if (abs(time() - $timestamp) > 10) { // Allow a 10-second window
return response()->json(['error' => 'Invalid or stale request.'], 400);
}
return $next($request);
}
}
8. اتصالات SSL Backend ایمن
حتی اگر از سرویسی مانند Cloudflare به عنوان یک پروکسی برای مدیریت SSL در لبه استفاده می کنید، مهم است که SSL را در VirtualHost خود روی سرور پیکربندی کنید. این امر رمزگذاری سرتاسر را تضمین می کند و خطرات احتمالی را کاهش می دهد.
پیاده سازی:
1. Certbot را نصب کنید و گواهی دریافت کنید:
sudo certbot --apache
2. VirtualHost خود را برای استفاده از SSL به روز کنید:
ServerName yourdomain.com
DocumentRoot /var/www/html
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/yourdomain.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/yourdomain.com/privkey.pem
3. حالت Full (Strict) SSL را در Cloudflare فعال کنید.
9. از HTTPS برای همه ارتباطات استفاده کنید
برای اطمینان از ارتباط امن بین Reverb و کلاینت ها یا سرورها، از HTTPS استفاده کنید. متغیرهای محیطی زیر را با تمرکز خاص روی تنظیمات بهروزرسانی کنید REVERB_SCHEME
و REVERB_PORT
برای اطمینان از استفاده از پروتکل HTTPS و پورت امن 443:
REVERB_HOST=example.com
REVERB_PORT=443
REVERB_SCHEME=https
REVERB_APP_ID=secure_app_id
REVERB_APP_KEY=secure_app_key
REVERB_APP_SECRET=secure_app_secret
VITE_REVERB_APP_KEY="${REVERB_APP_KEY}"
VITE_REVERB_HOST=example.com
VITE_REVERB_PORT=443
VITE_REVERB_SCHEME=https