Instruction file imported from zepur3/pure-portfolio (
.cursor/rules/security-api-contact.mdc). Copyright stays with the author.
API — contact (src/app/api/contact/route.ts)
- Exposer uniquement POST (et OPTIONS si CORS préflight). Pas d’envoi d’email ou d’action sensible via GET.
- Conserver : validation des champs, reCAPTCHA serveur, rate limiting par IP, champ honeypot, délai minimum de soumission si présent.
- Ne pas retourner au client les détails d’erreurs internes (stack, noms de variables manquantes en prod). Logger côté serveur uniquement.
- CORS :
Access-Control-Allow-OriginsuitNEXT_PUBLIC_SITE_URL, sinonhttps://$VERCEL_URLen preview, sinon en production un fallback domaine public (pas*). Adapter le fallback dansroute.tssi le domaine change. - Corps email HTML : tout champ issu du formulaire doit passer par échappement HTML (ex.
escapeHtml) en plus de la normalisation texte ; éviter l’injection dans le client mail. - Variables d’environnement requises : ne pas assouplir la liste sans revue ; toute nouvelle intégration tierce (webhook, analytics serveur) passe par des secrets en
process.envuniquement.