> For the complete documentation index, see [llms.txt](https://mominur.gitbook.io/mominur-notes/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://mominur.gitbook.io/mominur-notes/system-design/security/csrf.md).

# CSRF

আজকের দিনে, ওয়েব অ্যাপ্লিকেশনগুলি সাধারণত ব্যাবহারকারীদের ডেটা এবং সিস্টেমের সাথে ইন্টারঅ্যাক্ট করতে বিভিন্ন ধরনের HTTP রিকোয়েস্ট (POST, GET, PUT ইত্যাদি) ব্যবহার করে। তবে, এই HTTP রিকোয়েস্টগুলোর মধ্যে যদি কোনো দুর্বলতা থাকে, তাহলে তা attackers-এর জন্য একটি সুযোগ তৈরি করতে পারে। এর মধ্যে অন্যতম একটি গুরুতর সমস্যা হল Cross-Site Request Forgery বা CSRF অ্যাটাক।

### **CSRF কি?**

CSRF হল এমন একটি ধরনের আক্রমণ যেখানে একজন ব্যবহারকারী, যিনি ইতিমধ্যেই লগইন করা আছেন, তাদের ব্রাউজারকে ব্যবহার করে একটি জালিয়াতি রিকোয়েস্ট চালানো হয়। এটি মূলত ওয়েব অ্যাপ্লিকেশনের দুর্বলতা ব্যবহার করে, যেখানে অ্যাপ্লিকেশন একটি রিকোয়েস্ট আসলে সেটি ব্যবহারকারীর পক্ষ থেকে পাঠানো বলে মনে করে।

ধরি, আপনি একটি অ্যাপ্লিকেশন ব্যবহার করছেন যেখানে আপনি ফান্ড ট্রান্সফার করতে পারেন। এখন, যদি আপনি সেই ওয়েব অ্যাপ্লিকেশনে লগইন থাকেন এবং অন্য একটি সাইটে যান, সেখানে যদি একটি CSRF আক্রমণকারীর তৈরি করা ম্যালিসিয়াস কোড থাকে, তবে তা আপনার অ্যাকাউন্টের মাধ্যমে কোনো টাকা ট্রান্সফার করতে পারে, যা আপনি ইচ্ছা করেননি!

### **CSRF আক্রমণের প্রক্রিয়া কীভাবে কাজ করে?**

CSRF আক্রমণের মূল লক্ষ্য হল, কোনো ব্যবহারকারী যখন তার ব্রাউজারে কোনো ওয়েব অ্যাপ্লিকেশনে লগইন থাকে, তখন সে আক্রমণকারী ওয়েবসাইটে গিয়ে একটি বিশেষভাবে তৈরি করা HTTP রিকোয়েস্ট চালাতে পারে, যাতে সেই ব্যবহারকারীর পক্ষ থেকে সেই ওয়েব অ্যাপ্লিকেশনে কিছু পরিবর্তন ঘটে।

উদাহরণস্বরূপ:

1. আপনি "BankingApp" নামে একটি ওয়েবসাইটে লগইন আছেন এবং আপনার অ্যাকাউন্টে লগইন রয়েছ।
2. পরে আপনি একটি অপরিচিত ওয়েবসাইটে যান, যেখানে আক্রমণকারী একটি ম্যালিসিয়াস স্ক্রিপ্ট (JavaScript) রেখেছে।
3. এই স্ক্রিপ্টটি ব্যাকগ্রাউন্ডে "BankingApp" ওয়েবসাইটে গিয়ে আপনার টাকা ট্রান্সফার করার রিকোয়েস্ট তৈরি করে।
4. যেহেতু আপনি আগেই লগইন আছেন, "BankingApp" ওয়েবসাইটটি ধরে নেবে যে এটি একটি বৈধ রিকোয়েস্ট এবং ট্রান্সফারটি সম্পন্ন হয়ে যাবে।

### **এটি কীভাবে প্রতিরোধ করা যায়?**

CSRF প্রতিরোধের জন্য কিছু জনপ্রিয় এবং কার্যকরী কৌশল রয়েছে:

1. **Anti-CSRF Token:** ওয়েব ফর্ম বা API রিকোয়েস্টে একটি বিশেষ "Token" যোগ করা হয়, যা প্রতিটি রিকোয়েস্টের জন্য ভিন্ন হয়। এই টোকেনটি শুধু অ্যাপ্লিকেশনেই জানা থাকে এবং এটি প্রতিটি রিকোয়েস্টের সাথে সঠিকভাবে যাচাই করা হয়। যদি টোকেন সঠিক না হয়, তবে রিকোয়েস্টটি বাতিল করা হয়।

   **উদাহরণ:**

   ধরুন, আমাদের একটি ফান্ড ট্রান্সফার ফর্ম রয়েছে, যা একটি POST রিকোয়েস্ট প্রেরণ করবে। এখন, আমরা একটি anti-CSRF token যোগ করি যাতে আক্রমণকারী কোনো ম্যালিসিয়াস রিকোয়েস্ট পাঠাতে না পারে।

   **Python কোড উদাহরণ:**

   ```python
   import os
   from flask import Flask, request, render_template_string
   import hashlib

   app = Flask(__name__)

   # CSRF Token Generator
   def generate_csrf_token():
       return hashlib.sha256(os.urandom(64)).hexdigest()

   # Store the CSRF token in the session (assuming Flask's session is used)
   app.secret_key = 'your_secret_key'

   @app.route('/')
   def index():
       # Generate and store token in session
       token = generate_csrf_token()
       return render_template_string("""
           <form method="POST" action="/transfer">
               <input type="hidden" name="csrf_token" value="{{ token }}">
               Amount: <input type="text" name="amount">
               <button type="submit">Transfer</button>
           </form>
       """, token=token)

   @app.route('/transfer', methods=['POST'])
   def transfer():
       # Check CSRF token
       csrf_token = request.form.get('csrf_token')
       if csrf_token != session.get('csrf_token'):
           return "CSRF token mismatch!", 400
       # Proceed with the fund transfer logic
       return "Transfer successful!"

   if __name__ == '__main__':
       app.run(debug=True)
   ```
2. **SameSite Cookies:** এই কৌশলে, cookies-এর জন্য একটি নিরাপত্তা প্যারামিটার "SameSite" ব্যবহার করা হয়। যদি আপনি একটি CSRF আক্রমণ প্রতিরোধ করতে চান, তবে cookies-এ SameSite প্যারামিটার "Strict" অথবা "Lax" সেট করতে হবে। এর মাধ্যমে, শুধুমাত্র ঐ ডোমেইন থেকে রিকোয়েস্ট আসলেই cookies পাঠানো হবে।
3. **Request Validation (Referer Header Check):** রিকোয়েস্টের **Referer** হেডার যাচাই করা, এটা নিশ্চিত করতে পারে যে রিকোয়েস্টটি সরাসরি আপনার ওয়েবসাইট থেকে এসেছে। তবে, এই কৌশলটি কিছু সীমাবদ্ধতার মধ্যে পড়ে এবং প্রায়ই CSRF আক্রমণের বিরুদ্ধে একা কার্যকরী হতে পারে না।
4. **Double Submit Cookie:** এই পদ্ধতিতে, একটি CSRF টোকেন ব্যবহারকারীর cookies এবং ফর্মের মধ্যে একই সাথে পাঠানো হয়। রিকোয়েস্ট করার সময় উভয় টোকেনই যাচাই করা হয়। যদি এগুলোর মধ্যে কোনো অমিল থাকে, তাহলে রিকোয়েস্টটি বাতিল করা হয়।

CSRF একটি গুরুতর ওয়েব নিরাপত্তা দুর্বলতা, যা ওয়েব অ্যাপ্লিকেশনগুলোর জন্য অনেক বিপদের কারণ হতে পারে। তবে, সঠিক নিরাপত্তা কৌশল এবং পদ্ধতির মাধ্যমে এই ধরনের আক্রমণ প্রতিরোধ করা সম্ভব। Anti-CSRF Token, SameSite Cookies, এবং Referer Header Validation এর মতো নিরাপত্তা ব্যবস্থা গ্রহণ করে, আপনি আপনার ওয়েব অ্যাপ্লিকেশনকে নিরাপদ রাখতে পারেন এবং ব্যবহারকারীদের তথ্য সুরক্ষিত রাখতে সাহায্য করতে পারেন।
