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