> 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/sql-injection.md).

# SQL Injection

SQL Injection হল এক ধরনের **Cyber Attack**, যেখানে আক্রমণকারী (Attacker) **SQL Query**-র মাধ্যমে ডাটাবেসের নিয়ন্ত্রণ নিয়ে নিতে পারে। যদি **User Input Properly Validate** না করা হয়, তাহলে Attacker Malicious SQL Code Execute করে ডাটাবেস থেকে সংবেদনশীল তথ্য চুরি, মুছে ফেলা বা পরিবর্তন করতে পারে। এটি Web Application Security-এর অন্যতম ভয়ংকর দুর্বলতা।

***

### SQL Injection কিভাবে কাজ করে?

একটি সাধারণ Web Application যেখানে **User Login System** থাকে, সেখানে ব্যবহারকারীর **Username এবং Password** যাচাই করার জন্য নিচের মত SQL Query ব্যবহার করা হতে পারে:

```sql
SELECT * FROM users WHERE username = 'user_input' AND password = 'password_input';
```

এখন, ধরুন **Attacker** নিচের মত Malicious Input ব্যবহার করলো:

```
Username: ' OR '1'='1
Password: কিছু না দিলেও চলবে!
```

তাহলে উপরের **SQL Query** হবে:

```sql
SELECT * FROM users WHERE username = '' OR '1'='1' AND password = '';
```

⚡ এখন এখানে কি হলো?\
👉 `1=1` সর্বদা সত্য হবে, ফলে **সিস্টেম সকল User এর তথ্য রিটার্ন করবে!**\
👉 অর্থাৎ, **Attacker Password না জেনেও লগইন করতে পারবে!**

***

### SQL Injection-এর ভয়াবহ প্রভাব

✅ **Authentication Bypass** – লগইন না করেও Attacker সিস্টেমে ঢুকে যেতে পারে।\
✅ **Data Leakage** – Sensitive Data (যেমন, User Info, Credit Card Details) চুরি হতে পারে।\
✅ **Data Manipulation** – Attacker ডাটাবেসের তথ্য পরিবর্তন বা মুছে দিতে পারে।\
✅ **System Takeover** – Attacker ডাটাবেসের সম্পূর্ণ নিয়ন্ত্রণ নিতে পারে!

***

### কিভাবে SQL Injection প্রতিরোধ করা যায়?

#### ✅ ১. **Prepared Statements এবং Parameterized Queries ব্যবহার করুন**

Python-এর **MySQL Connector** ব্যবহার করে **Prepared Statement** কিভাবে ব্যবহার করা যায় তা দেখুন:

```python
import mysql.connector

# Database Connection
conn = mysql.connector.connect(
    host="localhost",
    user="root",
    password="",
    database="test_db"
)
cursor = conn.cursor()

# Secure Query using Prepared Statement
query = "SELECT * FROM users WHERE username = %s AND password = %s"
user_input = ("admin", "mypassword")
cursor.execute(query, user_input)

result = cursor.fetchall()
print(result)

cursor.close()
conn.close()
```

🔹 এই পদ্ধতিতে User Input সরাসরি SQL Query-তে যুক্ত হয় না, বরং আলাদা ভাবে Bind হয়, ফলে SQL Injection প্রতিরোধ হয়!

***

#### ✅ ২. **User Input Validation করুন**

✔ SQL Keywords (SELECT, INSERT, DELETE) ব্লক করুন।\
✔ Whitelist Approach ব্যবহার করুন – শুধু নির্দিষ্ট ক্যারেক্টার Allow করুন।\
✔ Regular Expressions (Regex) ব্যবহার করে Input Validate করুন।

```python
import re

def validate_input(user_input):
    # শুধুমাত্র Alphabetic Username অনুমোদিত
    if re.match("^[a-zA-Z0-9_]+$", user_input):
        return True
    return False

print(validate_input("admin"))  # ✅ Valid
print(validate_input("admin' OR 1=1 --"))  # ❌ Invalid
```

***

#### ✅ ৩. **Least Privilege ব্যবহার করুন**

✔ Database User-এর Access Limited করুন\
✔ Root User দিয়ে কাজ না করে আলাদা User তৈরি করুন, যার শুধুমাত্র প্রয়োজনীয় Permission থাকবে।

***

#### ✅ ৪. **Web Application Firewall (WAF) ব্যবহার করুন**

✔ **ModSecurity** বা **Cloudflare WAF** এর মত Security System ব্যবহার করুন।\
✔ SQL Injection-এর Pattern ডিটেক্ট করে তা ব্লক করতে পারে।

***

SQL Injection **একটি মারাত্মক নিরাপত্তা দুর্বলতা**, যা সঠিকভাবে প্রতিরোধ না করলে Web Application Hack হতে পারে। কিন্তু যদি আমরা **Prepared Statement, Input Validation, Least Privilege এবং WAF** ব্যবহার করি, তাহলে সহজেই এই সমস্যার সমাধান সম্ভব!

**স্মরণ রাখুন:** **Security is not a feature, it's a process**
