أكواد HTTP كيفية بناء وتحليلها بشكل صحيح

نُشرت في
أكواد HTTP: كيفية بناءها وتحليلها بشكل صحيح 1
إعلان · حذف؟

تُستخدم أكواد HTTP في كل مكان. كل جلسة تسجيل دخول، وسلة المشتريات، وأداة التحليلات تعتمد عليها. ومع ذلك، فإن معظم المطورين ينسخون رأسًا ويتقدمون دون فهم ما يفعله السمات الفعلية — أو ما يحدث عندما يُخطئ في هذه السمات. Set-Cookie يغطي هذا الدليل بنية الأكواد، كل سمة ذات معنى، كيفية تحليل سلسلة الأكواد، وسبب

أن يكون دفاعك ضد CSRF. إذا أردت البدء بالعمل فورًا، جرب SameSite مُحلل أكواد IO Tools مُصنف أكواد أو ال ما يشبه الأكواد الفعلي.

عندما يرغب الخادم بوضع أكواد، فإنه يرسل رأسًا:

يُخزن المتصفح هذا ويُرسله مرة أخرى في الطلبات التالية كالتالي: Set-Cookie هذا هو الميكانيزم كليًا. التعقيد يكمن في هذه السمات.

Set-Cookie: sessionId=abc123; HttpOnly; Secure; SameSite=Lax; Path=/; Max-Age=86400

بنية الأكواد: تحليل السلسلة

Cookie: sessionId=abc123

تتبع سلسلة الأكواد تنسيقًا متسقًا:

يأتي الزوج أولًا. كل شيء بعد الفاصلة الأولى هو تعليمات تُوجه إلى المتصفح — لا يرى الخادم هذه السمات في الرأس الذي يحصل عليه.

السمات الأمنية التي يجب أن تُفهم بشكل صحيح

name=value; attribute1; attribute2=attributeValue; ...

ال name=value HttpOnly Cookie تمنع JavaScript من قراءة الأكواد من خلال

وهذا يمثل دفاعًا مباشرًا ضد هجمات XSS التي تسرق أكواد التسجيل.

يجب أن تكون أي أكواد تُستخدم لتحديد المستخدم لها

HttpOnly بلا سبب جيد لعدم القيام بذلك. document.cookieتُعني أن المتصفح يُرسل الأكواد فقط عبر اتصالات HTTPS. بدونها، تنتقل الأكواد في نص مفتوح عبر HTTP ويمكن أن تُستغل. في البيئة الإنتاجية، يجب أن تكون أكواد الجلسة لها

Set-Cookie: sessionId=abc123; HttpOnly

بلا سبب جيد لعدم القيام بذلك. HttpOnlyتُعني أن المتصفح يُرسل الأكواد فقط عبر اتصالات HTTPS. بدونها، تنتقل الأكواد في نص مفتوح عبر HTTP ويمكن أن تُستغل. في البيئة الإنتاجية، يجب أن تكون أكواد الجلسة لها

يؤمن

Secure بلا سبب جيد لعدم القيام بذلك. Secureتُعني أن المتصفح يُرسل الأكواد فقط عبر اتصالات HTTPS. بدونها، تنتقل الأكواد في نص مفتوح عبر HTTP ويمكن أن تُستغل. في البيئة الإنتاجية، يجب أن تكون أكواد الجلسة لها http://localhostبلا سبب جيد لعدم القيام بذلك.

SameSite

SameSite تُتحكم في الوقت الذي يُرسل فيه المتصفح الأكواد في الطلبات عبر المواقع المختلفة. هذه هي الدفاع الأساسية ضد هجمات CSRF. ثلاث قيم:

  • Strict — لا تُرسل الأكواد في الطلبات عبر المواقع المختلفة. أكثر أمانًا، لكن المستخدمين الذين ينقر عليهم من بريد إلكتروني يُستبعدون من الدخول (لأن الأكواد لا تُرسل في هذا التوجيه الأولي).
  • Lax — تُرسل الأكواد في التوجيهات الرئيسية (طلبات GET) من المواقع الخارجية، لكنها لا تُرسل في الطلبات المُدمجة عبر المواقع المختلفة أو الطلبات المُرسلة عبر المواقع المختلفة. هذه هي القيمة الافتراضية للمتصفح للإكواد بدون سمة مُحددة. SameSite — تُرسل الأكواد في كل الطلبات عبر المواقع المختلفة. مطلوبة للإكواد المُستخدمة من قبل المواقع الخارجية (مثلاً تدفق OAuth، أو الأجزاء المدمجة). يجب أن تُستخدم مع
  • None إذا أرسلت Secure.
# Third-party / cross-site cookie (e.g., OAuth callback)
Set-Cookie: token=xyz; SameSite=None; Secure

يُرفض الأكواد بالكامل من قبل المتصفحات الحديثة. بالنسبة لأغلب أكواد الجلسة، استخدم SameSite=None بدون Secure— توازن الأمان مع تجربة تسجيل دخول سهلة. SameSite=Lax النطاق: الموقع والمسار

تُحدد السمة أي المواقع التي تُستلم فيها الأكواد.

المنطقة

ال Domain باستخدام

Set-Cookie: user=alice; Domain=example.com

تُرسل الأكواد إلى Domain=example.comوكل المواقع الفرعية ( example.com ). بدون سمةapi.example.com, app.example.comتُرسل الأكواد فقط إلى الموقع الدقيق الذي تم وضعه فيه — وليس إلى المواقع الفرعية. Domain مغالطة شائعة: تعيين

لا يُحدّد الأكواد فقط إلى Domain=example.com إلا أنّها تُوسع النطاق لتشمل المواقع الفرعية. احذف السمة إذا أردت أن تكون الأكواد محدودة بالموقع. لا تُحدّد المسارات التي تُحفّز من خلالها يتم إرسال الأكواد. example.comهذا الأكواد يُرفق فقط بطلبات إلى

طريق

Path والمقاطع تحتها. طلب إلى

Set-Cookie: adminToken=xyz; Path=/admin

لن يحتوي عليه. القيمة الافتراضية هي /admin أي جميع المسارات. / أو /api الفرق بين Max-Age و Expires /كلاهما يتحكمان في وقت انتهاء الأكواد. يُفضل

تُأخذ تاريخًا مطلقًا في صيغة HTTP. هذا يعتمد على جدول المُستخدم، والذي لا يمكنك تحكمه.

تُأخذ عددًا من الثواني من الآن: Max-Age.

  • Expires لـ 24 ساعة. يعتمد على نية الخادم، وليس على جدول المُستخدم.
  • Max-Age عندما تكون كلاهما موجودًا، Max-Age=86400 تُأخذ الأولوية. الأكواد التي لا تحتوي على أي سمة هي أكواد جلسة

— تختفي عند إغلاق المتصفح. Max-Age مراجع السمات الخاصة بالأكواد السمة ما تفعله

تمنع الوصول إلى الأكواد من قبل JavaScript

غير مُحددةمُحددة دائمًا للأكواد المُستخدم فيها للتسجيلتقصيرتوصية
HttpOnlyإرسال فقط عبر HTTPSمُحددة دائمًا في البيئة الإنتاجيةتتحكم في إرسال الأكواد عبر المواقع المختلفة
Secureمُتوازية (في المتصفحات الحديثة)مُحددة دائمًا في البيئة الإنتاجيةمُتوازية للأكواد المُستخدمة في الجلسة؛ مُتوازية + آمنة للأكواد المُستخدمة من قبل المواقع الخارجية
SameSiteتُحدد نطاق الموقعالموقع الحالي فقطأزلها ما لم تُستخدم مشاركة عبر المواقع الفرعية
Domainتُحدد نطاق المسارالمسار الحالي فقطأزلها ما لم تُستخدم مشاركة عبر المواقع الفرعية
Pathعدد الثواني قبل انتهاء الصلاحية/أكواد جلسة
Max-Ageأفضل من Expiresتاريخ انتهاء صلاحية مطلقاستخدم Max-Age بدلًا من ذلك
Expiresإدخال الأكواد في الكودتاريخ انتهاء صلاحية مطلقنودي (إكسبريس)

بايثون (فاستأبي)

تحليل الرؤوس الخاصة بالأكواد يدويًا

app.post('/login', (req, res) => {
  // ... verify credentials ...

  res.cookie('sessionId', token, {
    httpOnly: true,
    secure: process.env.NODE_ENV === 'production',
    sameSite: 'lax',
    maxAge: 86400 * 1000, // milliseconds in Express
    path: '/',
  });

  res.json({ ok: true });
});

الرأس الذي يحصل عليه الخادم يحتوي فقط على

from fastapi import FastAPI, Response

app = FastAPI()

@app.post("/login")
def login(response: Response):
    # ... verify credentials ...

    response.set_cookie(
        key="sessionId",
        value=token,
        httponly=True,
        secure=True,
        samesite="lax",
        max_age=86400,
        path="/",
    )
    return {"ok": True}

أزواج، مفصولة بـ

ال Cookie لتحليله يدويًا: قسم على name=value (الفاصلة والمسافة)، ثم قسم كل زوج على ; :

Cookie: sessionId=abc123; theme=dark; lang=en

الثانية فقط. تُعرف حالات محددة: ; يمكن أن تحتوي القيم على (السلاسل المُرَمَّزة بشكل شائع) — قسم دائمًا على = الثانية فقط

  • الإسماء الخاصة بالأكواد حساسة للحروف الكبيرة والصغيرة = يمكن أن تتغير المسافات حول الفاصل — قم بحذفها من الطرفين بشكل واعٍ = بدلاً من كتابة منطق القسمة بنفسك، استخدم
  • لإعادة تشفير أي
  • رأس، وفحص كل قيمة، أو

مُصنف أكواد IO Tools مُصنف أكواد لإعادة تكوين رأس صالح مع السمات الصحيحة. Cookie الأكواد والأكواد المُستخدمة ضد CSRF تُستغل هجمات التسجيل عبر المواقع المختلفة حقيقة أن المتصفح يُرسل الأكواد تلقائيًا في الطلبات الموجهة إلى موقع معين، حتى لو كانت مُنشأة من موقع مختلف. يمكن لصفحة خبيثة في أن تُرسل نموذجًا إلى Set-Cookie وإذا كان المستخدم مُسجلًا، فإن المتصفح يُرسل أكواد الجلسة مع الطلب المُزيف.

تُقاوم معظم أنماط هجمات CSRF لأن الطلبات المُوجهة عبر المواقع المختلفة — النمط الشائع للهجوم — لا تحتوي على الأكواد.

أكثر تفصيلًا ولكنها قد تؤثر على التجربة. evil.com تبقى أكواد CSRF صالحة كدفاع مُضاف، خاصة في العمليات ذات الأهمية العالية، وعندما bank.com/transferمطلوبة للسياق المُستخرج من المواقع الخارجية. تُكمل هاتان المُقاومتان بعضها.

SameSite=Lax أكواد HTTP: كيفية بناء وتحليلها بشكل صحيح 2 SameSite=Strict أكواد HTTP: كيفية بناء وتحليلها بشكل صحيح 1

تبقى وحدات CSRF صالحة كوسيلة دفاعية متعددة الطبقات، خاصة في العمليات ذات الأهمية العالية وعندما SameSite=None تُستخدم للسياق الخارجي. تكمل هاتان الوسيلة بعضها البعض.

هل تريد حذف الإعلانات؟ تخلص من الإعلانات اليوم

تثبيت ملحقاتنا

أضف أدوات IO إلى متصفحك المفضل للوصول الفوري والبحث بشكل أسرع

أضف لـ إضافة كروم أضف لـ امتداد الحافة أضف لـ إضافة فايرفوكس أضف لـ ملحق الأوبرا

وصلت لوحة النتائج!

لوحة النتائج هي طريقة ممتعة لتتبع ألعابك، يتم تخزين جميع البيانات في متصفحك. المزيد من الميزات قريبا!

إعلان · حذف؟
إعلان · حذف؟
إعلان · حذف؟

ركن الأخبار مع أبرز التقنيات

شارك

ساعدنا على الاستمرار في تقديم أدوات مجانية قيمة

اشتري لي قهوة
إعلان · حذف؟