الفرق بين المراجعتين لصفحة: «Laravel/csrf»

من موسوعة حسوب
ط استبدال النص - '\[\[تصنيف:(.*)\]\]' ب'{{SUBPAGENAME}}'
 
(6 مراجعات متوسطة بواسطة مستخدمين اثنين آخرين غير معروضة)
سطر 1: سطر 1:
 
<noinclude>{{DISPLAYTITLE:الحماية CSRF في Laravel}}</noinclude>
<noinclude>{{DISPLAYTITLE:الحماية CSRF}}</noinclude>
== مقدمة ==
 
== مقدّمة ==
يُسهّل Laravel حماية تطبيقك من الهجمات مُزوّرة الطلب عبر المواقع (cross-site request forgery) واختصارها CSRF. تزويرات الطلب عبر المواقع هن نوع من الاستغلال تُنفّذ فيها أوامر غير مُرخّصة نيابة عن المستخدم المصادق عليهالمُستوثق (authenticated user).
يُسهّل Laravel حماية تطبيقك من الهجمات مُزوّرة الطلب عبر المواقع (cross-site request forgery) واختصارها CSRF. تزويرات الطلب عبر المواقع هن نوع من الاستغلال تُنفّذ فيها أوامر غير مُرخّصة نيابة عن المستخدم المصادق عليهالمُستوثق (authenticated user).


يُولّد Laravel تلقائيًّا "رمز" CSRF لكل جلسة مستخدم نشطة يديرها التطبيق. يُستخدم هذا الرمز (token) للتحقّق من كون المستخدم المصادق عليه نفس الشخص الذي يقدّم الطلبات للتطبيق.
يُولّد [[Laravel]] تلقائيًّا "رمز" CSRF لكل جلسة مستخدم نشطة يديرها التطبيق. يُستخدم هذا الرمز (token) للتحقّق من كون المستخدم المصادق عليه نفس الشخص الذي يقدّم الطلبات للتطبيق.


يجب أن تضيف حقل CSRF مخفي في كل مرّة تعرّف فيها نموذجًا HTML في تطبيقك كي تتثبت برمجيّة الحماية CSRF الوسيطة من الطلب. تستطيع استخدام توجيه Blade المسمّى <code>csrf@</code> لتوليد حقل الرمز:<syntaxhighlight lang="html">
يجب أن تضيف حقل CSRF مخفي في كل مرّة تعرّف فيها نموذج [[HTML]] في تطبيقك كي تتثبت برمجيّة الحماية CSRF الوسيطة من الطلب. تستطيع استخدام توجيه [[Laravel/blade|Blade]] المسمّى <code>csrf@</code> لتوليد حقل الرمز:<syntaxhighlight lang="html">
<form method="POST" action="/profile">
<form method="POST" action="/profile">


سطر 17: سطر 15:
</syntaxhighlight>ستتحقق البرمجيّة الوسيطة <code>VerifyCsrfToken</code> المحتواة في مجموعة البرمجيّة الوسيطة <code>web</code> تلقائيًّا من تطابق الرمز المُخزّن في الجلسة مع الرمز الموجود في طلب الإدخال.
</syntaxhighlight>ستتحقق البرمجيّة الوسيطة <code>VerifyCsrfToken</code> المحتواة في مجموعة البرمجيّة الوسيطة <code>web</code> تلقائيًّا من تطابق الرمز المُخزّن في الجلسة مع الرمز الموجود في طلب الإدخال.


==== الرموز CSRF و JavaScript ====
=== الرموز CSRF و [[JavaScript]] ===
من الملائم أكثر عند بناء تطبيقات مرتكزة على JavaScript أن تدع المكتبة HTTP JavaScript تُلحق الرمز CSRF  تلقائيًّا لكل طلب خارج. يسجّل الملف <code>resources/assets/js/bootstrap.js</code> افتراضيًّا قيمة العنصر (meta tag) المسمى <code>csrf-token</code> بالمكتبة HTTP Axios. ان لم تستخدم هذه المكتبة سيكون عليك إعداد هذا السلوك (behavior) يدويًّا لتطبيقك.
من الملائم أكثر عند بناء تطبيقات مرتكزة على [[JavaScript]] أن تدع المكتبة HTTP JavaScript تُلحق الرمز CSRF  تلقائيًّا لكل طلب خارج. يسجّل الملف <code>resources/assets/js/bootstrap.js</code> افتراضيًّا قيمة العنصر (meta tag) المسمى <code>csrf-token</code> بالمكتبة HTTP Axios. ان لم تستخدم هذه المكتبة سيكون عليك إعداد هذا السلوك (behavior) يدويًّا لتطبيقك.


= استثناء URIs من الحماية CSRF =
== استثناء URIs من الحماية CSRF ==
قد ترغب أحيانا في استثناء مجموعة URI من الحماية CSRF. مثلا إن استخدمت Stripe لمعالجة الدفعات ونظامهم webhook ستحتاج لاستثناء معالج مسار webhook Stripe من الحماية CSRF بما أن Stripe لن يعلم ما سيرسل كرمز CSRF لمساراتك.
قد ترغب أحيانا في استثناء مجموعة URI من الحماية CSRF. مثلا إن استخدمت Stripe لمعالجة الدفعات ونظامهم webhook ستحتاج لاستثناء معالج مسار webhook Stripe من الحماية CSRF بما أن Stripe لن يعلم ما سيرسل كرمز CSRF لمساراتك.


سطر 55: سطر 53:
     }
     }
});
});
</syntaxhighlight>'''''ملاحظة''''': يسجّل الملف <code>resources/assets/js/bootstrap.js</code> قيمة الوسم الفوقي <code>csrf-token</code> بالمكتبة  HTTP Axios. إن لم تستخدم هذه المكتبة سيكون عليك إعداد هذا السلوك (behavior) يدويًّا لتطبيقك.
</syntaxhighlight>'''ملاحظة''': يسجّل الملف <code>resources/assets/js/bootstrap.js</code> قيمة الوسم الفوقي <code>csrf-token</code> بالمكتبة  HTTP Axios. إن لم تستخدم هذه المكتبة سيكون عليك إعداد هذا السلوك (behavior) يدويًّا لتطبيقك.


== X-XSRF-TOKEN ==
== X-XSRF-TOKEN ==
يخزّن Laravel الرمز CSRF الحالي في ملف تعريف الارتباط (cookie) المُضاف لكل رد يولّده إطار العمل. يمكنك استخدام ملف تعريف الارتباط لضبط ترويسة الطلب <code>X-XSRF-TOKEN</code>.
يخزّن [[Laravel]] الرمز CSRF الحالي في ملف تعريف الارتباط (cookie) المُضاف لكل رد يولّده إطار العمل. يمكنك استخدام ملف تعريف الارتباط لضبط ترويسة الطلب <code>X-XSRF-TOKEN</code>.
يرسل ملف تعريف الارتباط هذا مبدئيًّا لأنه يربحك الوقت بما أن بعض مكتبات وإطارات العمل JavaScript مثل Angular و Axios يضعن قيمتها تلقائيًّا في الترويسة <code>X-XSRF-TOKEN</code>.
يرسل ملف تعريف الارتباط هذا مبدئيًّا لأنه يربحك الوقت بما أن بعض مكتبات وإطارات العمل [[JavaScript]] مثل [[Angular]] و [[Axios]] يضعن قيمتها تلقائيًّا في الترويسة <code>X-XSRF-TOKEN</code>.


== مصادر ==
== مصادر ==
* [https://laravel.com/docs/5.6/csrf صفحة CSRF Protection في توثيق Laravel الرسمي]
* [https://laravel.com/docs/5.6/csrf صفحة CSRF Protection في توثيق Laravel الرسمي]
[[تصنيف:Laravel|{{SUBPAGENAME}}]]
[[تصنيف:Laravel Basics|{{SUBPAGENAME}}]]

المراجعة الحالية بتاريخ 13:24، 23 أكتوبر 2018

مقدمة

يُسهّل Laravel حماية تطبيقك من الهجمات مُزوّرة الطلب عبر المواقع (cross-site request forgery) واختصارها CSRF. تزويرات الطلب عبر المواقع هن نوع من الاستغلال تُنفّذ فيها أوامر غير مُرخّصة نيابة عن المستخدم المصادق عليهالمُستوثق (authenticated user).

يُولّد Laravel تلقائيًّا "رمز" CSRF لكل جلسة مستخدم نشطة يديرها التطبيق. يُستخدم هذا الرمز (token) للتحقّق من كون المستخدم المصادق عليه نفس الشخص الذي يقدّم الطلبات للتطبيق.

يجب أن تضيف حقل CSRF مخفي في كل مرّة تعرّف فيها نموذج HTML في تطبيقك كي تتثبت برمجيّة الحماية CSRF الوسيطة من الطلب. تستطيع استخدام توجيه Blade المسمّى csrf@ لتوليد حقل الرمز:

<form method="POST" action="/profile">

   @csrf

   ...

</form>

ستتحقق البرمجيّة الوسيطة VerifyCsrfToken المحتواة في مجموعة البرمجيّة الوسيطة web تلقائيًّا من تطابق الرمز المُخزّن في الجلسة مع الرمز الموجود في طلب الإدخال.

الرموز CSRF و JavaScript

من الملائم أكثر عند بناء تطبيقات مرتكزة على JavaScript أن تدع المكتبة HTTP JavaScript تُلحق الرمز CSRF  تلقائيًّا لكل طلب خارج. يسجّل الملف resources/assets/js/bootstrap.js افتراضيًّا قيمة العنصر (meta tag) المسمى csrf-token بالمكتبة HTTP Axios. ان لم تستخدم هذه المكتبة سيكون عليك إعداد هذا السلوك (behavior) يدويًّا لتطبيقك.

استثناء URIs من الحماية CSRF

قد ترغب أحيانا في استثناء مجموعة URI من الحماية CSRF. مثلا إن استخدمت Stripe لمعالجة الدفعات ونظامهم webhook ستحتاج لاستثناء معالج مسار webhook Stripe من الحماية CSRF بما أن Stripe لن يعلم ما سيرسل كرمز CSRF لمساراتك.

عموما عليك وضع هذا النوع من المسارات خارج مجموعة البرمجيّات الوسيطة web التي يطبّقها RouteServiceProvider على كل المسارات في الملف routes/web.php. يمكنك استثناء المسارات بإضافة URI الخاص بهن للخاصيّة except$ من برمجيّة VerifyCsrfToken الوسيطة:

<?php

namespace App\Http\Middleware;

use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as Middleware;

class VerifyCsrfToken extends Middleware
{
    /**
     * CSRF  التي يجب استثنائها من التحقق URIs 
     *
     * @var array
     */
    protected $except = [
        'stripe/*',
        'http://example.com/foo/bar',
        'http://example.com/foo/*',
    ];
}

ملاحظة:  برمجيّة الحماية CSRF الوسيطة تُعطّل تلقائيًّا عند الاختبارات.

X-CSRF-TOKEN

إضافة للتحقق من وجود الرمز CSRF كمعامل POST، تتحقق البرمجيّات الوسيطة VerifyCsrfToken من وجود ترويسة (header) الطلب X-CSRF-TOKEN. تستطيع مثلا تخزين الرمز في وسم meta HTML:

<meta name="csrf-token" content="{{ csrf_token() }}">

ثم يمكنك ،بعد إنشائك للوسم meta إعطاء تعليمات لمكتبة مثل jQuery لتضيف الرمز تلقائيًّا لكل ترويسات الطلبات. توفّر هذه الطريقة حماية CSRF بسيطة وملائمة لتطبيقاتك المؤسّسة على AJAX:

$.ajaxSetup({
    headers: {
        'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
    }
});

ملاحظة: يسجّل الملف resources/assets/js/bootstrap.js قيمة الوسم الفوقي csrf-token بالمكتبة  HTTP Axios. إن لم تستخدم هذه المكتبة سيكون عليك إعداد هذا السلوك (behavior) يدويًّا لتطبيقك.

X-XSRF-TOKEN

يخزّن Laravel الرمز CSRF الحالي في ملف تعريف الارتباط (cookie) المُضاف لكل رد يولّده إطار العمل. يمكنك استخدام ملف تعريف الارتباط لضبط ترويسة الطلب X-XSRF-TOKEN. يرسل ملف تعريف الارتباط هذا مبدئيًّا لأنه يربحك الوقت بما أن بعض مكتبات وإطارات العمل JavaScript مثل Angular و Axios يضعن قيمتها تلقائيًّا في الترويسة X-XSRF-TOKEN.

مصادر