يتم تغيير سلوك Chrome وFirefox وEdge وغيره من التطبيقات الأخرى بما يتماشى مع اقتراح مجموعة مهندسي شبكة الإنترنت (IETF) ملفات تعريف الارتباط بشكل تزايدي بحيث:
- يتم التعامل مع ملفات تعريف الارتباط التي لا تتضمّن السمة
SameSite
على أنّهاSameSite=Lax
، أي أنّ السلوك التلقائي هو حصر ملفات تعريف الارتباط بسياقات الطرف الأول فقط. - يجب أن تحدد ملفات تعريف الارتباط المخصّصة للاستخدام على عدة مواقع إلكترونية السمة
SameSite=None; Secure
لتفعيل التضمين في سياق الجهات الخارجية.
إذا لم يسبق لك إجراء ذلك، عليك تعديل سمات ملفات تعريف الارتباط التابعة لجهات خارجية حتى لا يتم حظرها في المستقبل.
حالات استخدام ملفات تعريف الارتباط على مواقع إلكترونية متعددة أو تابعة لجهات خارجية
هناك عدد من حالات الاستخدام والأنماط الشائعة التي يجب إرسال ملفات تعريف الارتباط فيها في سياق تابع لجهة خارجية. إذا قدّمت إحدى حالات الاستخدام هذه أو تعتمد عليها، تأكَّد من أنّك أو مقدّم الخدمة تعدّل ملفات تعريف الارتباط للحفاظ على عمل الخدمة بشكل صحيح.
المحتوى ضمن <iframe>
إنّ المحتوى من موقع إلكتروني مختلف معروض في <iframe>
يقع في سياق تابع لجهة خارجية. تشمل حالات الاستخدام العادية ما يلي:
- المحتوى المضمَّن الذي تمت مشاركته من مواقع إلكترونية أخرى، مثل الفيديوهات والخرائط وعيّنات التعليمات البرمجية ومشاركات الشبكات الاجتماعية.
- تطبيقات مصغّرة من الخدمات الخارجية مثل ميزات الدفع والتقويمات والحجز
- التطبيقات المصغّرة، مثل الأزرار الاجتماعية أو خدمات مكافحة الاحتيال التي تكون أقل وضوحًا
<iframes>
.
يمكن استخدام ملفات تعريف الارتباط هنا، إلى جانب إجراءات أخرى، الحفاظ على حالة الجلسة أو تخزين الإعدادات المفضّلة العامة أو تفعيل الإحصاءات أو تخصيص المحتوى للمستخدمين الذين لديهم حسابات حالية.
![رسم بياني لنافذة متصفّح لا يتطابق فيها عنوان URL للمحتوى المضمَّن مع عنوان URL للصفحة](https://web.dev/static/articles/samesite-cookie-recipes/image/diagram-a-browser-window-809ed902fbce7.png?authuser=6&hl=ar)
بما أنّ الويب قابل للإنشاء بطبيعتها، يتم استخدام <iframes>
أيضًا لتضمين
المحتوى الذي يتم مشاهدته في سياق المستوى الأعلى أو سياق الطرف الأول. وأي ملفات تعريف ارتباط يستخدمها الموقع الإلكتروني في إطار iframe تُعتبر ملفات تعريف ارتباط تابعة لجهات خارجية. إذا كنت تنشئ مواقع إلكترونية تريد من مواقع إلكترونية أخرى تضمينها وتحتاج إلى ملفات تعريف ارتباط لتشغيلها، ستحتاج أيضًا إلى التأكّد من وضع علامة على هذه المواقع للاستخدام على عدة مواقع إلكترونية أو التأكّد من إمكانية إعادتها بسهولة بدونها.
الطلبات "غير الآمنة" على المواقع الإلكترونية
قد تبدو كلمة "غير آمن" مقلقة هنا، لكنها تشير إلى أي طلب قد
يهدف إلى تغيير الحالة. على الويب، هذه الطلبات POST في المقام الأول. يتم إرسال ملفات تعريف الارتباط التي تم وضع علامة SameSite=Lax
عليها في عمليات التنقّل الآمنة ذات المستوى الأعلى، مثل النقر على رابط للانتقال إلى موقع إلكتروني آخر. مع ذلك، إنّ عملية إرسال <form>
إلى موقع إلكتروني مختلف باستخدام POST لا تتضمّن ملفات تعريف الارتباط.
![مخطّط بياني لطلب الانتقال من صفحة إلى أخرى](https://web.dev/static/articles/samesite-cookie-recipes/image/diagram-a-request-moving-46b47373768e3.png?authuser=6&hl=ar)
ويُستخدَم هذا النمط للمواقع الإلكترونية التي يمكنها إعادة توجيه المستخدم إلى خدمة عن بُعد لإجراء عملية معيّنة قبل العودة إلى الصفحة، مثل إعادة التوجيه إلى موفّر هوية تابع لجهة خارجية. قبل أن يغادر المستخدم الموقع الإلكتروني، يتم ضبط ملف تعريف ارتباط يحتوي على رمز مميّز للاستخدام مرة واحدة مع توقُّع إمكانية التحقّق من هذا الرمز المميّز عند الطلب المكرّر للحدّ من هجمات تزوير الطلبات المتبادلة على المواقع الإلكترونية (CSRF). إذا وصل طلب الإرجاع هذا من خلال POST، عليك وضع علامة SameSite=None; Secure
على ملفات تعريف الارتباط.
الموارد عن بُعد
قد يعتمد أي مورد بعيد على الصفحة، مثل علامات <img>
أو علامات <script>
، على ملفات تعريف الارتباط التي يتم إرسالها مع الطلب. تشمل حالات الاستخدام الشائعة
وحدات بكسل التتبع وتخصيص المحتوى.
ينطبق ذلك أيضًا على الطلبات المرسَلة من JavaScript باستخدام fetch
أو XMLHttpRequest
. إذا تم استدعاء "fetch()
" باستخدام
الخيار credentials: 'include'
،
من المرجَّح أن تتضمّن هذه الطلبات ملفات تعريف ارتباط.
بالنسبة إلى XMLHttpRequest
، تتم عادةً الإشارة إلى ملفات تعريف الارتباط المتوقعة من خلال
withCredentials
لـ true
. ويجب وضع علامة مناسبة على ملفات تعريف الارتباط هذه لتضمينها في الطلبات الواردة من مواقع إلكترونية متعددة.
المحتوى ضمن WebView
يتم تشغيل WebView في تطبيق خاص بالنظام الأساسي بواسطة أحد المتصفحات. ويحتاج المطوّرون إلى اختبار ما إذا كانت القيود أو المشاكل التي تؤثر في تطبيقاتهم تنطبق أيضًا على WebViews في تطبيقاتهم.
يتيح Android أيضًا للتطبيقات الخاصة بالنظام الأساسي ضبط ملفات تعريف الارتباط مباشرةً باستخدام واجهة برمجة تطبيقات CookieManager.
وكما هي الحال مع ملفات تعريف الارتباط التي تم ضبطها باستخدام العناوين أو JavaScript، ننصحك بتضمين
SameSite=None; Secure
إذا كانت مخصَّصة للاستخدام على عدة مواقع إلكترونية.
كيفية تطبيق SameSite
اليوم
ضَع علامة SameSite=Lax
أو SameSite=Strict
على أي ملفات تعريف ارتباط مطلوبة فقط في سياق الطرف الأول، وذلك حسب احتياجاتك. إذا لم تضع علامة على ملفات تعريف الارتباط هذه وتعتمد بدلاً من ذلك على سلوك المتصفّح التلقائي للتعامل معها، قد تتصرف بشكل غير متناسق على مستوى المتصفحات وقد تؤدي إلى ظهور تحذيرات من وحدة التحكّم لكل ملف تعريف ارتباط.
Set-Cookie: first_party_var=value; SameSite=Lax
احرص على وضع علامة SameSite=None; Secure
على أي ملفات تعريف ارتباط لازمة في سياق تابع لجهة خارجية. كلتا السمتَين مطلوبتَين. وإذا حدّدت القيمة None
بدون Secure
، سيتم رفض ملف تعريف الارتباط. لمراعاة الاختلافات في عمليات تنفيذ المتصفّح، قد تحتاج إلى استخدام بعض استراتيجيات تخفيف الأثر الموضّحة في التعامل مع البرامج غير المتوافقة.
Set-Cookie: third_party_var=value; SameSite=None; Secure
التعامل مع البرامج غير المتوافقة
بما أنّ هذه التغييرات لتضمين None
والسلوك التلقائي للتحديث لا تزال جديدة نسبيًا، ستتعامل المتصفّحات المختلفة معها بطرق مختلفة. ويمكنك الرجوع إلى صفحة التحديثات على chromium.org
للاطّلاع على قائمة بالمشاكل المعروفة، ولكن هذه القائمة قد لا تكون شاملة.
يتمثل أحد الحلول الممكنة في تعيين كل ملف تعريف ارتباط بالنمط الجديد والقديم:
Set-cookie: 3pcookie=value; SameSite=None; Secure
Set-cookie: 3pcookie-legacy=value; Secure
وتعمل المتصفّحات التي تنفِّذ السلوك الأحدث على ضبط ملفّ تعريف الارتباط بالقيمة SameSite
. وتتجاهل المتصفّحات التي لا تنفِّذ السلوك الجديد هذه القيمة وتضبط
ملف تعريف الارتباط 3pcookie-legacy
. عند معالجة ملفات تعريف الارتباط المضمّنة، يجب أن يتحقّق موقعك الإلكتروني أولاً من توفُّر النمط الجديد من ملفات تعريف الارتباط، ثم يعود إلى استخدام ملف تعريف الارتباط القديم في حال عدم العثور على ملف جديد.
يوضّح المثال التالي كيفية إجراء ذلك في Node.js، باستخدام إطار عمل Express والبرمجيات الوسيطة cookie-parser الخاصة به:
const express = require('express');
const cp = require('cookie-parser');
const app = express();
app.use(cp());
app.get('/set', (req, res) => {
// Set the new style cookie
res.cookie('3pcookie', 'value', { sameSite: 'none', secure: true });
// And set the same value in the legacy cookie
res.cookie('3pcookie-legacy', 'value', { secure: true });
res.end();
});
app.get('/', (req, res) => {
let cookieVal = null;
if (req.cookies['3pcookie']) {
// check the new style cookie first
cookieVal = req.cookies['3pcookie'];
} else if (req.cookies['3pcookie-legacy']) {
// otherwise fall back to the legacy cookie
cookieVal = req.cookies['3pcookie-legacy'];
}
res.end();
});
app.listen(process.env.PORT);
يتطلب منك هذا النهج بذل جهد إضافي لإعداد ملفات تعريف ارتباط متكررة وإجراء تغييرات عند إعداد ملف تعريف الارتباط وقراءته. مع ذلك، يجب أن يغطّي جميع المتصفّحات بغضّ النظر عن سلوكها، وأن يحافظ على عمل ملفات تعريف الارتباط التابعة لجهات خارجية.
ويمكنك بدلاً من ذلك رصد البرنامج باستخدام سلسلة وكيل المستخدم عند
إرسال عنوان Set-Cookie
. راجِع قائمة البرامج غير المتوافقة واستخدِم مكتبة رصد وكيل المستخدم المناسبة لنظامك الأساسي، على سبيل المثال مكتبة ua-parser-js على Node.js. ولا يتطلّب منك هذا الأسلوب سوى إجراء تغيير واحد، ولكن قد لا ترصد عملية الالتقاط لوكيل المستخدم جميع المستخدمين المتأثّرين بهذا التغيير.
إتاحة "SameSite=None
" في اللغات والمكتبات وأُطر العمل
تتيح معظم اللغات والمكتبات استخدام السمة SameSite
لملفات تعريف الارتباط. مع ذلك، ولأنّ إضافة SameSite=None
لا تزال حديثة نسبيًا، قد تحتاج إلى التأقلم مع بعض السلوكيات العادية في الوقت الحالي.
تم توثيق هذه السلوكيات في مستودع أمثلة SameSite
على GitHub.
الحصول على المساعدة
يتم استخدام ملفات تعريف الارتباط في كل مكان على الويب، ومن النادر أن يكون لدى أي فريق تطوير معرفة كاملة بأماكن وضع تلك الملفات واستخدامها، خاصةً في حالات الاستخدام على عدة مواقع إلكترونية. عندما تواجه مشكلة، قد تكون هذه هي المرة الأولى التي يواجهها فيها أي شخص، لذا لا تتردد في التواصل معي:
- يُرجى طرح مشكلة في مستودع أمثلة
SameSite
على GitHub. - اطرح سؤالاً في علامة "samesite" على موقع StackOverflow.
- بالنسبة إلى المشاكل المتعلّقة بسلوك Chromium، اعرض خطأ في أداة تتبُّع مشاكل Chromium.
- تابِع مستوى تقدّم Chrome على صفحة تحديثات
SameSite
.