আজকের লেকচারে স্বাগতম!

কোথায় আছি আমরা? আপনি বর্তমানে সিকিউরিটির অন্যতম গুরুত্বপূর্ণ টপিক XSRF/CSRF (Cross-Site Request Forgery)-এর দ্বিতীয় অংশে আছেন। গত লেকচারে আমরা দেখেছিলাম হ্যাকাররা কীভাবে ইউজারকে বোকা বানিয়ে অন্য ওয়েবসাইট থেকে আমাদের সাইটে ফেক রিকোয়েস্ট পাঠায়। আজকে আমরা শিখবো কীভাবে Anti-Forgery Token ব্যবহার করে এই অ্যাটাক প্রতিরোধ করা যায় এবং ASP.NET Core-এ এটি ব্যাকগ্রাউন্ডে কীভাবে কাজ করে। চলুন শুরু করি!


📝 Quick Summary for Revision

ভবিষ্যতে দ্রুত রিভিশন দেওয়ার জন্য আজকের লেকচারের মূল বিষয়গুলো নিচে লিস্ট করা হলো:

  • The Solution: XSRF থেকে বাঁচার উপায় হলো Anti-Forgery Token ব্যবহার করা।
  • How it works: সার্ভার একটি সিক্রেট টোকেন তৈরি করে, যার অর্ধেক ব্রাউজারের Cookie-তে (Cookie Token) এবং বাকি অর্ধেক HTML Form-এর হিডেন ফিল্ডে (Form Token) পাঠিয়ে দেয়।
  • Validation: ফর্ম সাবমিট করার সময় সার্ভার চেক করে যে Cookie এবং Form—দুই জায়গা থেকেই টোকেনের অংশগুলো এসেছে কিনা এবং সেগুলো মিলছে কিনা। হ্যাকার Cookie পেলেও Form Tokenটি পায় না, ফলে তার রিকোয়েস্ট রিজেক্ট হয়ে যায়।
  • Implementation in View: Razor View-তে <form> ট্যাগে asp-controller এবং asp-action ব্যবহার করলেই ASP.NET Core অটোমেটিকভাবে Form Token জেনারেট করে দেয়।
  • Implementation in Controller: [HttpPost] মেথডের ওপর [ValidateAntiForgeryToken] অ্যাট্রিবিউট ব্যবহার করতে হয়।
  • Global Implementation: প্রতিটা POST মেথডে আলাদা করে না লিখে, Program.cs-এ গ্লোবালি AutoValidateAntiforgeryTokenAttribute অ্যাড করা বেস্ট প্র্যাকটিস।

🧠 Comprehensive Breakdown

এখানে লেকচারের প্রতিটি বিষয় বিস্তারিতভাবে এবং ধাপে ধাপে ব্যাখ্যা করা হলো:

১. The Core Concept of Anti-Forgery Token (Priority: 10/10)

হ্যাকারদের আটকানোর জন্য ASP.NET Core একটি অত্যন্ত বুদ্ধিদীপ্ত পদ্ধতি ব্যবহার করে। যখন আপনি কোনো পেজ (যেখানে ফর্ম আছে) লোড করেন, তখন সার্ভার ব্যাকগ্রাউন্ডে কিছু কাজ করে:

  1. Hash Generation: সার্ভার Session ID এবং একটি Salt (র‍্যান্ডম ভ্যালু) ব্যবহার করে SHA-256 অ্যালগরিদমের মাধ্যমে একটি দীর্ঘ Hash বা টোকেন তৈরি করে।
  2. Splitting the Token: এরপর সার্ভার এই টোকেনটিকে দুই ভাগে ভাগ করে:
  • Cookie Token: প্রথম অংশটি AspNetCore.Antiforgery নামের একটি Cookie হিসেবে ব্রাউজারে সেভ করে।
  • Form Token: দ্বিতীয় অংশটি HTML Form-এর ভেতরে একটি হিডেন ইনপুট ফিল্ড হিসেবে যুক্ত করে। ফিল্ডটির নাম থাকে __RequestVerificationToken

২. How it stops the Hacker (Priority: 10/10)

গত লেকচারে আমরা দেখেছিলাম, হ্যাকার যখন attacker.com থেকে রিকোয়েস্ট পাঠায়, ব্রাউজারের নিয়ম অনুযায়ী ইউজারের Cookie (যেখানে Cookie Token আছে) সার্ভারে চলে যায়।

কিন্তু હ্যাকার ধরা খাবে কোথায়? সার্ভার রিকোয়েস্ট রিসিভ করার পর Cookie Token এর পাশাপাশি Form-এর ডেটা থেকে Form Token ও খুঁজবে। যেহেতু হ্যাকারের তৈরি করা ফর্মে ওই হিডেন __RequestVerificationToken ফিল্ডটি নেই (এটি শুধু অরিজিনাল পেজেই থাকে এবং প্রতিবার রিফ্রেশে চেঞ্জ হয়), তাই সার্ভার বুঝতে পারবে যে এটি একটি ফেক রিকোয়েস্ট এবং সাথে সাথে 400 Bad Request রিটার্ন করে রিকোয়েস্টটি রিজেক্ট করে দিবে।

৩. Implementing Anti-Forgery in ASP.NET Core (Priority: 10/10)

এই এত বড় মেকানিজমটি কোডে লেখা একদম সহজ!

Step 1: In the View (.cshtml) আপনাকে এক্সট্রা কিছুই লিখতে হবে না। শুধু খেয়াল রাখবেন আপনার ফর্মে যেন Tag Helpers ব্যবহার করা হয়।

<form asp-controller="Account" asp-action="Register" method="post">
    </form>
 

Step 2: In the Controller (.cs) যেই অ্যাকশন মেথড ডেটাবেসে পরিবর্তন আনে (যেমন HttpPost), তার ওপরে এই অ্যাট্রিবিউটটি বসিয়ে দিন:

[HttpPost]
[ValidateAntiForgeryToken] // এটি টোকেন ভ্যালিডেট করবে
public async Task<IActionResult> Register(RegisterDTO registerDTO)
{
    // ... code ...
}
 

৪. The Smarter Way: Global Auto-Validation (Priority: 10/10)

প্রজেক্টে যদি ৫০টি POST মেথড থাকে, তবে প্রতিটার ওপরে [ValidateAntiForgeryToken] লেখা বিরক্তিকর এবং ভুলে যাওয়ার সম্ভাবনা থাকে। এর চেয়ে ভালো হয় যদি আমরা এটি গ্লোবালি সেট করে দিই।

লেকচারার এখানে ValidateAntiForgeryTokenAttribute এর বদলে AutoValidateAntiforgeryTokenAttribute ব্যবহার করার পরামর্শ দিয়েছেন।

  • Why AutoValidate? কারণ এটি শুধু POST, PUT, DELETE ইত্যাদি রিকোয়েস্টের জন্যই টোকেন চেক করবে। GET রিকোয়েস্টে (যা শুধু ডেটা রিড করে) এটি অযথাই টোকেন খুঁজবে না।

💻 Code Implementation (StartupExtensions.cs বা Program.cs):

using Microsoft.AspNetCore.Mvc;
 
// MVC কনফিগার করার সময় Filter অ্যাড করে দিন
services.AddControllersWithViews(options =>
{
    // এটি গ্লোবালি সব POST রিকোয়েস্টকে CSRF অ্যাটাক থেকে প্রটেক্ট করবে
    options.Filters.Add(new AutoValidateAntiforgeryTokenAttribute());
});
 

এই এক লাইন কোড লেখার পর আপনাকে আর কোনো কন্ট্রোলারে ম্যানুয়ালি [ValidateAntiForgeryToken] লিখতে হবে না!


🌟 Best Practices & Modern Updates (.NET 10 Context)

  • Always use AutoValidateAntiforgeryToken: গ্লোবালি এটি ব্যবহার করা ইন্ডাস্ট্রির গোল্ডেন রুল। তবে যদি কখনো কোনো থার্ড-পার্টি API থেকে POST রিকোয়েস্ট রিসিভ করার প্রয়োজন হয় (যেখানে টোকেন পাঠানো সম্ভব নয়), তখন সেই নির্দিষ্ট মেথডের ওপরে [IgnoreAntiforgeryToken] লিখে দিলে সেটি টোকেন ভ্যালিডেশন স্কিপ করবে।
  • AJAX Requests with Antiforgery: আপনি যদি JavaScript (fetch বা jQuery AJAX) দিয়ে POST রিকোয়েস্ট পাঠান, তবে ফর্মের মতো অটোমেটিক টোকেন যায় না। সেক্ষেত্রে হিডেন ইনপুট ফিল্ড থেকে টোকেনটি পড়ে রিকোয়েস্টের হেডারে RequestVerificationToken হিসেবে ম্যানুয়ালি পাঠিয়ে দিতে হয়।
  • .NET 10 Minimal APIs: আপনি যদি Minimal APIs নিয়ে কাজ করেন, সেখানেও Antiforgery সাপোর্ট দেওয়া হয়েছে। এন্ডপয়েন্টের শেষে .RequireAntiforgery() কল করলেই সেই এন্ডপয়েন্টটি সিকিউর হয়ে যায়।

অসাধারণ! আপনি সফলভাবে একটি বিশাল এবং জটিল সিকিউরিটি কনসেপ্ট আয়ত্ত করেছেন। আপনার অ্যাপ্লিকেশন এখন হ্যাকারদের CSRF অ্যাটাক থেকে সম্পূর্ণ নিরাপদ!