[{"data":1,"prerenderedAt":711},["ShallowReactive",2],{"blog-fr-openai-api-key-exposed-in-frontend":3,"blog-index-fr":469},{"id":4,"title":5,"body":6,"category":426,"cover":427,"coverAlt":428,"description":429,"draft":430,"extension":431,"faq":432,"image":448,"keywords":449,"meta":455,"navigation":456,"ogTitle":457,"path":458,"published":459,"seo":460,"stem":461,"tldr":462,"updated":467,"__hash__":468},"blog_fr\u002Fblog\u002Fopenai-api-key-exposed-in-frontend.md","Votre clé API OpenAI est exposée dans votre frontend. Changez-la.",{"type":7,"value":8,"toc":412},"minimark",[9,18,26,35,40,43,54,57,60,64,67,82,96,99,103,106,114,117,123,130,133,139,150,153,157,160,163,166,169,173,176,179,184,187,213,216,219,223,241,244,247,252,347,350,366,370,395],[10,11,12,13,17],"p",{},"Ouvrez votre appli dans un navigateur, affichez le code source de la page et\ncherchez-y ",[14,15,16],"code",{},"sk-proj-",". Si une longue chaîne remonte, votre clé API OpenAI est\nexposée dans votre frontend, et tous les visiteurs que vous avez jamais eus\nauraient pu la copier.",[10,19,20,21,25],{},"Voici la partie que la plupart des conseils sur le sujet ratent : ",[22,23,24],"strong",{},"une clé\nOpenAI n'est pas une clé Google avec un autre préfixe, et rien de ce que vous\npouvez régler dans un tableau de bord ne la met à l'abri là où elle est."," Une\nclé Google Maps a sa place dans votre page, et un réglage gratuit la protège. Une\nclé OpenAI n'a nulle part de réglage équivalent, et c'est pourquoi la seule\npremière consigne honnête est de la changer.",[10,27,28,29,34],{},"Entre le 12 et le 14 août 2026, nous avons passé neuf vérifications externes sur\n30 998 applis en ligne, construites avec Lovable, Bolt, v0, Replit et Base44. Une\nclé OpenAI est apparue dans 33 d'entre elles. Les 33 sont revenues avec la note D\nou F, parce qu'un seul constat critique plafonne la note quoi que l'appli ait\nréussi par ailleurs. Les chiffres complets sont dans\n",[30,31,33],"a",{"href":32},"\u002Fresearch\u002Fvibe-coded-app-security-2026","notre rapport de scan",".",[36,37,39],"h2",{"id":38},"une-clé-api-openai-exposée-dans-votre-frontend-est-elle-un-problème","Une clé API OpenAI exposée dans votre frontend est-elle un problème ?",[10,41,42],{},"Oui. C'est le cas où l'alerte a raison.",[10,44,45,46,49,50,53],{},"Une clé OpenAI est un ",[22,47,48],{},"jeton au porteur",", et le mot porte toute l'explication :\nqui la porte peut s'en servir. Elle voyage dans un en-tête qui dit\n",[14,51,52],{},"Authorization: Bearer sk-proj-…",", et les serveurs d'OpenAI ne demandent rien de\nplus. Ni quel site l'a envoyée. Ni de quel pays elle vient, ni si l'expéditeur\nest vous.",[10,55,56],{},"Pensez à un billet de train plutôt qu'à un passeport. Un contrôleur ne vérifie\npas à quel nom est un billet, parce que le détenir est toute la qualification.\nVoilà ce qui rend un billet digne d'être volé et un passeport le plus souvent\npas.",[10,58,59],{},"Une clé imprimée dans votre appli est donc un billet que vous avez tendu à chaque\nvisiteur. La plupart ne regarderont jamais. Ceux qui regardent ne sont\ngénéralement pas des gens : des scrapers automatiques parcourent les pages\npubliques en ramassant des chaînes en forme de clé, et ils n'ont pas besoin de\nsavoir qui vous êtes pour trouver la vôtre.",[36,61,63],{"id":62},"pourquoi-la-variable-denvironnement-ne-la-pas-cachée","Pourquoi la variable d'environnement ne l'a pas cachée",[10,65,66],{},"Parce qu'un build de frontend compile les variables d'environnement dans le\nfichier qu'il livre.",[10,68,69,70,73,74,77,78,81],{},"C'est l'étape qui donne aux gens la certitude que la clé est à l'abri. Vous\nl'avez sortie de votre code pour la mettre dans un fichier ",[14,71,72],{},".env",", vous l'avez\nnommée ",[14,75,76],{},"VITE_OPENAI_API_KEY"," ou ",[14,79,80],{},"NEXT_PUBLIC_OPENAI_API_KEY",", et maintenant le\ncode nomme une variable là où la clé se trouvait. Rien n'a changé dans l'appli\nlivrée. L'outil de build a remplacé cette variable par sa valeur en sortie, et la\nvaleur est posée dans le JavaScript que votre visiteur télécharge.",[10,83,84,85,88,89,91,92,95],{},"La documentation de Vite le dit sans détour : les variables portant le préfixe\n",[14,86,87],{},"VITE_"," sont exposées dans le code source côté client après le bundling, et les\ninformations sensibles comme les clés d'API n'ont pas leur place dans l'une\nd'elles, parce que les valeurs sont empaquetées dans votre source. Les préfixes\n",[14,90,87],{}," et ",[14,93,94],{},"NEXT_PUBLIC_"," ne sont pas un coffre. Ils sont une déclaration que\nvous avez compris que cette variable est publique.",[10,97,98],{},"Une variable d'environnement a bien fait une chose réelle pour vous : elle a\ngardé la clé hors de votre dépôt, où l'aurait croisée quiconque lit votre code.\nVos visiteurs ne lisent jamais votre code. Ils lisent le fichier que votre build\nen a tiré.",[36,100,102],{"id":101},"pourquoi-vous-ne-pouvez-pas-la-restreindre-comme-une-clé-google","Pourquoi vous ne pouvez pas la restreindre comme une clé Google",[10,104,105],{},"Parce qu'OpenAI ne propose pas de restriction de ce type.",[10,107,108,109,113],{},"Si vous avez lu quelque chose sur une clé API Google dans un frontend, vous avez\ncroisé un correctif de cinq minutes : ouvrez la clé dans la console Google Cloud,\nposez une restriction de référent HTTP, et la clé imprimée dans votre page\nfonctionne sur votre site et renvoie une erreur partout ailleurs.\n",[30,110,112],{"href":111},"\u002Fblog\u002Fgoogle-api-key-exposed-in-frontend","Ce conseil est juste pour une clé Google",",\net il ne se transpose pas.",[10,115,116],{},"Il n'y a aucun champ sur une clé OpenAI pour « uniquement depuis yourapp.com ».\nPas de liste de domaines autorisés, pas de vérification de référent, pas de\nrestriction par IP qui survive à un navigateur. Ce qu'OpenAI vous donne à la\nplace se situe sur le compte derrière la clé : à quel projet elle appartient, ce\nque ce projet a le droit de dépenser dans le mois, et si la clé existe encore.\nCela limite ce qu'une clé volée peut coûter. La clé elle-même continue de\nfonctionner depuis partout jusqu'à ce que vous la supprimiez.",[118,119],"diagram",{"alt":120,"caption":121,"src":122},"Deux couloirs. Dans le couloir du haut, une clé Google part de deux sites différents et rencontre une barrière pleine : la requête venant de yourapp.com la franchit et atteint Google, celle venant de other.example est arrêtée et marquée d'une croix. Dans le couloir du bas, une clé OpenAI part des deux mêmes sites, aucune barrière n'est dessinée, et les deux requêtes atteignent api.openai.com.","Le couloir du haut est le correctif dont on parle aux gens. Dans celui du bas il n'y a rien à dessiner, parce qu'OpenAI n'a aucun réglage de cette forme.","\u002Fblog\u002Fopenai-api-key-exposed-in-frontend\u002Fno-gate-to-set-1600x820.png",[36,124,126,127],{"id":125},"ce-que-fait-vraiment-dangerouslyallowbrowser","Ce que fait vraiment ",[14,128,129],{},"dangerouslyAllowBrowser",[10,131,132],{},"Elle coupe une protection, et son nom est la documentation.",[10,134,135,136,138],{},"La bibliothèque JavaScript officielle d'OpenAI refuse de s'exécuter dans un\nnavigateur par défaut. Le README dit que la prise en charge du navigateur est\n\"disabled by default to avoid exposing your secret API credentials\", et\nqu'activer ",[14,137,129],{}," \"can be dangerous because it exposes your\nsecret API credentials in the client-side code\".",[10,140,141,142,145,146,149],{},"Si votre appli appelle OpenAI depuis le navigateur, cette option est à ",[14,143,144],{},"true","\nquelque part dans votre code, car la bibliothèque ne démarre pas sans elle.\nQuelqu'un a tapé le mot ",[14,147,148],{},"dangerously"," pour faire disparaître un message d'erreur.\nC'est en général ainsi que ce constat se fabrique, et la bibliothèque vous\nl'avait dit en premier.",[10,151,152],{},"L'option a de vrais usages, et ils sont tous étroits : un outil interne dont vous\nconnaissez chaque utilisateur, une clé de développement provisoire, une clé si\nfinement limitée que la dépenser ne coûte rien. Une appli publique sur l'internet\nouvert n'est aucun de ceux-là.",[36,154,156],{"id":155},"ce-que-ça-coûte-quand-quelquun-trouve-votre-clé","Ce que ça coûte quand quelqu'un trouve votre clé",[10,158,159],{},"Une facture, et une appli qui cesse de fonctionner.",[10,161,162],{},"La facture est la partie que les gens attendent. Les requêtes de quelqu'un\nd'autre sont portées à votre compte, et les appels de modèle ne sont pas bon\nmarché à l'échelle d'un projet secondaire. Le plus souvent, celui qui gère\nl'appli s'en aperçoit sur une facture plus lourde que celle du mois précédent\nsans raison qu'il puisse désigner.",[10,164,165],{},"La panne est la partie qu'il n'attend pas. Votre compte a des limites de débit,\net le trafic d'un inconnu les consomme. Votre propre appli se met à renvoyer des\nerreurs aux heures où quelqu'un d'autre travaille, ce qui se lit comme un bug et\nnon comme un vol, alors on passe une journée à déboguer la mauvaise chose.",[10,167,168],{},"Il y a un troisième coût, et il dépend de la portée donnée à la clé. Une clé API\nauthentifie tous les appels que le projet auquel elle appartient peut faire, donc\nune clé largement autorisée atteint tout ce qui est stocké là : les fichiers\ntéléversés sur le compte, les modèles affinés, les assistants que vous avez\nconstruits. Vérifiez ce que la clé pouvait réellement atteindre avant de décider\nqu'il ne s'agissait que d'argent.",[36,170,172],{"id":171},"comment-appeler-openai-depuis-votre-appli-sans-livrer-la-clé","Comment appeler OpenAI depuis votre appli sans livrer la clé",[10,174,175],{},"Mettez quelque chose qui vous appartient entre votre visiteur et OpenAI.",[10,177,178],{},"La forme est la même partout. Votre appli appelle un petit endpoint qui est le\nvôtre. Cet endpoint détient la clé, appelle OpenAI et renvoie la réponse. Le\nnavigateur ne voit jamais la clé, parce que la clé ne quitte jamais votre\nserveur.",[118,180],{"alt":181,"caption":182,"src":183},"Deux rangées. Dans la rangée du haut, un panneau de navigateur contient une valeur de clé en rouge et une ligne en part droit vers api.openai.com. Dans la rangée du bas, le panneau du navigateur ne contient aucune clé, une ligne va jusqu'à un bloc serveur qui détient la clé en turquoise, et une seconde ligne continue du serveur vers api.openai.com.","La même requête dans les deux rangées. Ce qui change, c'est de quel côté de votre propre serveur se tient la clé.","\u002Fblog\u002Fopenai-api-key-exposed-in-frontend\u002Fwho-holds-the-key-1600x720.png",[10,185,186],{},"Où vit cet endpoint dépend de ce avec quoi vous avez construit :",[188,189,190,197,207],"ul",{},[191,192,193,196],"li",{},[22,194,195],{},"Supabase dans votre stack"," : une Edge Function, avec la clé enregistrée comme secret dans le tableau de bord Supabase.",[191,198,199,202,203,206],{},[22,200,201],{},"Déployé sur Vercel ou Netlify"," : une fonction serverless sous ",[14,204,205],{},"\u002Fapi",", avec la clé dans les variables d'environnement côté serveur du projet.",[191,208,209,212],{},[22,210,211],{},"Lovable, Bolt ou Replit"," : chacun a son propre magasin de secrets. La règle ne change pas, et le piège non plus : un magasin étiqueté secrets envoie quand même la valeur au navigateur si le code qui la lit s'exécute là.",[10,214,215],{},"Deux choses valent la peine tant que vous y êtes. Donnez à votre endpoint une\nlimite de débit, parce qu'un endpoint qui appelle OpenAI pour quiconque demande\nest la même facture par une route plus lente. Et posez une limite de dépense\nmensuelle sur le projet OpenAI, le seul contrôle qui met un plancher sous le pire\nscénario.",[10,217,218],{},"Si votre appli utilise l'API Realtime d'OpenAI pour la voix, le navigateur a\nréellement besoin d'un identifiant, et OpenAI documente comment lui en donner un :\nvotre serveur frappe un secret client à courte durée de vie et remet celui-là à\nla page. Le billet existe toujours, il expire en quelques minutes, et c'est votre\npropre serveur qui l'a émis.",[36,220,222],{"id":221},"comment-trouver-gratuitement-chaque-clé-que-votre-appli-livre","Comment trouver gratuitement chaque clé que votre appli livre",[10,224,225,226,228,229,232,233,236,237,240],{},"Commencez à la main, cela coûte cinq minutes et ne demande rien à installer.\nAffichez le source de votre site en ligne et cherchez-y ",[14,227,16],{}," pour une clé\nOpenAI, ",[14,230,231],{},"sk-ant-"," pour une clé Anthropic, ",[14,234,235],{},"AIza"," pour Google et ",[14,238,239],{},"eyJ"," pour un\njeton Supabase.",[10,242,243],{},"Ce qui échappe à cette méthode, c'est le JavaScript que la page charge ensuite,\net sur une appli vibe-codée c'est presque tout. Notre scanner ouvre votre appli\ndans un vrai navigateur, attend l'arrivée des bundles et lit ceux-ci au lieu du\nHTML. Il décode aussi chaque jeton Supabase et rapporte le rôle écrit à\nl'intérieur, si bien qu'une clé qui a sa place dans votre page revient marquée\ncomme correcte au lieu d'être noyée dans un mur de rouge.",[10,245,246],{},"La vérification des clés est l'une des neuf, et les huit autres sont la raison\npour laquelle une note vous en dit plus qu'une recherche :",[118,248],{"alt":249,"caption":250,"src":251},"La marque Reeve au-dessus d'une rangée de neuf icônes au trait, une par vérification : une clé, un cylindre de base de données, un document, un cadenas, une boîte à couvercle, une paire de chevrons de code, un globe, une rosette de certificat et un calendrier.","Les neuf vérifications en lecture seule que fait un scan, dans l'ordre de la liste ci-dessous. Chacune est lue depuis l'extérieur, comme un inconnu voit votre appli.","\u002Fblog\u002Fopenai-api-key-exposed-in-frontend\u002Fnine-checks-1600x420.png",[253,254,255,268],"table",{},[256,257,258],"thead",{},[259,260,261,265],"tr",{},[262,263,264],"th",{},"Ce que le scan regarde",[262,266,267],{},"La question à laquelle il répond",[269,270,271,280,288,299,307,315,323,331,339],"tbody",{},[259,272,273,277],{},[274,275,276],"td",{},"Clés secrètes dans votre code",[274,278,279],{},"Une clé d'API payante ou d'admin est-elle lisible par n'importe qui ?",[259,281,282,285],{},[274,283,284],{},"Règles de la base de données",[274,286,287],{},"Un inconnu peut-il lire les lignes de vos utilisateurs sans compte ?",[259,289,290,293],{},[274,291,292],{},"Fichiers privés",[274,294,295,296,298],{},"Des fichiers ",[14,297,72],{}," ou des dumps de base sont-ils téléchargeables ?",[259,300,301,304],{},[274,302,303],{},"En-têtes de sécurité",[274,305,306],{},"Les protections côté navigateur sont-elles activées ?",[259,308,309,312],{},[274,310,311],{},"Buckets de stockage",[274,313,314],{},"N'importe qui peut-il lister les fichiers déposés par vos utilisateurs ?",[259,316,317,320],{},[274,318,319],{},"Source maps",[274,321,322],{},"Votre code source d'origine est-il publié à côté de l'appli ?",[259,324,325,328],{},[274,326,327],{},"APIs ouvertes et CORS",[274,329,330],{},"Vos endpoints répondent-ils à n'importe quel site qui demande ?",[259,332,333,336],{},[274,334,335],{},"Expiration du certificat",[274,337,338],{},"Le HTTPS est-il valide et pas sur le point d'expirer ?",[259,340,341,344],{},[274,342,343],{},"Renouvellement du domaine",[274,345,346],{},"Le nom est-il renouvelé avant que quelqu'un puisse le prendre ?",[10,348,349],{},"Vous obtenez une note, un score et les décomptes à l'écran en une vingtaine de\nsecondes, sans compte. Donnez une adresse e-mail et la liste détaillée vient\navec, accompagnée d'un correctif écrit pour votre builder que vous pouvez coller\ntel quel.",[10,351,352,353,356,357,361,362,34],{},"Trois choses qu'il ne fera pas, et ce sont les raisons pour lesquelles on peut le\npointer sans risque sur une appli en ligne : il ne se connecte jamais, il n'écrit\njamais rien, et il ne garde jamais une clé qu'il trouve. Un secret exposé est\nconservé sous forme d'indice masqué du genre ",[14,354,355],{},"sk-proj-…a1b2",", et la vraie valeur\nest jetée. ",[30,358,360],{"href":359},"\u002F#scan","Scannez votre appli",", ou lisez d'abord\n",[30,363,365],{"href":364},"\u002Fsecurity-scanner","ce que regarde chacune des neuf vérifications",[36,367,369],{"id":368},"quoi-faire-tout-de-suite","Quoi faire tout de suite",[371,372,373],"key-takeaways",{},[188,374,375,378,381,384,387],{},[191,376,377],{},"Changez la clé en premier, dans le tableau de bord OpenAI sous API keys. La retirer de votre code ne ferme rien, car l'ancienne valeur reste dans votre historique de versions et dans chaque copie en cache de votre page.",[191,379,380],{},"Posez une limite de dépense mensuelle sur le projet auquel appartient la clé. C'est le seul contrôle qui plafonne ce que cette erreur, ou une prochaine, peut vous coûter.",[191,382,383],{},"Déplacez l'appel derrière un endpoint qui vous appartient, et donnez à cet endpoint sa propre limite de débit. Un navigateur ne devrait jamais détenir une clé qui dépense de l'argent.",[191,385,386],{},"Lisez votre page d'utilisation pour les jours où la clé était active. Changer la clé arrête ce qui se passera ensuite et ne dit rien de ce qui s'est déjà passé.",[191,388,389,390,77,392,394],{},"Gardez le préfixe ",[14,391,87],{},[14,393,94],{}," loin de tout ce que vous n'aimeriez pas voir lu par un inconnu. Ces préfixes veulent dire public, et votre outil de build les prend au mot.",[10,396,397,398,402,403,407,408,34],{},"Si vous préférez traiter tout cela en une seule fois, la\n",[30,399,401],{"href":400},"\u002Fchecklist","checklist de sécurité en 10 minutes"," le couvre avec les autres\nchoses à fermer dans une appli fraîchement lancée. Et pour la question plus large\nde savoir quelles clés ont leur place dans un navigateur, nous avons\n",[30,404,406],{"href":405},"\u002Fblog\u002Fwhich-api-keys-are-safe-in-your-frontend","un guide pour distinguer les clés publiables des clés secrètes","\net\n",[30,409,411],{"href":410},"\u002Fblog\u002Fwhat-secrets-leak-from-vibe-coded-apps","un recensement de ce que 30 998 applis ont réellement livré",{"title":413,"searchDepth":414,"depth":414,"links":415},"",3,[416,418,419,420,422,423,424,425],{"id":38,"depth":417,"text":39},2,{"id":62,"depth":417,"text":63},{"id":101,"depth":417,"text":102},{"id":125,"depth":417,"text":421},"Ce que fait vraiment dangerouslyAllowBrowser",{"id":155,"depth":417,"text":156},{"id":171,"depth":417,"text":172},{"id":221,"depth":417,"text":222},{"id":368,"depth":417,"text":369},"Bases de la sécurité","\u002Fblog\u002Fopenai-api-key-exposed-in-frontend\u002Fcover-1200x630.png","Une valeur en forme de clé dans une page de code d'application, dessinée assez longue pour déborder du bord droit du panneau qui la contient.","Une clé API OpenAI exposée dans votre frontend ne peut être liée à aucun domaine. Changez-la aujourd'hui, passez par votre serveur et plafonnez la dépense.",false,"md",[433,436,439,442,445],{"q":434,"a":435},"Quelqu'un a trouvé ma clé OpenAI dans mon appli. Que faire en premier ?","La changer. Ouvrez votre tableau de bord OpenAI dans API keys, créez une nouvelle clé, mettez la nouvelle sur votre serveur et supprimez l'ancienne. La retirer de votre code n'est pas la même chose, car l'ancienne valeur reste dans votre historique de versions et dans toute copie en cache de votre page. Ensuite, posez une limite de dépense sur le projet et lisez votre page d'utilisation pour les jours où la clé était active.",{"q":437,"a":438},"Puis-je restreindre une clé OpenAI à mon propre domaine, comme une clé Google ?","Non. Une clé API Google accepte une restriction de référent HTTP qui la fait fonctionner sur votre site et échouer partout ailleurs, et c'est pour cela qu'une clé Google dans votre page est le plus souvent sans danger. OpenAI n'offre rien d'équivalent. Il n'y a ni liste de domaines autorisés ni vérification de référent sur une clé API, donc les seuls contrôles dont vous disposez portent sur le compte derrière elle : à quel projet la clé appartient, ce que ce projet a le droit de dépenser, et si la clé existe encore.",{"q":440,"a":441},"La bibliothèque OpenAI a une option dangerouslyAllowBrowser. Est-ce que ça rend la clé sûre ?","Non, et le nom est l'avertissement. OpenAI livre la prise en charge du navigateur désactivée, et son propre README dit que l'option est dangereuse parce qu'elle expose vos identifiants d'API secrets dans le code côté client. L'activer ne change rien à ce que le navigateur peut lire ; cela empêche seulement la bibliothèque de refuser de démarrer. Les cas étroits pour lesquels elle est prévue sont les outils internes dont vous connaissez chaque utilisateur et les clés de développement à courte durée de vie, pas une appli publique.",{"q":443,"a":444},"Combien quelqu'un peut-il dépenser avec une clé qu'il a trouvée ?","Autant que votre compte l'autorise, et c'est pour cela que la limite de dépense compte plus que le montant de la facture que vous avez vue jusqu'ici. Une clé volée puise dans les mêmes limites de débit que votre appli, donc le premier symptôme n'est souvent pas la facture : c'est votre propre appli qui se met à échouer pendant que quelqu'un d'autre travaille. Posez une limite de dépense mensuelle sur le projet et vous avez un plafond sur tout cela.",{"q":446,"a":447},"Je n'ai utilisé la clé que pour une démo rapide. Est-ce que ça compte quand même ?","Oui. Une clé reste active jusqu'à ce que quelqu'un la révoque, et elle ignore qu'elle devait être provisoire. Des scrapers automatiques ramassent en continu les chaînes en forme de clé sur les pages publiques, donc l'âge de la démo joue contre vous plutôt que pour vous. Supprimer la clé prend moins de temps que décider si elle méritait d'être supprimée.","\u002Fblog\u002Fopenai-api-key-exposed-in-frontend\u002Fcard-800x500.png",[450,451,452,453,129,454],"clé api openai exposée frontend","cacher une clé api openai dans react","appeler openai depuis le frontend en sécurité","sécurité de la clé api openai","clé api openai fuitée",{},true,"Clé API OpenAI exposée dans votre frontend ?","\u002Fblog\u002Fopenai-api-key-exposed-in-frontend","2026-09-03",{"title":5,"description":429},"blog\u002Fopenai-api-key-exposed-in-frontend",[463,464,465,466],"Une clé API OpenAI exposée dans votre frontend est le cas où l'alerte a raison. Aucun réglage ne rend une clé de ce genre sans danger dans un navigateur.","C'est un jeton au porteur, il suffit donc de la détenir. Il n'existe aucune restriction de domaine qui l'attache à votre propre site, comme il en existe une pour une clé Google.","Changez-la aujourd'hui dans le tableau de bord OpenAI, déplacez l'appel derrière un endpoint qui vous appartient, et posez une limite de dépense sur le projet.","Nous en avons trouvé une dans 33 applis sur 30 998 scannées. Rare, et les 33 sont ressorties avec la note D ou F.","2026-09-21","0QnGWP4nJg-MjMJ5cX4v_4kb7wcq6F_Ok_wrai53nDs",[470,477,483,488,494,500,506,512,518,524,530,536,542,548,554,560,566,572,578,584,590,591,596,602,608,614,620,626,632,638,644,650,656,661,667,673,678,684,690,696,701,707],{"path":471,"title":472,"description":473,"published":474,"category":475,"image":476,"draft":430},"\u002Fblog\u002Fsupabase-backup-auth-users","Pourquoi votre dump Supabase ne contient aucun utilisateur","Lancez supabase db dump tout seul et vous obtenez la forme de votre base et aucune de ses lignes, sans le schéma auth où vivent vos utilisateurs.","2026-09-23","Backups","\u002Fblog\u002Fsupabase-backup-auth-users\u002Fcard-800x500.png",{"path":478,"title":479,"description":480,"published":481,"category":426,"image":482,"draft":430},"\u002Fblog\u002Fdomain-and-certificate-expiry","Domaine expiré, site hors ligne : ce qui se passe ensuite","Votre domaine a expiré et votre site est hors ligne. Le compte à rebours qui démarre, pourquoi le certificat est le moindre souci, et comment vérifier les deux.","2026-09-22","\u002Fblog\u002Fdomain-and-certificate-expiry\u002Fcard-800x500.png",{"path":484,"title":485,"description":486,"published":467,"category":426,"image":487,"draft":430},"\u002Fblog\u002Fis-lovable-safe","Lovable est-il sûr ? Ce que 18 554 applications Lovable ont montré","Lovable est-il sûr ? 18 554 applications, neuf vérifications. La plateforme était la plus propre des cinq. Les trouvailles étaient dans les applications.","\u002Fblog\u002Fis-lovable-safe\u002Fcard-800x500.png",{"path":489,"title":490,"description":491,"published":492,"category":426,"image":493,"draft":430},"\u002Fblog\u002Fvibe-coded-app-security-checklist","La checklist de sécurité du vibe coding, en neuf vérifications","Une checklist de sécurité du vibe coding en neuf points, chacun vérifiable de l’extérieur sur votre appli en ligne, et chacun avec un test d’une ligne.","2026-09-20","\u002Fblog\u002Fvibe-coded-app-security-checklist\u002Fcard-800x500.png",{"path":495,"title":496,"description":497,"published":498,"category":426,"image":499,"draft":430},"\u002Fblog\u002Fstripe-secret-key-in-frontend","Une clé secrète Stripe dans votre frontend peut déplacer de l’argent","Une clé secrète Stripe exposée dans votre frontend peut rembourser, débiter et lire chaque fiche client que vous détenez. Votre clé pk_live_ y a sa place.","2026-09-19","\u002Fblog\u002Fstripe-secret-key-in-frontend\u002Fcard-800x500.png",{"path":501,"title":502,"description":503,"published":504,"category":426,"image":505,"draft":430},"\u002Fblog\u002Fvite-and-next-public-env-vars","Variables d’environnement Vite exposées : le préfixe dit publier","Variables d’environnement Vite exposées : votre appli a fait ce que le préfixe demandait. VITE_ et NEXT_PUBLIC_ veulent dire publier, et l’IA ignorait le prix.","2026-09-18","\u002Fblog\u002Fvite-and-next-public-env-vars\u002Fcard-800x500.png",{"path":507,"title":508,"description":509,"published":510,"category":426,"image":511,"draft":430},"\u002Fblog\u002Fbase44-source-maps","Sécurité Base44 : ce qu’un scan signale, et ce qui dépend de vous","Sécurité Base44 sur 5 438 applis : trois signalements sur presque chacune sont ceux de la plateforme, la source map est le badge Base44, votre part est courte.","2026-09-17","\u002Fblog\u002Fbase44-source-maps\u002Fcard-800x500.png",{"path":513,"title":514,"description":515,"published":516,"category":426,"image":517,"draft":430},"\u002Fblog\u002Fis-cursor-ai-safe","Cursor AI est-il sûr ? L’éditeur, le code et l’appli publiée","Cursor AI est-il sûr ? Trois questions dans une recherche : ce que Cursor garde, ce que son code rate, et si l’appli que vous avez publiée est ouverte.","2026-09-16","\u002Fblog\u002Fis-cursor-ai-safe\u002Fcard-800x500.png",{"path":519,"title":520,"description":521,"published":522,"category":426,"image":523,"draft":430},"\u002Fblog\u002Fis-replit-safe","Replit est-il sûr ? Ce que 3 042 applications Replit nous ont montré","Replit est-il sûr ? 3 042 applications Replit en ligne, neuf vérifications externes. Les trouvailles étaient dans l’application publiée, pas chez l’hébergeur.","2026-09-15","\u002Fblog\u002Fis-replit-safe\u002Fcard-800x500.png",{"path":525,"title":526,"description":527,"published":528,"category":475,"image":529,"draft":430},"\u002Fblog\u002Fsupabase-storage-backup","Supabase storage backup : votre copie de base n'a aucun fichier","Un Supabase storage backup est une tâche à part. Les sauvegardes de la base gardent la liste de vos fichiers et aucun des fichiers, donc chaque upload casse.","2026-09-14","\u002Fblog\u002Fsupabase-storage-backup\u002Fcard-800x500.png",{"path":531,"title":532,"description":533,"published":534,"category":475,"image":535,"draft":430},"\u002Fblog\u002Fsupabase-point-in-time-recovery","Point-in-time recovery Supabase : prix et limites","Le point-in-time recovery de Supabase rembobine votre base à la seconde près sur la dernière semaine. $100 par mois en plus de Pro, et rien que la base.","2026-09-13","\u002Fblog\u002Fsupabase-point-in-time-recovery\u002Fcard-800x500.png",{"path":537,"title":538,"description":539,"published":540,"category":475,"image":541,"draft":430},"\u002Fblog\u002Fsupabase-project-paused-recover","Projet Supabase en pause ? Vos données sont toujours là","Supabase a mis votre projet en pause après une semaine sans activité. Rien n'est supprimé, Restaurer est à côté du nom, et vous avez un an pour cliquer.","2026-09-12","\u002Fblog\u002Fsupabase-project-paused-recover\u002Fcard-800x500.png",{"path":543,"title":544,"description":545,"published":546,"category":426,"image":547,"draft":430},"\u002Fblog\u002Fsafest-ai-app-builder","Quel builder d'app IA est le plus sûr ? 30 998 apps testées","Quel builder d'app IA est le plus sûr ? Nous avons scanné 30 998 apps actives de Lovable, Base44, Replit, v0 et Bolt. Ce n'est pas le builder qui décide.","2026-09-11","\u002Fblog\u002Fsafest-ai-app-builder\u002Fcard-800x500.png",{"path":549,"title":550,"description":551,"published":552,"category":426,"image":553,"draft":430},"\u002Fblog\u002Fenable-rls-on-every-supabase-table","Activer Row Level Security sur chaque table Supabase, et le prouver","Activer Row Level Security dans Supabase sans politique ferme la table entièrement. Une politique sans le réglage ne fait rien. Voici le SQL, et le test.","2026-09-10","\u002Fblog\u002Fenable-rls-on-every-supabase-table\u002Fcard-800x500.png",{"path":555,"title":556,"description":557,"published":558,"category":426,"image":559,"draft":430},"\u002Fblog\u002Fsupabase-rls-disabled-in-public","Supabase \"RLS disabled in public\" : ce que l'alerte rate","Supabase signale \"RLS disabled in public\" comme une erreur. Elle ne dit rien de la politique de lecture qui laisse votre table tout aussi ouverte.","2026-09-09","\u002Fblog\u002Fsupabase-rls-disabled-in-public\u002Fcard-800x500.png",{"path":561,"title":562,"description":563,"published":564,"category":426,"image":565,"draft":430},"\u002Fblog\u002Frotate-supabase-service-role-key","Faire tourner une clé service_role Supabase qui a fuité","Supabase dit de colmater la fuite d'abord. D'autres guides disent de faire tourner la clé tout de suite. Tout dépend d'où votre clé service_role a fuité.","2026-09-08","\u002Fblog\u002Frotate-supabase-service-role-key\u002Fcard-800x500.png",{"path":567,"title":568,"description":569,"published":570,"category":426,"image":571,"draft":430},"\u002Fblog\u002Fvibe-coding-security-scanners-compared","Scanners de sécurité vibe coding comparés, le nôtre compris","Le meilleur scanner de sécurité vibe coding tient à trois questions qu'aucune liste de fonctions ne traite. Dix outils comparés, avec les prix.","2026-09-07","\u002Fblog\u002Fvibe-coding-security-scanners-compared\u002Fcard-800x500.png",{"path":573,"title":574,"description":575,"published":576,"category":426,"image":577,"draft":430},"\u002Fblog\u002Fsupabase-security-checker","Supabase security checker : les cinq vérifications à faire soi-même","Un Supabase security checker lit votre app publiée plutôt que les réglages de votre projet. Voici les cinq vérifications, et comment faire chacune vous-même.","2026-09-06","\u002Fblog\u002Fsupabase-security-checker\u002Fcard-800x500.png",{"path":579,"title":580,"description":581,"published":582,"category":426,"image":583,"draft":430},"\u002Fblog\u002Fvibe-coding-security-scanner","Scanner de sécurité vibe coding : ce qu’un scan d’URL rate","Un scanner de sécurité vibe coding lit votre app en ligne depuis l’extérieur. Ce qu’il couvre, les quatre choses qu’il ne voit pas, et comment lire le résultat.","2026-09-05","\u002Fblog\u002Fvibe-coding-security-scanner\u002Fcard-800x500.png",{"path":585,"title":586,"description":587,"published":588,"category":426,"image":589,"draft":430},"\u002Fblog\u002Fmissing-security-headers","En-têtes de sécurité manquants : quand cela compte","Les en-têtes de sécurité manquants sont notre constat le plus fréquent. Contre quoi ils protègent, et quand ils comptent le moins dans votre rapport.","2026-09-04","\u002Fblog\u002Fmissing-security-headers\u002Fcard-800x500.png",{"path":458,"title":5,"description":429,"published":459,"category":426,"image":448,"draft":430},{"path":410,"title":592,"description":593,"published":594,"category":426,"image":595,"draft":430},"Clé API exposée dans le frontend : ce que 30 998 applis livrent","Une clé API exposée dans votre frontend est le plus souvent une clé Google Maps. Nous avons scanné 30 998 applis vibe-codées et compté ce qui fuit vraiment.","2026-09-02","\u002Fblog\u002Fwhat-secrets-leak-from-vibe-coded-apps\u002Fcard-800x500.png",{"path":597,"title":598,"description":599,"published":600,"category":475,"image":601,"draft":430},"\u002Fblog\u002Fsupabase-backup-tools-compared","Outils de sauvegarde Supabase comparés, le nôtre compris","Quatre familles d'outil de sauvegarde Supabase, ce que chacun copie vraiment, et quand une GitHub Action gratuite bat le fait de payer, nous compris.","2026-09-01","\u002Fblog\u002Fsupabase-backup-tools-compared\u002Fcard-800x500.png",{"path":603,"title":604,"description":605,"published":606,"category":426,"image":607,"draft":430},"\u002Fblog\u002Freplit-secrets-explained","Utiliser les secrets sur Replit, et ce qui est publié quand même","Utiliser les secrets sur Replit : en ajouter un, le relire, corriger les deux causes du undefined. Et les clés que l'outil Secrets ne peut pas protéger.","2026-08-31","\u002Fblog\u002Freplit-secrets-explained\u002Fcard-800x500.png",{"path":609,"title":610,"description":611,"published":612,"category":475,"image":613,"draft":430},"\u002Fblog\u002Fback-up-supabase-free-tier","Sauvegardes du plan gratuit Supabase : en faire une sans terminal","Le plan gratuit de Supabase ne fait aucune sauvegarde : la copie vient de vous. Comment la faire depuis le tableau de bord, et ce que le CSV oublie.","2026-08-30","\u002Fblog\u002Fback-up-supabase-free-tier\u002Fcard-800x500.png",{"path":615,"title":616,"description":617,"published":618,"category":426,"image":619,"draft":430},"\u002Fblog\u002Fis-supabase-secure","Supabase est-il sûr ? Oui. Votre projet est une autre question","Supabase est-il sûr ? La plateforme est auditée, chiffrée et testée en intrusion. Sa documentation dit où cela s'arrête et où vos réglages commencent.","2026-08-29","\u002Fblog\u002Fis-supabase-secure\u002Fcard-800x500.png",{"path":621,"title":622,"description":623,"published":624,"category":426,"image":625,"draft":430},"\u002Fblog\u002Fwhere-to-find-supabase-api-keys","Où trouver vos clés API Supabase : anon, service_role et URL","L'URL du projet, la clé anon et la clé service_role tiennent sur une page du tableau de bord. Voici où elle est, et laquelle des quatre va dans votre app.","2026-08-28","\u002Fblog\u002Fwhere-to-find-supabase-api-keys\u002Fcard-800x500.png",{"path":627,"title":628,"description":629,"published":630,"category":426,"image":631,"draft":430},"\u002Fblog\u002Fnew-row-violates-row-level-security-policy","New row violates row-level security policy sur Supabase : et après ?","\"New row violates row-level security policy\" signifie que Supabase a refusé une écriture. Le correctif rapide rouvre la table à tout le monde.","2026-08-27","\u002Fblog\u002Fnew-row-violates-row-level-security-policy\u002Fcard-800x500.png",{"path":633,"title":634,"description":635,"published":636,"category":426,"image":637,"draft":430},"\u002Fblog\u002Fcors-wildcard-security-risk","Un joker CORS est-il un risque de sécurité ? Rarement.","Un joker CORS est-il un risque de sécurité ? C'est souvent le réglage par défaut de votre builder, et il ne livre rien que votre serveur ne donnait déjà.","2026-08-26","\u002Fblog\u002Fcors-wildcard-security-risk\u002Fcard-800x500.png",{"path":639,"title":640,"description":641,"published":642,"category":475,"image":643,"draft":430},"\u002Fblog\u002Fsupabase-branching-is-not-a-backup","Le branching Supabase n'est pas une sauvegarde de vos données.","Pourquoi le branching Supabase n'est pas une sauvegarde : une branche démarre sans vos données, et un merge ne déplace que le schéma. À quoi il sert vraiment.","2026-08-25","\u002Fblog\u002Fsupabase-branching-is-not-a-backup\u002Fcard-800x500.png",{"path":645,"title":646,"description":647,"published":648,"category":475,"image":649,"draft":430},"\u002Fblog\u002Fhow-to-restore-a-supabase-backup","Restaurer une sauvegarde Supabase, et ce qui casse après","Restaurer une sauvegarde Supabase depuis le tableau de bord ou un fichier de dump, ce que la restauration remplace et pourquoi votre app peut rester cassée.","2026-08-24","\u002Fblog\u002Fhow-to-restore-a-supabase-backup\u002Fcard-800x500.png",{"path":651,"title":652,"description":653,"published":654,"category":426,"image":655,"draft":430},"\u002Fblog\u002Fsupabase-storage-bucket-public","Votre bucket Supabase Storage est public. Est-ce un problème ?","Un bucket Supabase Storage public signifie que celui qui a l'URL d'un fichier peut l'ouvrir. Il ne signifie pas que quelqu'un peut lister ce qu'il contient.","2026-08-23","\u002Fblog\u002Fsupabase-storage-bucket-public\u002Fcard-800x500.png",{"path":111,"title":657,"description":658,"published":659,"category":426,"image":660,"draft":430},"Une clé API Google dans votre frontend, est-ce un problème ?","Une clé API Google exposée dans votre frontend est la clé que notre scanner trouve le plus souvent, et en général tout va bien. Un réglage gratuit tranche.","2026-08-22","\u002Fblog\u002Fgoogle-api-key-exposed-in-frontend\u002Fcard-800x500.png",{"path":662,"title":663,"description":664,"published":665,"category":475,"image":666,"draft":430},"\u002Fblog\u002Fai-agent-deleted-my-database","Un agent IA a supprimé mes données Supabase. Que puis-je récupérer ?","Un agent IA a supprimé des données de votre base. Ce que vous pouvez récupérer était déjà décidé avant, et les prochaines minutes décident du reste.","2026-08-21","\u002Fblog\u002Fai-agent-deleted-my-database\u002Fcard-800x500.png",{"path":668,"title":669,"description":670,"published":671,"category":426,"image":672,"draft":430},"\u002Fblog\u002Fcan-anyone-read-your-supabase-database","Qui peut lire votre base Supabase ? Nous avons testé 3 680 apps","N'importe qui peut-il lire votre base de données Supabase sans se connecter ? Nous avons scanné 30 998 apps en ligne créées avec des builders IA.","2026-08-18","\u002Fblog\u002Fcan-anyone-read-your-supabase-database\u002Fcard-800x500.png",{"path":674,"title":675,"description":676,"published":671,"category":426,"image":677,"draft":430},"\u002Fblog\u002Fsource-maps-exposed-in-production","Source maps exposées : votre app publie son code original","Une source map exposée laisse n'importe qui lire le code original de votre app, commentaires compris. Le test de 30 secondes, et ce qui compte vraiment.","\u002Fblog\u002Fsource-maps-exposed-in-production\u002Fcard-800x500.png",{"path":679,"title":680,"description":681,"published":682,"category":426,"image":683,"draft":430},"\u002Fblog\u002Fsupabase-new-api-keys","Les nouvelles clés API Supabase : laquelle va dans votre app ?","Supabase a remplacé anon et service_role par des clés publiables et secrètes. Laquelle a sa place dans votre app, et laquelle jamais ?","2026-08-12","\u002Fblog\u002Fsupabase-new-api-keys\u002Fcard-800x500.png",{"path":685,"title":686,"description":687,"published":688,"category":475,"image":689,"draft":430},"\u002Fblog\u002Fdoes-supabase-back-up-my-database","Supabase sauvegarde-t-il ma base de données ? Cela dépend du plan.","Supabase sauvegarde-t-il votre base de données ? Chaque jour sur les plans payants, jamais sur le gratuit. Comment savoir ce que vous avez vraiment.","2026-08-11","\u002Fblog\u002Fdoes-supabase-back-up-my-database\u002Fcard-800x500.png",{"path":691,"title":692,"description":693,"published":694,"category":426,"image":695,"draft":430},"\u002Fblog\u002Fsupabase-rls-on-but-table-still-public","Supabase Row Level Security est activé. La table reste publique.","Activer Supabase Row Level Security ne protège pas une table. Ce sont vos politiques, et celle qui a réparé votre app laisse peut-être entrer tout le monde.","2026-08-10","\u002Fblog\u002Fsupabase-rls-on-but-table-still-public\u002Fcard-800x500.png",{"path":697,"title":698,"description":699,"published":694,"category":475,"image":700,"draft":430},"\u002Fblog\u002Fversion-history-is-not-a-backup","L'historique des versions n'est pas une sauvegarde de vos données.","Lovable et Bolt tiennent un historique des versions de votre code. Votre base de données est un service à part, et revenir en arrière ne la ramène pas.","\u002Fblog\u002Fversion-history-is-not-a-backup\u002Fcard-800x500.png",{"path":702,"title":703,"description":704,"published":705,"category":475,"image":706,"draft":430},"\u002Fblog\u002Fthree-ways-to-back-up-a-supabase-database","Trois façons de sauvegarder une base Supabase, et ce qui manque","Le tableau de bord, pg_dump et un service géré. Ce que chacun enregistre, ce qu'il laisse de côté sans le dire, et lequel survit à la perte du compte.","2026-08-09","\u002Fblog\u002Fthree-ways-to-back-up-a-supabase-database\u002Fcard-800x500.png",{"path":405,"title":708,"description":709,"published":705,"category":426,"image":710,"draft":430},"Quelles clés API sont sûres côté navigateur, et lesquelles non","Votre clé anon Supabase est faite pour être publique. Votre clé service_role non, et elle ignore toutes les règles que vous posez. Comment les distinguer.","\u002Fblog\u002Fwhich-api-keys-are-safe-in-your-frontend\u002Fcard-800x500.png",1790150953914]