تعطيل الحماية من ثغرة CSRF على مسارات Route معينة في لارافيل

تعطيل الحماية من ثغرة CSRF على مسارات Route معينة في لارافيل

2024-05-14 وقت القراءه : 3 دقائق

جدول المحتويات


ما هي ثغرة CSRF؟

يوفر إطار العمل لارافيل بشكل إفتراضي الحماية من ثغرة CSRF والتي تمكن المخترق من إجبار المستخدم أو إداري الموقع على فعل وظيفة غير مرغوب فيها مثل إضافة أداري جديد أو تغيير كلمة المرور دون علم إداري الموقع أو المستخدم.

 

كيف يحمي إطار العمل لارافيل من ثغرة CSRF

في لارافيل يوجد middleware باسم verifyCsrfToken في المسار 

vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/VerifyCsrfToken.php


حيث يحتوي الكلاس على دالة handle يتم تنفيذها في كل طلب Http.


public function handle($request, Closure $next)
{
    if (
        $this->isReading($request) ||
        $this->runningUnitTests() ||
        $this->inExceptArray($request) ||
        $this->tokensMatch($request)
    ) {
        return tap($next($request), function ($response) use ($request) {
            if ($this->shouldAddXsrfTokenCookie()) {
                $this->addCookieToResponse($request, $response);
            }
        });
    }
 
    throw new TokenMismatchException('CSRF token mismatch.');
}

 

في الدالة أعلاه نلاحظ أنه إذا لم ترجع $this->isReading و $this->tokensMatch القيمة true، فإنه سيتم إرجاع إستثناء TokenMismatchException.

حيث أن $this->Reading تنظر إلى نوع الطلب 

protected function isReading($request)
{
    return in_array($request->method(), ['HEAD', 'GET', 'OPTIONS']);
}

فإذا لم يكن من ضمن الأنواع المعرفة وهي GET, HEAD, OPTIONS فيجب أن يتوافق  _token المرسل مع _token المعرف مسبقا، وإذا لم يتوافق فإنه سيتم إرجاع رسالة CSRF token mismatch، لذلك نقوم نحن بإرسالة قيمة _token مع كل طلب http ويجب أن يتوافق مع قيمة _token المعرفة مسبقاً.

 

 

تعطيل التحقق من ثغرات CSRF لبعض المسارات Routes.

في أحد التطبيقات التي كنت أعمل عليها كان يتم إرسال بيانات لموقع أخر وأنتظر إستجابه من ذلك الموقع، والإستجابه كانت عبارة عن POST Request، بالطبع لا أستطيع التحكم بالموقع الأخر لكي يرسل قيمة _token، وإن أرسلها لن تتوافق مع التطبيق الذي أعمل عليه، في هذه الحالة كنت مظطراً لإلغاء حماية التحقق من الثغره عن رابط موقع الإستجابة.

 

وللقيام بذلك يجب الذهاب إلى middleware class باسم  VefifyCsrfToken والموجود في المسار 

App\Http\Middleware\VerifyCsrfToken 
namespace App\Http\Middleware;
 
use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as Middleware;
 
class VerifyCsrfToken extends Middleware
{
    /**
     * The URIs that should be excluded from CSRF verification.
     *
     * @var array
     */
    protected $except = [
        //
    ];
}

وهو يرث الكلاس VerifyCsrfToken الموجود في المسار 

vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/VerifyCsrfToken.php

 

حيث يمكننا من الوصول إلى دالة $except، وبها نضع الروابط التي نريد عمل استثناء لها.

class VerifyCsrfToken extends Middleware
{
    /**
     * The URIs that should be excluded from CSRF verification.
     *
     * @var array
     */
    protected $except = [
        'https://etharshrouf.com/responseCredit',//just this link
        'https://etharshrouf.com/responseCredit/*',//this link and parameters.
    ];
}

التعليقات
Youssef
منذ سنة

مجهود اكثر من رائع استفيد منك كثيرا شكرا جزيلا

tohami
منذ سنة

كلام جميل جدا جدا عاش نضال الشعب الفلسطيني

إضافة تعليق
Loading...