Django একটি middleware ব্যবহার করে যা প্রতিটি HTTP রিকোয়েস্ট যাচাই করে এবং টেমপ্লেট রেন্ডার করার সময় একটি CSRF টোকেন তৈরি করে। এই টোকেনটি HTML ফর্মের মধ্যে অন্তর্ভুক্ত করা হয়। যখন ফর্মটি সাবমিট করা হয়, তখন CSRF টোকেনটি রিকোয়েস্টের সঙ্গে সার্ভারে পাঠানো হয়। সার্ভার এই টোকেন যাচাই করে নিশ্চিত হয় যে ফর্ম সাবমিশনটি বৈধ এবং নিরাপদ।
উদাহরণ: ফর্ম সাবমিশনে CSRF সুরক্ষা
1. ফর্ম তৈরি করা
ধরুন আমাদের একটি সাধারণ HTML ফর্ম রয়েছে যেখানে ব্যবহারকারী একটি পোস্ট তৈরি করতে পারবেন।
forms.py
from django import forms
class PostForm(forms.Form):
title = forms.CharField(max_length=100)
content = forms.CharField(widget=forms.Textarea)
2. ফর্মটি টেমপ্লেটে ব্যবহার করা
post_form.html
<!DOCTYPE html>
<html>
<head>
<title>New Post</title>
</head>
<body>
<h1>Create a New Post</h1>
<form method="post" action="{% url 'create_post' %}">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Submit</button>
</form>
</body>
</html>
ব্যাখ্যা:
- {% csrf_token %}: এই টেমপ্লেট ট্যাগটি একটি ইউনিক CSRF টোকেন তৈরি করে এবং ফর্মের মধ্যে একটি হিডেন ইনপুট হিসেবে সেট করে। এটি নিশ্চিত করে যে CSRF টোকেনটি ফর্ম সাবমিশনের সময় পাঠানো হয়।
3. ফর্ম হ্যান্ডলিং ভিউ
views.py
from django.shortcuts import render
from django.http import HttpResponse
from .forms import PostForm
def create_post(request):
if request.method == "POST":
form = PostForm(request.POST)
if form.is_valid():
# ফর্ম ডেটা প্রক্রিয়া করুন (যেমন, নতুন পোস্ট সংরক্ষণ)
return HttpResponse("Post created successfully!")
else:
form = PostForm()
return render(request, 'post_form.html', {'form': form})
কীভাবে এটি কাজ করে:
- যখন ব্যবহারকারী
post_form.htmlপেজটি লোড করেন, তখন Django একটি CSRF টোকেন তৈরি করে এবং ফর্মের মধ্যে সেট করে ({% csrf_token %})। - ব্যবহারকারী ফর্মটি পূরণ করে এবং সাবমিট করলে, CSRF টোকেন সহ একটি POST রিকোয়েস্ট সার্ভারে পাঠানো হয়।
- Middleware (যেমন
django.middleware.csrf.CsrfViewMiddleware) POST রিকোয়েস্টটি পরীক্ষা করে দেখে যে পাঠানো টোকেনটি বৈধ এবং সঠিক কি না।- যদি টোকেন বৈধ হয়, তবে ফর্ম ডেটা প্রক্রিয়া করা হয়।
- যদি টোকেন অনুপস্থিত বা ভুল হয়, তাহলে Django একটি
403 Forbiddenএরর দেখায়।
CSRF টোকেন কীভাবে কাজ করে
- টোকেন তৈরি করা:
- Django যখন প্রথমবার একটি HTML পেজ রেন্ডার করে যেখানে CSRF সুরক্ষা প্রয়োজন, তখন এটি একটি ইউনিক এবং র্যান্ডম CSRF টোকেন তৈরি করে।
- এই টোকেনটি ব্যবহারকারীর সেশনের সাথে যুক্ত এবং ক্লায়েন্টের কাছে পাঠানো হয়:
- একটি হিডেন ইনপুট ফিল্ড হিসেবে (যখন টেমপ্লেটে
{% csrf_token %}ব্যবহার করা হয়)। - একটি কুকি হিসেবে (
csrftoken)।
- একটি হিডেন ইনপুট ফিল্ড হিসেবে (যখন টেমপ্লেটে
- টোকেন পাঠানো:
- ক্লায়েন্ট যখন একটি ফর্ম সাবমিট করে, তখন CSRF টোকেনটি POST রিকোয়েস্টের সাথে পাঠানো হয়:
- এটি হয় ফর্মের হিডেন ইনপুট ফিল্ড থেকে, অথবা
X-CSRFTokenহেডারের মাধ্যমে (যদি এটি AJAX রিকোয়েস্ট হয়)।
- ক্লায়েন্ট যখন একটি ফর্ম সাবমিট করে, তখন CSRF টোকেনটি POST রিকোয়েস্টের সাথে পাঠানো হয়:
Middleware কীভাবে টোকেন যাচাই করে
- টোকেন সংগ্রহ করা:
CsrfViewMiddlewarePOST রিকোয়েস্টে পাঠানো CSRF টোকেনটি সংগ্রহ করে। এটি ফর্ম ডেটা থেকে অথবা AJAX রিকোয়েস্টের ক্ষেত্রেX-CSRFTokenহেডার থেকে টোকেন সংগ্রহ করতে পারে।- Middleware ব্যবহারকারীর কুকি থেকে
csrftokenসংগ্রহ করে, যা আগের রেন্ডার সময় Django সেট করেছিল।
- টোকেন যাচাই করা:
- Middleware যাচাই করে যে ফর্ম সাবমিশনের টোকেনটি এবং কুকিতে সংরক্ষিত CSRF টোকেনটি মিলে কিনা।
- Middleware নিম্নলিখিত ধাপগুলি অনুসরণ করে:
- যদি CSRF টোকেন উপস্থিত থাকে এবং কুকির সাথে মিলে যায়, তাহলে রিকোয়েস্টটি বৈধ হিসাবে গ্রহণ করা হয়।
- যদি টোকেন মেলে না, অনুপস্থিত থাকে, বা কুকি না মিলে যায়, তাহলে Middleware একটি
403 Forbiddenএরর রিটার্ন করে।
উদাহরণ
- যখন মায়া ফর্মটি পূরণ করে এবং সাবমিট করে, ফর্মের হিডেন ইনপুট ফিল্ড থেকে CSRF টোকেনটি সার্ভারে পাঠানো হয়।
- সার্ভার Middleware ব্যবহার করে:
- কুকি থেকে টোকেনটি সংগ্রহ করে।
- রিকোয়েস্টের টোকেন এবং কুকির টোকেনটি যাচাই করে দেখে যে তারা একই কিনা।
- যদি টোকেনগুলি মিলে যায়, তাহলে রিকোয়েস্টটি বৈধ বলে বিবেচিত হয় এবং সার্ভার ফর্ম ডেটা প্রক্রিয়া করে।
- যদি টোকেন মেলে না, তবে Django একটি
403 Forbiddenএরর রিটার্ন করে, যা ব্যবহারকারীকে জানায় যে রিকোয়েস্টটি অবৈধ।