برنامه نویسی

ایمن سازی 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
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا