Kodax

Cookies و Sessions — أساسيات الأمن السيبراني

Cookies و Sessions

ما هي Cookies؟

ملفات نصية صغيرة يخزنها المتصفح.

كيف تعمل؟

1. الخادم يرسل: Set-Cookie: session=abc123

2. المتصفح يحفظها

3. المتصفح يرسلها في كل طلب: Cookie: session=abc123

أنواع Cookies

Session Cookies

- تُحذف عند إغلاق المتصفح

- للجلسة المؤقتة

Persistent Cookies

- تبقى لفترة محددة

- Expires=Wed, 21 Oct 2025 07:28:00 GMT

خصائص الأمان

HttpOnly

- لا يمكن الوصول لها من JavaScript

- حماية من XSS

Set-Cookie: session=abc123; HttpOnly

Secure

- ترسل فقط عبر HTTPS

Set-Cookie: session=abc123; Secure

SameSite

- منع CSRF

Set-Cookie: session=abc123; SameSite=Strict

Sessions

ما هي الجلسة (Session)؟

بيانات المستخدم المخزنة في الخادم.

كيف تعمل؟

1. المستخدم يسجّل الدخول

2. الخادم ينشئ session ويرسل session ID في cookie

3. المتصفح يرسل session ID في كل طلب

4. الخادم يستخدم ID للوصول لبيانات الجلسة

هجمات شائعة

Session Hijacking

سرقة session ID لانتحال الهوية.

Session Fixation

إجبار المستخدم على استخدام session ID معروف.

الوقاية

- استخدم HTTPS

- HttpOnly و Secure cookies

- أعد إنشاء session ID بعد تسجيل الدخول

- انتهاء صلاحية الجلسات

# مثال على Sessions و Cookies في Flask
from flask import Flask, session, request, make_response
import secrets

app = Flask(__name__)
app.secret_key = secrets.token_hex(16)

# ===== استخدام Cookies =====
@app.route('/set_cookie')
def set_cookie():
    """تعيين Cookie"""
    response = make_response("Cookie تم تعيينها!")
    
    # Cookie بسيط
    response.set_cookie('username', 'ahmed')
    
    # Cookie آمن
    response.set_cookie(
        'session_id',
        secrets.token_hex(16),
        max_age=3600,      # ساعة واحدة
        secure=True,       # HTTPS فقط
        httponly=True,     # لا يمكن الوصول من JS
        samesite='Lax'     # حماية CSRF
    )
    
    return response

@app.route('/get_cookie')
def get_cookie():
    """قراءة Cookie"""
    username = request.cookies.get('username')
    return f"مرحباً {username}"

@app.route('/delete_cookie')
def delete_cookie():
    """حذف Cookie"""
    response = make_response("Cookie تم حذفها!")
    response.set_cookie('username', '', max_age=0)
    return response

# ===== استخدام Sessions =====
@app.route('/login')
def login():
    """تسجيل دخول وإنشاء session"""
    # تخزين بيانات في session
    session['user_id'] = 123
    session['username'] = 'ahmed'
    session['is_admin'] = False
    
    return "تم تسجيل الدخول!"

@app.route('/dashboard')
def dashboard():
    """صفحة محمية تحتاج session"""
    if 'user_id' not in session:
        return "يجب تسجيل الدخول أولاً!", 401
    
    username = session.get('username')
    return f"مرحباً {username}"

@app.route('/logout')
def logout():
    """تسجيل خروج وحذف session"""
    session.clear()
    return "تم تسجيل الخروج!"

# ===== Session Security =====
@app.route('/secure_login', methods=['POST'])
def secure_login():
    """تسجيل دخول آمن"""
    username = request.form.get('username')
    password = request.form.get('password')
    
    # التحقق من البيانات (مثال مبسط)
    if username == 'admin' and password == 'secret':
        # إعادة إنشاء session ID (منع Session Fixation)
        session.clear()
        
        # تعيين بيانات جديدة
        session['user_id'] = 1
        session['username'] = username
        
        # تعيين علامة لتتبع regeneration
        session['_regenerated'] = True
        
        return "تم تسجيل الدخول بأمان!"
    
    return "بيانات خاطئة!", 401

# ===== محاكاة Session Hijacking Detection =====
@app.before_request
def check_session_integrity():
    """فحص سلامة الجلسة"""
    if 'user_id' in session:
        # تحقق من User-Agent (بسيط جداً)
        current_ua = request.headers.get('User-Agent')
        stored_ua = session.get('_user_agent')
        
        if stored_ua and stored_ua != current_ua:
            # محاولة hijacking محتملة
            session.clear()
            return "جلسة مشبوهة!", 401

@app.after_request
def store_user_agent(response):
    """حفظ User-Agent في session"""
    if 'user_id' in session:
        session['_user_agent'] = request.headers.get('User-Agent')
    return response
اختبر فهمك