مقالات

امنیت وب لاراول: جعل درخواست بین سایتی (CSRF) چیست؟

در این آموزش لاراول در مورد امنیت وب و نحوه محافظت از یک برنامه وب در برابر حملات جعل درخواست Cross-Site یا CSRF صحبت می کنیم.

CSRF یک فعالیت مخرب است که توسط یک مهاجم انجام می شود، که اقداماتی را از طرف یک کاربر تأیید شده انجام می دهد که برای امنیت وب مضر است. خوشبختانه لاراول ابزارهایی را برای جلوگیری از این نوع آسیب پذیری ارائه می دهد.

CSRF چیست؟

حملات CSRF جلسات کاربر را ربوده است. آنها این کار را با فریب دادن کاربر برای ارسال درخواست از طریق برچسب های فرم مخفی یا URL های مخرب (تصاویر یا پیوندها) بدون اطلاع کاربر انجام می دهند.

این حمله منجر به تغییر در وضعیت جلسه کاربر، نشت داده ها می شود و گاهی اوقات هکرها می توانند داده های کاربر نهایی را در یک برنامه دستکاری کنند.

تصویر بالا سناریویی را نشان می دهد که در آن امنیت وب نقض شده است. قربانی با کلیک بر روی یک پیوند (دریافت شده)، درخواستی را به سرور وب سایت ارسال می کند که اثرات مورد نظر هکر را ایجاد می کند که اطلاعات مفید برای دسترسی و دستکاری سرور وب سایت را در اختیار دارد.

نحوه جلوگیری از درخواست های CSRF

برای بهبود امنیت وب اپلیکیشن های شما، در هر جلسه کاربر، لاراول توکن های امنی تولید می کند که از آنها برای اطمینان از اینکه کاربر احراز هویت شده درخواست کننده برنامه است، استفاده می کند.

از آنجا که این توکن هر بار که یک جلسه کاربر بازسازی می شود تغییر می کند، مهاجم نمی تواند به آن دسترسی داشته باشد.

هر زمان که درخواست تغییر اطلاعات کاربر در سمت سرور (بک‌اند) مانند POSTPUTPATCHDELETE، باید بخشنامه را وارد کنید @csrf در فرم درخواست blade HTML. را @csrf بنابراین یک بخشنامه است Blade برای تولید یک توکن مخفی تایید شده توسط برنامه استفاده می شود.

بخشنامه Blade سینتکسی است که در موتور قالب لاراول استفاده می شود تیغه . برای ایجاد یک فایل blade شما باید به آن یک نام بدهید - به شکل موردی ما - به دنبال گسترش تیغه. این به این معنی است که فایل دارای نام خواهد بود form.blade.php.

فایل استفاده می شود blade برای ارائه نماها برای کاربران در صفحه وب. چند دستورالعمل از قبل وجود داردdefiمی توانید از نحو مختصر nite یا blade استفاده کنید. مثلا، @if بررسی کنید که آیا یک شرط برآورده شده است، @empty بررسی کنید که آیا سوابق خالی نیستند، @auth بررسی کنید که آیا یک کاربر احراز هویت شده است و غیره.

اما به بخشنامه برگردیم @csrf. در اینجا نحوه استفاده از آن آمده است:

<form method="POST" action="{{route('pay')}}">

    @csrf
    
</form>

نسخه های قبلی لاراول تنظیمات متفاوتی داشتند: هم کار می کنند و هم یک کار را انجام می دهند.

خبرنامه نوآوری
مهم ترین اخبار نوآوری را از دست ندهید. برای دریافت آنها از طریق ایمیل ثبت نام کنید.
<form method="POST" action="{{route('pay')}}">
    
    <input type="hidden" name="_token" value="{{ csrf_token() }}" />
    
</form>

هنگامی که توکن CSRF در درخواست فرم ارسال شده وجود ندارد یا اگر نامعتبر به نظر برسد، لاراول یک پیغام خطای "Page Expired" با کد وضعیت 419 ارسال می کند.

چگونه و کجا تأیید CSRF انجام می شود

میان افزار VerifyCsrfToken تأیید CSRF را در برنامه لاراول انجام می دهد. را middleware ثبت شده است در Kernel.php و در دایرکتوری قرار دارد app/Http/Middleware. این بدان معنی است که middleware برای درخواست های داخل وب، غیر مرتبط با API ها، راه اندازی می شود.

protected $middlewareGroups = [
        'web' => [
           .
           .
           .
           .
           .
            \App\Http\Middleware\VerifyCsrfToken::class,
        ],
    ];

میان افزار VerifyCsrfToken کلاس را گسترش می دهد Illuminate\Foundation\Http\Middleware\VerifyCsrfToken، یعنی تأیید CSRF است defiداخل کلاس درس

بیایید عمیق‌تر بگردیم تا بفهمیم لاراول چگونه تأیید CSRF را مدیریت می‌کند.

در داخل کلاس، تابع را داریم tokensMatch.

protected function tokensMatch($request)
{
     $token = $this->getTokenFromRequest($request);

     return is_string($request->session()->token()) &&
            is_string($token) &&
            hash_equals($request->session()->token(), $token);
}

در کد تعیین می کند که آیا جلسه و توکن های ورودی CSRF مطابقت دارند یا خیر.

تابع دو کار انجام می دهد:

  1. گرفتن $this->getTokenFromRequest توکن درخواست ورودی که از طریق یک فیلد مخفی یا هدر درخواست پیوست شده است. رمز رمزگشایی شده و سپس به متغیر توکن بازگردانده می شود.
protected function getTokenFromRequest($request)
{
    $token = $request->input('_token') ?: $request->header('X-CSRF-TOKEN');

    if (! $token && $header = $request->header('X-XSRF-TOKEN')) {
        try {
            $token = CookieValuePrefix::remove($this->encrypter->decrypt($header, static::serialized()));
        } catch (DecryptException $e) {
            $token = '';
            }
    }

    return $token;
}

در کد از هدر توکن می گیرد

2. هم توکن درخواست و هم جلسه را به یک رشته ارسال کنید و سپس استفاده کنید hash_equals ساخته شده در PHP برای مقایسه اگر هر دو رشته برابر هستند. نتیجه این عملیات همیشه است bool (درست) یا (نادرست) .

Ercole Palmeri

خبرنامه نوآوری
مهم ترین اخبار نوآوری را از دست ندهید. برای دریافت آنها از طریق ایمیل ثبت نام کنید.

مقالات اخیر

آینده اینجاست: چگونه صنعت کشتیرانی اقتصاد جهانی را متحول می کند

بخش دریایی یک قدرت واقعی اقتصادی جهانی است که به سمت یک بازار 150 میلیاردی حرکت کرده است.

1 می 2024

ناشران و OpenAI توافق نامه هایی را برای تنظیم جریان اطلاعات پردازش شده توسط هوش مصنوعی امضا می کنند.

دوشنبه گذشته، فایننشال تایمز از قراردادی با OpenAI خبر داد. FT مجوز روزنامه نگاری در سطح جهانی خود را صادر می کند…

آوریل 30 2024

پرداخت های آنلاین: در اینجا نحوه پرداخت خدمات جریانی شما را برای همیشه توضیح می دهد

میلیون‌ها نفر برای خدمات استریم پرداخت می‌کنند و هزینه اشتراک ماهانه می‌پردازند. این عقیده رایج است که شما…

آوریل 29 2024

Veeam دارای جامع ترین پشتیبانی از باج افزار، از محافظت تا پاسخ و بازیابی است

Coveware توسط Veeam به ارائه خدمات پاسخگویی به حوادث اخاذی سایبری ادامه خواهد داد. Coveware قابلیت‌های پزشکی قانونی و اصلاحی را ارائه می‌دهد…

آوریل 23 2024

نوآوری را به زبان خود بخوانید

خبرنامه نوآوری
مهم ترین اخبار نوآوری را از دست ندهید. برای دریافت آنها از طریق ایمیل ثبت نام کنید.

ما را دنبال کنید