| HEADER | STATUS | VALUE / NOTE |
|---|---|---|
| Content-Security-Policy | MEDIUM | CSP présent mais contient script-src 'unsafe-inline' + 'unsafe-eval' et style-src 'unsafe-inline' — requis par Next.js 15 App Router. Absent sur 4 endpoints statiques. |
| X-Frame-Options | PASS | DENY |
| X-Content-Type-Options | PASS | nosniff |
| Referrer-Policy | PASS | strict-origin-when-cross-origin |
| Permissions-Policy | LOW | Absent sur 4 routes — aucune feature sensible utilisée (caméra, micro, GPS). Risque mineur. |
| Cross-Origin-Embedder-Policy | LOW | COEP absent — non requis par l'app (pas de SharedArrayBuffer). Risque informationnel. |
| Cross-Origin-Opener-Policy | LOW | COOP absent — pas de fenêtres cross-origin sensibles. Risque mineur. |
| Cross-Origin-Resource-Policy | LOW | CORP absent sur 5 routes statiques — assets publics, aucune donnée sensible exposée. |
| Strict-Transport-Security | PASS | Géré par Vercel CDN (max-age=63072000; includeSubDomains) |
| RISK | ALERT | DESCRIPTION & SOLUTION |
|---|---|---|
| MEDIUM | CSP: script-src unsafe-eval |
La directive script-src contient 'unsafe-eval', requis par Next.js 15 / React pour le rendu SSR et l'hydratation.
▶ Trade-off documenté de Next.js App Router. Risque mitigé par l'absence de saisie utilisateur eval-able. Accepted risk.
|
| MEDIUM | CSP: script-src unsafe-inline |
La directive script-src contient 'unsafe-inline', nécessaire pour les scripts inline Next.js (_next/static chunks hydration).
▶ Mitigation possible via nonce-based CSP — nécessite une config middleware Next.js. Risque XSS limité par l'absence de saisie HTML.
|
| MEDIUM | CSP: style-src unsafe-inline |
La directive style-src contient 'unsafe-inline', utilisé par Tailwind CSS et les styles inline React.
▶ Pas d'injection CSS possible sans XSS préalable. Accepted risk pour un projet Tailwind/React.
|
| MEDIUM | Content Security Policy Header Not Set |
CSP absent sur 4 endpoints statiques (_next/static, favicon, robots.txt). Ces ressources ne servent pas de HTML dynamique.
▶ Ajouter CSP sur les routes statiques via Next.js middleware headers(). Impact sécurité minimal — pas de rendu HTML sur ces endpoints.
|
| RISK | ALERT | NOTE |
|---|---|---|
| LOW | Big Redirect Detected | / redirige vers /mission-control/qa (307). Redirection intentionnelle, aucune information sensible dans l'URL. |
| LOW | Cross-Origin-Embedder-Policy Header Missing | COEP absent — non requis, pas de SharedArrayBuffer utilisé. Risque informationnel. |
| LOW | Cross-Origin-Opener-Policy Header Missing | COOP absent — pas de popup cross-origin. Risque mineur. |
| LOW | Cross-Origin-Resource-Policy Missing (x5) | CORP absent sur 5 routes statiques publiques. Assets non sensibles — pas d'exploitation possible. |
| LOW | Permissions Policy Header Not Set (x4) | Permissions-Policy absent sur 4 routes. Aucune feature sensible activée (caméra, géolocalisation, micro). |
| RESULT | TEST | EVIDENCE |
|---|---|---|
| PASS | XSS via CLI command input | React escapes all user input. Confirmed via Playwright E2E (security-ui.spec.ts) |
| N/A | SQL Injection | Pure simulation — no SQL backend, no database queries |
| PASS | Command Injection via CLI | Commands validated against whitelist (RTH, HOLD, EMERGENCY_LAND, GOTO) |
| PASS | GPS coordinate leak via console.log | No GPS coordinates in browser console — confirmed by Playwright E2E |
| PASS | JWT / secret exposure in HTML | No tokens, keys, or credentials found in page source |
| URL | METHOD | SCANNED |
|---|---|---|
| https://sakuranode.com/mission-control/ | GET | ✓ |
| https://sakuranode.com/mission-control/demo | GET | ✓ |
| https://sakuranode.com/mission-control/docs | GET | ✓ |
| https://sakuranode.com/api/mission-control/telemetry | GET | ✓ |
| https://sakuranode.com/api/mission-control/commands | POST | ✓ |