الأمان
كيف تفحص أمان ملفات تعريف الارتباط: Secure و HttpOnly و SameSite وبادئات الأسماء
ملفات تعريف الارتباط الخاصة بالجلسات مفاتيح لحسابات زوّارك. كيف تحميها كل خاصية، وكيف تفحص ملفاتك بنفسك، وكيف تضبطها ضبطًا صحيحًا.
في هذه الصفحة
حين يسجّل أحدهم الدخول إلى موقعك، يسلّم الخادم متصفحه في العادة ملف تعريف ارتباط للجلسة. ومنذ تلك اللحظة، كل من يحمل هذا الملف هو ذلك المستخدم. وخصائص ملف تعريف الارتباط هي التي تحدد متى يرسله المتصفح، وعبر أي اتصالات، وهل تستطيع السكربتات في الصفحة قراءته. ضبطها ضبطًا صحيحًا لا يكلّف أكثر من سطر إعدادات؛ أما الخطأ فيها فقد يحوّل خللًا صغيرًا إلى استيلاء على حساب.
الخصائص المهمة
Secure
Secure تأمر المتصفح بألّا يرسل ملف تعريف الارتباط إلا عبر HTTPS. ومن دونها قد ينتقل الملف في طلب HTTP عادي، كأن يكتب أحدهم نطاقك بلا https:// قبل أن تحدث إعادة التوجيه، وعندئذ يستطيع أي شخص على الشبكة نفسها قراءته. في موقع يعمل بـ HTTPS، ينبغي أن يحمل كل ملف تعريف ارتباط الخاصية Secure.
HttpOnly
HttpOnly تخفي ملف تعريف الارتباط عن JavaScript (document.cookie). فإذا تمكّن مهاجم من حقن سكربت في صفحتك، لم يستطع ببساطة قراءة ملف الجلسة وإرساله إلى مكان آخر. استخدمها مع ملفات الجلسة والمصادقة. أما الملفات التي لا بد أن تقرأها شيفرة الواجهة الأمامية عندك، مثل رمز CSRF الذي تعرضه بعض الأطر على JavaScript عمدًا، فلا يمكن أن تكون HttpOnly، وهذا متوقَّع.
SameSite
SameSite تتحكم في إرسال ملف تعريف الارتباط حين يأتي الطلب من موقع آخر:
SameSite=Strict: لا يُرسَل إلا مع الطلبات التي تبدأ من موقعك نفسه. وهذا الأكثر أمانًا، لكن الزائر الذي يتبع رابطًا من بريد إلكتروني إلى موقعك يصل وكأنه غير مسجَّل الدخول.SameSite=Lax: يُرسَل مع التنقلات على المستوى الأعلى، مثل النقر على رابط، لا مع إرسال النماذج بين المواقع ولا مع الصور أو الإطارات. وهو خيار افتراضي جيد لملفات الجلسة.SameSite=None: يُرسَل في كل سياق بين المواقع، وهو لازم للأدوات المضمَّنة ولبعض مسارات تسجيل الدخول الموحّد. ويجب أن يقترن بـSecure، وإلا رفضت المتصفحات الملف.
المتصفحات المبنية على Chromium تعامل الملف الخالي من خاصية SameSite على أنه Lax، لكن المتصفحات لا تتصرف كلها على النحو نفسه، فحدّدها صراحةً.
Domain و Path
إذا حذفت Domain صار ملف تعريف الارتباط خاصًّا بالمضيف وحده: لا يُرسَل إلا إلى المضيف الذي ضبطه بعينه. أما ضبط Domain=example.com فيشاركه مع كل نطاق فرعي، ومنها النطاقات المنسيّة على استضافات أخرى قد تكون أقل أمانًا. لا توسّع النطاق إلا حين تحتاج حقًّا إلى مشاركة تسجيل الدخول بين النطاقات الفرعية.
Expires و Max-Age
من دون Expires أو Max-Age يُفترض أن يبقى الملف ما بقيت جلسة المتصفح، وإن كانت المتصفحات التي تستعيد الجلسات قد تحتفظ به مدة أطول. ولتسجيل الدخول الدائم اختر مدة صلاحية تناسب مستوى الخطر، وتأكد من أن الخادم ينهي الجلسات من جهته كذلك.
بادئات أسماء ملفات تعريف الارتباط: __Host- و __Secure-
بادئات الأسماء تجعل المتصفح يفرض القواعد نيابةً عنك. فالملف الذي يبدأ اسمه بـ __Secure- لا يُقبل إلا إذا حمل الخاصية Secure وضُبط عبر HTTPS. والملف الذي يبدأ بـ __Host- أشد صرامة: يجب أن يكون Secure، ومضبوطًا عبر HTTPS، وفيه Path=/، وبلا خاصية Domain. وهذا يقصره على مضيف واحد، فلا يستطيع نطاق فرعي مخترَق أو مهمَل أن يكتب فوقه.
لملف جلسة لا يحتاج إلى مشاركة بين النطاقات الفرعية، البادئة __Host- أقوى خيار متاح: Set-Cookie: __Host-session=…; Secure; HttpOnly; SameSite=Lax; Path=/.
كيف تفحص ملفات تعريف الارتباط لديك
- في المتصفح. افتح أدوات المطوّرين، وانتقل إلى Application (في Chrome و Edge) أو Storage (في Firefox)، ثم Cookies، واختر موقعك. يعرض الجدول لكل ملف أعمدة Domain و Path و Expires و HttpOnly و Secure و SameSite.
- في الاستجابة الخام. في تبويب Network انقر على طلب المستند واقرأ ترويسات الاستجابة
Set-Cookie. وهذا يبيّن بدقة ما أرسله الخادم، ومنه الخصائص التي ربما رفضها المتصفح. - بعد تسجيل الدخول. كثير من المواقع لا يضبط ملفاته المهمة إلا بعد تسجيل الدخول أو عند إنشاء سلة شراء، فأعد الفحص على تلك الصفحات.
- بأداة فحص. يقرأ فاحص الأمان المجاني من Rudra ترويسات
Set-Cookieفي استجابة الصفحة نفسها، ويبلّغ عن الملفات الخالية منSecureعلى HTTPS، والملفات الشبيهة بملفات الجلسة الخالية منHttpOnly، وعنSameSite=NoneبلاSecure، والملفات التي بلاSameSite، والملفات المضبوطة على نطاق أب.
يحسن بك أن تعرف حدَّين للفحص الآلي. فهو يحكم بأن الملف «شبيه بملف جلسة» من اسمه (الأسماء التي تتضمن مقاطع مثل sess أو sid أو token أو auth)، ولذلك يعرض تلك النتائج بدرجة ثقة متوسطة: تأكد مما يحمله الملف فعلًا. ثم إنه لا يرى إلا الملفات التي تضبطها تلك الاستجابة الواحدة، لا الملفات التي تُضبط لاحقًا عبر JavaScript، أو في صفحات أخرى، أو بعد تسجيل الدخول، أو من أطراف خارجية. وقيم ملفات تعريف الارتباط لا تُقرأ ولا تُخزَّن أبدًا.
افحص خصائص ملفات تعريف الارتباط
أدخل صفحة وسيبلّغك Rudra بخصائص Secure و HttpOnly و SameSite في ملفات تعريف الارتباط التي تضبطها، بالاسم فقط، إلى جانب إعدادات HTTPS والترويسات لديك.
كيف تضبط خصائص ملفات تعريف الارتباط على المنصات الشائعة
- جلسات PHP: في
php.ini، اضبطsession.cookie_secure = 1وsession.cookie_httponly = 1وsession.cookie_samesite = "Lax"(في PHP 7.3 وما بعده)، أو مرِّر الخيارات نفسها إلىsession_set_cookie_params(). - Django:
SESSION_COOKIE_SECURE = TrueوCSRF_COOKIE_SECURE = True. أماSESSION_COOKIE_HTTPONLYوSESSION_COOKIE_SAMESITE = "Lax"فهما القيمتان الافتراضيتان أصلًا. - Express (على Node.js):
res.cookie("sid", value, { secure: true, httpOnly: true, sameSite: "lax" })، أو خياراتcookieفيexpress-session. وخلف خادم وكيل، فعّلtrust proxyليعرف Express أن الاتصال يجري عبر HTTPS. - WordPress: ملفات تسجيل الدخول الأساسية تحمل
HttpOnly، وتُعلَّم بـSecureحين يعمل الموقع على HTTPS. أما ملفات الإضافات فتتفاوت؛ افحصها في أدوات المطوّرين واسأل مطوّري الإضافة إن كانت تنقصها الخصائص. - الخادم الوكيل العكسي كحل أخير: التوجيه
proxy_cookie_flagsفي nginx (الإصدار 1.19.3 وما بعده) يستطيع إضافةsecureوhttponlyوsamesiteإلى ملفات تطبيق لا تستطيع تعديله.
أخطاء شائعة
- تعليم الملفات بـ
Secureفي بيئة الإنتاج مع الاختبار محليًا عبر HTTP فقط، ثم تعطيل الخاصية «مؤقتًا». - ضبط
SameSite=NoneبلاSecure، فتُسقط المتصفحات الملف ويتوقف تسجيل دخول أو محتوى مضمَّن عن العمل. - ضبط ملفات الجلسة على النطاق الأب «احتياطًا».
- تخزين رموز الجلسة في
localStorage، حيث يستطيع أي سكربت محقون قراءتها؛ وملفاتHttpOnlyأكثر أمانًا. - وضع بيانات شخصية في قيم ملفات تعريف الارتباط. ينبغي أن تحمل هذه الملفات معرِّفات لا معلومات.
ملفات تعريف الارتباط جزء واحد من الصورة. ولمعرفة المزيد عن الترويسات و HTTPS وحدود الاختبار غير التدخّلي، اقرأ كيف تفحص أمان موقعك.
الأسئلة الشائعة
هل ينبغي أن يكون كل ملف تعريف ارتباط HttpOnly؟
كل ملف لا تحتاج JavaScript إلى قراءته ينبغي أن يكون كذلك. وملفات الجلسة والمصادقة يجب أن تكون HttpOnly دائمًا. أما ملفات التفضيلات أو الرموز التي تقرؤها شيفرة الواجهة الأمامية عمدًا فلا يمكن أن تكون كذلك، ولا بأس بهذا.
هل تكفي SameSite=Lax لمنع هجمات CSRF؟
هي تمنع أشيع حالات إرسال النماذج بين المواقع، لكنها ليست دفاعًا كاملًا بمفردها: فالنطاقات الفرعية من الموقع نفسه وطلبات GET على المستوى الأعلى قد تحمل الملف مع ذلك. أبقِ رموز CSRF للطلبات التي تغيّر الحالة، ولا تغيّر البيانات عبر GET أبدًا.
لماذا يختفي ملف تعريف الارتباط حين أضبط SameSite=None؟
المتصفحات ترفض ملفات SameSite=None التي لا تحمل Secure كذلك. أضف Secure وقدّم الموقع عبر HTTPS.
هل يقرأ Rudra قيم ملفات تعريف الارتباط عندي؟
لا. فاحص الأمان يسجّل أسماء الملفات وخصائصها فقط. أما القيم والرموز وكل ما في داخل الملف فلا تُقرأ ولا تُخزَّن ولا تُعرض أبدًا.