# 🔒 Secure PHP Backend — Setup Guide

## ⚠️ গুরুত্বপূর্ণ — আপলোডের আগে অবশ্যই করুন

### ১. `db.php` এ JWT Secret পরিবর্তন করুন

ফাইল খুলে এই লাইনটা খুঁজুন:
```php
$JWT_SECRET = 'CHANGE_THIS_TO_A_LONG_RANDOM_SECRET_KEY_AT_LEAST_64_CHARS_LONG_xxxx';
```

একটা **random 64+ character string** বসান। তৈরি করতে:
- https://generate-secret.vercel.app/64 এ যান, কপি করুন
- অথবা terminal এ: `openssl rand -hex 32`

**এই secret কখনো কাউকে শেয়ার করবেন না।**

---

## 📤 Upload Steps (cPanel)

1. এই zip ফাইল extract করুন
2. cPanel → **File Manager** → `public_html/api/` এ যান
3. সব ফাইল (`.htaccess` সহ) আপলোড করুন
4. `uploads/` folder এর permission `755` সেট করুন (file upload চাইলে)

---

## 🛡️ যা যা Security Add করা হয়েছে

| Layer | কী করে |
|---|---|
| **JWT Authentication** | প্রতি protected request এ valid token লাগে |
| **Authorization** | শুধু owner নিজের post/comment delete/edit করতে পারবে |
| **Rate Limiting** | IP প্রতি ১ মিনিটে ১২০ request max; login 10/10min |
| **CORS Whitelist** | শুধু আপনার domain গুলো allowed |
| **Sensitive Fields Hidden** | অন্যের email, phone, password_hash কখনো return হয় না |
| **Input Validation** | Length limits, type checks, enum validation |
| **File Upload Security** | MIME check, 5MB limit, random filename, type whitelist |
| **SQL Injection** | PDO prepared statements (already secure) |
| **Password Hashing** | BCRYPT, min 8 chars |
| **Security Headers** | X-Frame-Options, HSTS, nosniff, referrer policy |
| **Sensitive File Block** | `.sql`, `.md`, `.env`, `.log` direct access blocked |

---

## 📡 Frontend থেকে কীভাবে API call করবেন

Login এর পর token save করুন:
```js
const res = await fetch('https://maxbdt.xyz/api/auth.php', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({ action: 'login', email, password })
});
const { data } = await res.json();
localStorage.setItem('token', data.token);
```

প্রতি protected request এ token পাঠান:
```js
const token = localStorage.getItem('token');
await fetch('https://maxbdt.xyz/api/posts.php', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'Authorization': `Bearer ${token}`   // ← এটা জরুরি
  },
  body: JSON.stringify({ content: 'Hello!' })
});
```

---

## ✅ Public vs Protected Endpoints

### 🟢 Public (token লাগে না)
- `POST /auth.php` (register/login)
- `GET /posts.php` (public posts feed)
- `GET /comments.php?post_id=xxx`
- `GET /reactions.php?target_type=...&target_id=...`

### 🔒 Protected (Bearer token লাগে)
- `GET /auth.php` (profile)
- `PUT /auth.php` (update profile)
- `POST /posts.php` (create), `PUT`, `DELETE`
- `POST/PUT/DELETE /comments.php`
- `POST/DELETE /reactions.php`
- `GET/POST /messages.php` (সব)
- `GET/POST/PUT /users.php` (সব)
- `POST /submit_form.php`
- `POST /upload.php`

---

## 🧪 Test করুন

token ছাড়া protected endpoint call:
```bash
curl -X POST https://maxbdt.xyz/api/posts.php -d '{"content":"test"}'
# Expected: {"success":false,"message":"Authorization token required"} (401)
```

token দিয়ে:
```bash
TOKEN="eyJhbGc..."
curl -X POST https://maxbdt.xyz/api/posts.php \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"content":"Hello secured world!"}'
```

---

## 💡 আরো নিরাপত্তার জন্য (Optional)

1. **Cloudflare** add করুন (Free) → DDoS + WAF + rate limit
2. **HTTPS** force করুন (`.htaccess` এ ইতিমধ্যে HSTS আছে)
3. cPanel এ **ModSecurity** enable রাখুন
4. Production এ `display_errors = Off` রাখুন (cPanel PHP Selector)
5. Backup নিন নিয়মিত
