SQL Injection এবং XSS থেকে রক্ষা পাওয়া

Web Development - ফাস্টএপিআই (FastAPI) - FastAPI এর Security Best Practices
191

FastAPI একটি উচ্চ পারফরম্যান্স ওয়েব ফ্রেমওয়ার্ক, যা সিকিউরিটি ফিচারগুলোকে গুরুত্ব দিয়ে তৈরি করা হয়েছে। তবে, অ্যাপ্লিকেশন সিকিউরিটি নিশ্চিত করতে SQL Injection এবং Cross-Site Scripting (XSS) এর মত সাধারণ আক্রমণ থেকে রক্ষা পাওয়া খুবই গুরুত্বপূর্ণ।

এখানে আমরা আলোচনা করব কীভাবে FastAPI তে SQL Injection এবং XSS আক্রমণ থেকে রক্ষা পাওয়া যায়।


1. SQL Injection থেকে রক্ষা পাওয়া

SQL Injection হল একটি নিরাপত্তা দুর্বলতা, যেখানে আক্রমণকারী ক্ষতিকর SQL কোড ইনপুটের মাধ্যমে ডাটাবেসের তথ্য চুরি করতে বা নষ্ট করতে পারে। FastAPI তে SQLAlchemy বা Tortoise ORM ব্যবহার করে SQL Injection থেকে রক্ষা পাওয়া সহজ।

SQL Injection Prevention:

  1. Prepared Statements বা ORM ব্যবহার করুন: ORM ব্যবহার করার মাধ্যমে SQL Injection আক্রমণ প্রতিরোধ করা সম্ভব। ORM যেমন SQLAlchemy বা Tortoise ORM ইনপুট ভ্যালিডেশন এবং ডাটাবেস কুয়েরি নির্মাণে স্বয়ংক্রিয়ভাবে SQL Injection প্রতিরোধ করে।
  2. Parameterization: কুয়েরি প্যারামিটারাইজেশন ব্যবহার করুন। Direct SQL কুয়েরি লেখার সময়, প্যারামিটারাইজড কুয়েরি ব্যবহার করুন।

উদাহরণ: SQLAlchemy দিয়ে SQL Injection থেকে রক্ষা

from fastapi import FastAPI, HTTPException
from sqlalchemy.orm import Session
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

# SQLAlchemy Setup
DATABASE_URL = "sqlite:///./test.db"
engine = create_engine(DATABASE_URL)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
Base = declarative_base()

app = FastAPI()

# প্যারামিটারাইজড কুয়েরি (Prepared Statements)
@app.get("/get_user/{user_id}")
def get_user(user_id: int, db: Session = Depends(get_db)):
    user = db.query(User).filter(User.id == user_id).first()  # SQL Injection প্রতিরোধ
    if user is None:
        raise HTTPException(status_code=404, detail="User not found")
    return user

def get_db():
    db = SessionLocal()
    try:
        yield db
    finally:
        db.close()

এখানে filter(User.id == user_id) প্যারামিটারাইজড কুয়েরি ব্যবহার করা হয়েছে, যাতে SQL Injection থেকে রক্ষা পাওয়া যায়। সরাসরি SQL কোড লিখলে, ইনপুটের মাধ্যমে SQL Injection হতে পারে, তবে ORM ব্যবহারে এই সমস্যা এড়ানো যায়।

SQL Injection Example (Unsafe Query)

# Unsafe direct SQL query
cursor.execute("SELECT * FROM users WHERE id = " + user_id)

এটি SQL Injection এর জন্য ঝুঁকিপূর্ণ। এটি ব্যবহার না করে ORM ব্যবহার করা উচিত।


2. XSS (Cross-Site Scripting) থেকে রক্ষা পাওয়া

Cross-Site Scripting (XSS) আক্রমণ হলো যেখানে আক্রমণকারী ক্ষতিকর স্ক্রিপ্ট ব্যবহার করে ইউজারের ব্রাউজারে ক্ষতিকর কোড চালায়, যা ইউজারের সেশন চুরি করতে বা ভুয়া ডাটা প্রদর্শন করতে ব্যবহৃত হতে পারে। FastAPI তে XSS থেকে রক্ষা পাওয়ার জন্য আপনি ইনপুট ভ্যালিডেশন এবং আউটপুট স্যানিটাইজেশন ব্যবহার করতে পারেন।

XSS Prevention:

  1. HTML Escaping: যখন HTML ডাটা রিটার্ন করবেন, তখন HTML escaping ব্যবহার করুন, যাতে স্ক্রিপ্ট ইনজেকশনের চেষ্টা ব্যর্থ হয়।
  2. Input Validation: ইউজারের ইনপুট ভ্যালিডেট করে নিশ্চিত করুন যে এতে কোন স্ক্রিপ্ট (JavaScript) কোড বা অপ্রত্যাশিত HTML কোড নেই।
  3. Use Templates Properly: FastAPI তে Jinja2 templates ব্যবহার করতে পারেন, যা ইনপুট ভ্যালিডেশন এবং HTML escaping স্বয়ংক্রিয়ভাবে করে দেয়।

উদাহরণ: Jinja2 Templates ব্যবহারের মাধ্যমে XSS থেকে রক্ষা

from fastapi import FastAPI, HTMLResponse
from fastapi.templating import Jinja2Templates
from starlette.requests import Request

app = FastAPI()

# Jinja2 Template Setup
templates = Jinja2Templates(directory="templates")

@app.get("/display_user/{user_name}", response_class=HTMLResponse)
async def display_user(request: Request, user_name: str):
    return templates.TemplateResponse("user_profile.html", {"request": request, "user_name": user_name})

এখানে Jinja2Templates ব্যবহার করা হয়েছে, যা HTML escaping নিশ্চিত করে, যাতে ইউজারের ইনপুট যেমন "<script>alert('XSS')</script>" আক্রমণকৃত না হয়।

user_profile.html template:

<html>
    <body>
        <h1>Welcome, {{ user_name }}!</h1>
    </body>
</html>

এখানে, Jinja2-এর {{ user_name }} সিনট্যাক্স স্বয়ংক্রিয়ভাবে HTML escaping করে, যাতে ইনপুটের মধ্যে যদি কোনো স্ক্রিপ্ট থাকে, তা চালানো না যায়।

Unsafe Example (XSS Vulnerability):

<html>
    <body>
        <h1>Welcome, <script>alert('XSS')</script></h1>
    </body>
</html>

এখানে, <script>alert('XSS')</script> স্ক্রিপ্টটি XSS আক্রমণের জন্য ব্যবহার করা হতে পারে।


3. Security Headers ব্যবহার করা

FastAPI তে Security Headers যেমন Content-Security-Policy (CSP), X-Content-Type-Options, X-Frame-Options, এবং Strict-Transport-Security (HSTS) যোগ করা উচিত, যা XSS এবং অন্যান্য নিরাপত্তা দুর্বলতা থেকে সুরক্ষা দিতে সাহায্য করে।

উদাহরণ: Security Headers যোগ করা

from fastapi import FastAPI
from starlette.middleware.base import BaseHTTPMiddleware
from starlette.responses import JSONResponse

class SecurityMiddleware(BaseHTTPMiddleware):
    async def dispatch(self, request, call_next):
        response = await call_next(request)
        response.headers['Content-Security-Policy'] = "default-src 'self'"
        response.headers['X-Content-Type-Options'] = "nosniff"
        response.headers['X-Frame-Options'] = "DENY"
        response.headers['Strict-Transport-Security'] = "max-age=63072000; includeSubDomains"
        return response

app = FastAPI()

# Add Security Middleware
app.add_middleware(SecurityMiddleware)

@app.get("/")
async def main():
    return {"message": "Security headers added!"}

এখানে, CSP, X-Content-Type-Options, X-Frame-Options, এবং HSTS সিকিউরিটি হেডারগুলোর মাধ্যমে XSS আক্রমণ প্রতিরোধ করা হয়েছে।


4. FastAPI তে Data Validation

FastAPI তে Pydantic ব্যবহার করে ইনপুট ভ্যালিডেশন করা হয়। আপনি ইনপুট ডাটার ধরণ এবং সীমাবদ্ধতা চেক করতে পারেন, যেমন কেবলমাত্র অনুমোদিত ক্যারেক্টার, সংখ্যা, বা টাইপ গ্রহণ করা উচিত।

উদাহরণ: ইনপুট ভ্যালিডেশন

from pydantic import BaseModel, constr

class Item(BaseModel):
    name: constr(min_length=3, max_length=50)  # Only allow strings with length 3-50

@app.post("/items/")
async def create_item(item: Item):
    return {"item_name": item.name}

এখানে, name ফিল্ডের জন্য min_length এবং max_length সীমাবদ্ধতা দেওয়া হয়েছে, যাতে ইনপুট ভ্যালিডেশন করা যায়।


SQL Injection এবং XSS থেকে রক্ষা পেতে FastAPI শক্তিশালী input validation, HTML escaping, এবং ORM এর মাধ্যমে prepared statements ব্যবহার করে। Pydantic মডেল এবং Jinja2 templates সহ input sanitization এবং output encoding এর মাধ্যমে এই ধরনের আক্রমণ প্রতিরোধ করা সম্ভব। এছাড়া Security headers এবং CORS Middleware ব্যবহারের মাধ্যমে আপনি নিরাপত্তা আরও জোরালো করতে পারেন।

এই নিরাপত্তা ব্যবস্থাগুলোর মাধ্যমে, FastAPI তে আপনার অ্যাপ্লিকেশন নিরাপদ এবং আক্রমণ-মুক্ত রাখা সম্ভব।

Content added By
Promotion
NEW SATT AI এখন আপনাকে সাহায্য করতে পারে।

Are you sure to start over?

Loading...