جدول المحتويات
يوفر إطار العمل لارافيل بشكل إفتراضي الحماية من ثغرة 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 المعرفة مسبقاً.
في أحد التطبيقات التي كنت أعمل عليها كان يتم إرسال بيانات لموقع أخر وأنتظر إستجابه من ذلك الموقع، والإستجابه كانت عبارة عن 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
مجهود اكثر من رائع استفيد منك كثيرا شكرا جزيلا