# سیاست امنیتی

## مدل تهدید

این سامانه خصوصی و چندپروژه‌ای است. تهدیدهای اصلی شامل دسترسی غیرمجاز، IDOR/Cross-project Leakage، SQL Injection، XSS، CSRF، Session Fixation، Brute Force، Upload مخرب XLSX، Zip Bomb، Formula Injection در Export و افشای Backup/Log است.

## کنترل‌های پیاده‌سازی‌شده

- Authentication با `password_hash()` و `password_verify()`؛ ثبت‌نام عمومی وجود ندارد.
- Session سمت Server با Regeneration، Strict Mode و Cookieهای `HttpOnly`, `SameSite=Strict` و `Secure` روی HTTPS.
- Rate Limit ترکیبی Email/IP به‌صورت HMAC و Lockout موقت بدون User Enumeration.
- Role و Permission در Backend؛ Project Context از Membership سمت Server تعیین می‌شود.
- تمام Queryهای دارای داده ورودی با PDO Prepared Statements اجرا می‌شوند. نام Table/Column فقط از Allowlist پیکربندی داخلی می‌آید.
- CSRF Token برای تمام عملیات تغییردهنده.
- Escape خروجی HTML با `htmlspecialchars`.
- Scope اجباری `project_id` برای CRUD، Search، Export، Backup و Import.
- Optimistic Locking با `version` و Snapshot تاریخچه رکورد.
- Soft Delete و Audit Log.
- Security Headerها: CSP، HSTS روی HTTPS، `X-Content-Type-Options`, `X-Frame-Options`, `Referrer-Policy`, `Permissions-Policy` و `X-Robots-Tag`.
- Production Errorها Stack Trace نمایش نمی‌دهند و Log خارج از Public Root است.
- Installer Token، بررسی Environment و Installer Lock.
- Workbook Upload فقط XLSX، با Extension/MIME/ZIP Signature، Path Traversal، Macro Part، سقف حجم، سقف Uncompressed Size و سقف Cell Count.
- Macro/VBA و External Link اجرا یا Follow نمی‌شود.
- فایل Upload با نام تصادفی و Permission محدود خارج از Public Root ذخیره می‌شود.
- CSV Export با UTF-8 BOM و Escape مقادیر آغازشونده با `=`, `+`, `-`, `@`.
- Backup/Restore دارای Hash، Dry Run، Project Ownership، تأیید مضاعف و Safety Backup است.
- Chart.js و Vazirmatn Self-hosted هستند و CSP به CDN عمومی اجازه نمی‌دهد.

## Secret Management

هیچ Password، Secret، API Key یا مشخصات واقعی Database در بسته وجود ندارد. `.env` باید خارج از Version Control باشد و فقط کاربر سرویس PHP آن را بخواند. مقادیر زیر را مستقل و تصادفی تولید کنید:

- `APP_KEY`: حداقل ۳۲ نویسه
- `INSTALL_TOKEN`: حداقل ۳۲ نویسه و یک‌بارمصرف
- Database Password: طولانی و یکتا، با حداقل Privilege

پس از نصب `INSTALL_TOKEN` را Rotate یا حذف کنید. Backup و `.env` را رمزگذاری و دسترسی آن‌ها را محدود کنید.

## Hardening استقرار

1. فقط `public/` را Document Root کنید.
2. HTTPS را پیش از Installer فعال کنید.
3. پنل را پشت HTTP Basic Auth، IP Allowlist، VPN یا Zero Trust قرار دهید.
4. کاربر Database فقط مجوزهای لازم Schema همین اپ را داشته باشد.
5. `APP_DEBUG=false` نگه دارید.
6. Listing پوشه و اجرای PHP در Storage را ممنوع کنید.
7. Backup خارج از Host و رمزگذاری‌شده نگهداری شود.
8. Log Rotation، Retention و Alert برای Login Failure/Unauthorized Export فعال شود.
9. PHP، Database و Web Server را Patch نگه دارید.
10. پس از نصب، Dynamic Security Test در Staging و سپس Production Smoke Test اجرا شود.

## گزارش آسیب‌پذیری

گزارش باید شامل نسخه بسته، Endpoint، Role/Project Context، مراحل بازتولید، Impact و Log Request ID باشد. Secret یا داده واقعی پروژه را در گزارش عمومی قرار ندهید.
