Le proxy est réservé aux clés d’API HTTP (OpenAI, Stripe, Resend, Anthropic…) :
celles qui partent dans un en-tête
Authorization ou x-api-key vers une API HTTPS.
C’est ce que le proxy peut intercepter et substituer. Pour les secrets non-HTTP
(base de données, config, DATABASE_URL), utilise secret() : le proxy
ne peut pas s’insérer dans une connexion TCP.Principe
En mode proxy, ton app utilise un placeholder{{NOM_SECRET}} pour une clé d’API HTTP.
Le proxy local intercepte chaque requête sortante, remplace le placeholder par la vraie valeur,
et forward vers l’upstream.
Traitement d’une requête
Authentification
Le proxy vérifie le
x-elding-token (comparaison constant-time). Seul l’enfant lancé par
elding proxy le possède.Anti-SSRF
Le hostname cible est résolu ; toute IP privée, loopback, link-local ou métadata cloud
(
169.254.169.254) est bloquée. DNS-pinning contre le rebinding.Host-lock
Pour chaque placeholder utilisé, le proxy vérifie que le domaine autorisé de la clé
correspond à la cible. Sinon : 403 (anti-exfiltration).
Sécurité du proxy
- Bind
127.0.0.1uniquement, jamais exposé au réseau. - Token de session aléatoire, comparaison constant-time.
- HTTPS only, en-têtes hop-by-hop strippés.
- Logs sans valeurs (noms de placeholders only).
Une dépendance vérolée ou un agent IA dans ton app ne voit que
{{OPENAI_API_KEY}},
jamais la vraie clé.