[{"data":1,"prerenderedAt":661},["ShallowReactive",2],{"blog-fr-what-secrets-leak-from-vibe-coded-apps":3,"blog-index-fr":420},{"id":4,"title":5,"body":6,"category":379,"cover":380,"coverAlt":381,"description":382,"draft":383,"extension":384,"faq":385,"image":401,"keywords":402,"meta":408,"navigation":409,"ogTitle":410,"path":411,"published":412,"seo":413,"stem":414,"tldr":415,"updated":412,"__hash__":419},"blog_fr\u002Fblog\u002Fwhat-secrets-leak-from-vibe-coded-apps.md","Clé API exposée dans le frontend : ce que 30 998 applis livrent",{"type":7,"value":8,"toc":367},"minimark",[9,13,16,21,24,33,45,49,52,59,69,75,86,90,93,179,182,188,199,207,211,217,236,241,247,251,254,268,276,280,298,307,310,325,329,355],[10,11,12],"p",{},"Quelqu'un ouvre votre appli, appuie sur F12 et vous annonce qu'une clé API est\nexposée dans votre frontend. Le mot employé est en général « fuite ». On vous dit\nrarement de quelle clé il s'agit, et les conseils que vous trouvez ensuite\ntraitent toutes les clés comme la même urgence.",[10,14,15],{},"Ce n'est pas la même urgence, et nous pouvons désormais chiffrer l'écart. Entre\nle 12 et le 14 août 2026, nous avons passé neuf vérifications externes sur\n30 998 applis en ligne créées avec Lovable, Bolt, v0, Replit et Base44, et lu le\nJavaScript que chacune envoie à un navigateur. Voici ce qu'il y avait dedans.",[17,18,20],"h2",{"id":19},"une-clé-api-exposée-dans-le-frontend-est-elle-vraiment-un-problème","Une clé API exposée dans le frontend est-elle vraiment un problème ?",[10,22,23],{},"En général non, et la forme de ce « en général » est plus déséquilibrée que nous\nne le pensions.",[10,25,26,27,32],{},"Nous avons trouvé une clé digne d'être signalée dans 1 332 des 30 998 applis.\nDans 1 080 d'entre elles, la seule chose trouvée était une clé API Google, c'est\nà dire précisément le justificatif\n",[28,29,31],"a",{"href":30},"\u002Fblog\u002Fgoogle-api-key-exposed-in-frontend","censé se trouver dans votre page",". Ce\nqui protège celle-là, c'est un réglage conservé du côté de Google, et la cacher\nn'a jamais fait partie de l'arrangement.",[10,34,35,36,40,41,44],{},"Les 29 666 autres applis ne livraient rien que notre vérification des secrets\ntraite comme un problème. Ce chiffre demande une précision pour rester honnête :\nles clés publiables en sont exclues. Une clé ",[37,38,39],"code",{},"anon"," Supabase ou une clé ",[37,42,43],{},"pk_","\nStripe a sa place dans le navigateur, nous la marquons donc comme quelque chose\nque vous avez bien fait et elle n'entre jamais dans ces comptes.",[17,46,48],{"id":47},"ce-que-nous-avons-compté-et-ce-que-nous-navons-pas-pu-compter","Ce que nous avons compté, et ce que nous n'avons pas pu compter",[10,50,51],{},"Nous avons chargé chaque appli comme le fait un visiteur, dans un vrai\nnavigateur, et lu le JavaScript téléchargé. Tout ce qui suit est une forme\ntrouvée dans ce code.",[10,53,54,58],{},[55,56,57],"strong",{},"Nous reconnaissons les formats de clé que nous connaissons."," Stripe, OpenAI,\nAnthropic, AWS, Google et Supabase ont des préfixes identifiables, et un JWT\nSupabase indique son propre rôle en texte lisible dans sa section centrale. Un\njustificatif dans un format que nous ne connaissons pas n'est pas dans ces\nchiffres, lisez-les donc comme un plancher.",[10,60,61,64,65,68],{},[55,62,63],{},"Nous n'avons utilisé aucune clé trouvée."," Pas une seule fois, sur aucune\nappli. Nous avons noté le type et un indice masqué de la forme ",[37,66,67],{},"sk_live_…a1b2",",\net la valeur réelle n'a été écrite nulle part.",[10,70,71,74],{},[55,72,73],{},"Aucune appli n'est nommée."," Ni ici, ni dans le jeu de données, ni nulle part\noù nous publions.",[10,76,77,80,81,85],{},[55,78,79],{},"Presque toutes sont des applis publiées sur le domaine d'un builder."," La\nméthode complète, l'échantillon et chaque chiffre derrière cet article sont dans\n",[28,82,84],{"href":83},"\u002Fresearch\u002Fvibe-coded-app-security-2026","notre rapport de scan",", y compris ce que\nnous n'avons pas pu mesurer.",[17,87,89],{"id":88},"ce-que-les-30-998-applis-livraient-réellement","Ce que les 30 998 applis livraient réellement",[10,91,92],{},"Un tableau, trié par fréquence d'apparition. La vérification des secrets a abouti\nsur chacune des 30 998 applis, chaque compte ci-dessous porte donc sur toutes.",[94,95,96,109],"table",{},[97,98,99],"thead",{},[100,101,102,106],"tr",{},[103,104,105],"th",{},"Ce que nous avons trouvé dans le code du navigateur",[103,107,108],{},"Applis",[110,111,112,121,129,137,145,153,164,171],"tbody",{},[100,113,114,118],{},[115,116,117],"td",{},"Clé API Google",[115,119,120],{},"1 142",[100,122,123,126],{},[115,124,125],{},"Une valeur à forte entropie près d'un nom « secret » ou « password »",[115,127,128],{},"204",[100,130,131,134],{},[115,132,133],{},"Clé OpenAI",[115,135,136],{},"33",[100,138,139,142],{},[115,140,141],{},"Clé d'accès AWS",[115,143,144],{},"9",[100,146,147,150],{},[115,148,149],{},"Clé Anthropic",[115,151,152],{},"5",[100,154,155,161],{},[115,156,157,158],{},"Clé Supabase ",[37,159,160],{},"service_role",[115,162,163],{},"3",[100,165,166,169],{},[115,167,168],{},"Clé secrète Stripe",[115,170,163],{},[100,172,173,176],{},[115,174,175],{},"Clé restreinte Stripe",[115,177,178],{},"2",[10,180,181],{},"Le total des lignes dépasse 1 332 parce qu'une appli peut en porter deux. Triez\nces mêmes 1 332 applis en groupes qui ne se recouvrent pas et l'image devient\nplus nette encore : 1 080 avaient une clé Google et rien d'autre, 198 avaient une\nvaleur à forte entropie qui peut être ou non un vrai justificatif, et 54 avaient\nune clé qui est un véritable secret par sa forme même.",[183,184],"diagram",{"alt":185,"caption":186,"src":187},"Une seule barre large représentant les 1 332 applis où une clé a été trouvée, divisée en trois parties : une longue section turquoise de 1 080, une section ambre plus courte de 198, et une étroite section rouge de 54 à l'extrémité droite.","Chaque appli où nous avons trouvé une clé, triée en trois groupes qui ne se recouvrent pas. La section rouge est celle dont parlent les avertissements.","\u002Fblog\u002Fwhat-secrets-leak-from-vibe-coded-apps\u002Fwhat-we-found-1600x620.png",[10,189,190,191,194,195,198],{},"Le deuxième groupe mérite d'être décrit avec soin. Une valeur à forte entropie\nposée à côté d'un mot comme ",[37,192,193],{},"secret"," ou ",[37,196,197],{},"password"," peut être un justificatif\nvivant, ou bien un identifiant de session, une empreinte de build ou un jeton\npublic au nom malheureux. Nous le signalons comme méritant un coup d'œil, et de\nl'extérieur personne ne peut vous dire lequel c'est.",[10,200,201,202,206],{},"Les 54 du troisième groupe sont la vraie affaire. Toutes sauf deux ont obtenu la\nnote D ou F, parce qu'un seul constat critique plafonne la note à D quoi que\nl'appli ait fait de bien par ailleurs. Le plus gros groupe à l'intérieur est la\nclé OpenAI, à 33, et celle-là\n",[28,203,205],{"href":204},"\u002Fblog\u002Fopenai-api-key-exposed-in-frontend","n'a aucun réglage qui la rendrait sûre dans un navigateur",".",[17,208,210],{"id":209},"la-clé-contre-laquelle-tout-le-monde-met-en-garde-était-la-plus-rare","La clé contre laquelle tout le monde met en garde était la plus rare",[10,212,213,214,216],{},"Trois applis. C'est le nombre de celles qui livraient une clé Supabase\n",[37,215,160],{},", celle qui passe outre chaque règle de table que vous avez\nécrite. Une clé secrète Stripe est apparue trois fois elle aussi.",[10,218,219,220,222,223,226,227,226,230,226,233,206],{},"Mettez cela en regard de l'autre moitié du même balayage. Parmi les applis\nscannées, 8 429 nommaient un projet Supabase, et les deux constats se situent à\nl'intérieur de ce même groupe. Trois d'entre elles livraient la clé\n",[37,221,160],{},". Dans 2 096 d'entre elles, au moins une table a répondu à une\nrequête sans aucune connexion, et dans 394 cette table portait un nom de\npersonnes : ",[37,224,225],{},"users",", ",[37,228,229],{},"profiles",[37,231,232],{},"customers",[37,234,235],{},"orders",[183,237],{"alt":238,"caption":239,"src":240},"Deux lignes tracées à la même échelle. La ligne du haut, marquée d'une clé, est un filet rouge si fin qu'il lui faut un anneau en pointillés pour être visible, étiqueté 3. La ligne du bas, marquée d'une table, est une bande turquoise occupant presque toute la largeur, étiquetée 2 096.","Les deux comptes viennent des mêmes 8 429 applis Supabase. La ligne du haut est le constat contre lequel on met les gens en garde.","\u002Fblog\u002Fwhat-secrets-leak-from-vibe-coded-apps\u002Fwarned-about-vs-found-1600x680.png",[10,242,243,244,246],{},"Les 2 096 sont un plancher. 4 749 des 8 429 n'ont jamais répondu à notre\nvérification de base de données, pour des raisons que nous ne voyons pas de\nl'extérieur, et celles-là sont enregistrées comme inconnues plutôt que comme\nsaines. Les trois clés ",[37,245,160],{}," sont un compte exact, parce qu'une clé se\nlit dans du code que chaque appli remet.",[17,248,250],{"id":249},"pourquoi-les-avertissements-visent-la-mauvaise-clé","Pourquoi les avertissements visent la mauvaise clé",[10,252,253],{},"Nous ne voyons que l'extérieur de ces applis, nous ne pouvons donc pas vous dire\npourquoi. Ce que nous pouvons montrer, c'est quelle erreur survit.",[10,255,256,257,259,260,262,263,267],{},"Copier la mauvaise clé Supabase est vraiment facile. Dans un projet plus ancien,\n",[37,258,39],{}," et ",[37,261,160],{}," se trouvent côte à côte dans le même panneau du tableau\nde bord, elles ont la même longueur et la même forme, et\n",[28,264,266],{"href":265},"\u002Fblog\u002Fwhich-api-keys-are-safe-in-your-frontend","rien ne casse si vous prenez la mauvaise",".\nCela n'est pourtant arrivé que trois fois sur 30 998 applis, parce que rien ne\nvous y pousse. Coller l'une ou l'autre fait fonctionner l'appli.",[10,269,270,271,275],{},"La table ouverte, elle, a une force derrière elle. Row Level Security est\nactivée, l'appli cesse d'afficher des données, une politique qui autorise tout le\nmonde est écrite pour que cela remarche, et à partir de cet instant le tableau de\nbord signale la table comme protégée. L'activer\n",[28,272,274],{"href":273},"\u002Fblog\u002Fsupabase-rls-on-but-table-still-public","n'est pas la même chose qu'être protégé",".\nNotre scan classe cette table en constat critique un jour où votre tableau de\nbord vous montre l'interrupteur activé et une politique en place.",[17,277,279],{"id":278},"comment-trouver-gratuitement-une-clé-api-exposée-dans-votre-appli","Comment trouver gratuitement une clé API exposée dans votre appli",[10,281,282,283,286,287,290,291,293,294,297],{},"Commencez à la main, cela coûte cinq minutes et ne demande rien à installer.\nOuvrez votre site en ligne, affichez le code source de la page et cherchez quatre\nchaînes : ",[37,284,285],{},"AIza"," pour une clé Google, ",[37,288,289],{},"sk_"," pour un secret Stripe ou de\nfournisseur de modèle, ",[37,292,160],{}," pour la clé Supabase qui ignore vos règles,\net ",[37,295,296],{},"eyJ"," pour tout jeton Supabase. Tout ce qui remonte est déjà entre les mains\nde chacun de vos visiteurs.",[10,299,300,301,303,304,306],{},"Cela vous donne la page elle-même. Ce qui échappe à cette méthode, c'est le\nJavaScript que la page charge ensuite, et c'est précisément pour cela que notre\npropre scanner ouvre une appli dans un vrai navigateur et lit les bundles au lieu\ndu HTML. Chercher à la main ne peut pas non plus vous dire si le jeton ",[37,302,296],{},"\ntrouvé est la clé ",[37,305,39],{}," ou la secrète, car les deux ont la même longueur et la\nmême forme.",[10,308,309],{},"Notre scan gratuit couvre les deux. Il charge votre appli dans un vrai\nnavigateur, lit le code qui arrive vraiment, décode chaque jeton Supabase et\nrapporte le rôle qui y est écrit, si bien qu'une clé publiable revient marquée\ncomme correcte au lieu d'être noyée dans un mur de rouge. Vous obtenez une note,\nun score et les comptes à l'écran en une vingtaine de secondes sans compte.\nDonnez une adresse e-mail et vous obtenez en plus la liste détaillée, avec une\ncorrection écrite pour votre builder que vous pouvez coller directement.",[10,311,312,313,315,316,320,321,206],{},"Trois choses qu'il ne fera pas, et ce sont les raisons pour lesquelles il est sûr\nsur une appli en ligne : il ne se connecte jamais, il n'écrit jamais rien, et il\nne garde jamais une clé qu'il trouve. Un secret exposé est conservé sous forme\nd'indice masqué comme ",[37,314,67],{},", et la valeur réelle est jetée.\n",[28,317,319],{"href":318},"\u002F#scan","Scannez votre appli",", ou lisez d'abord\n",[28,322,324],{"href":323},"\u002Fsecurity-scanner","ce que regarde chacune des neuf vérifications",[17,326,328],{"id":327},"quoi-faire-dans-lordre-que-les-chiffres-suggèrent","Quoi faire, dans l'ordre que les chiffres suggèrent",[330,331,332],"key-takeaways",{},[333,334,335,343,346,349,352],"ul",{},[336,337,338,339,342],"li",{},"Identifiez la clé avant d'y réagir. Le préfixe répond pour Stripe et pour les clés Supabase récentes ; pour une clé Supabase plus ancienne, c'est le champ ",[37,340,341],{},"role"," à l'intérieur du jeton qui tranche.",[336,344,345],{},"Si c'est une clé Google, restreignez-la au lieu de la cacher. Restriction Sites web, votre domaine, uniquement les API que vous utilisez, plus un plafond de quota quotidien. Gratuit, environ cinq minutes, aucun changement de code.",[336,347,348],{},"Si c'est une vraie clé secrète, faites-la tourner en premier. La supprimer de votre code ne ferme rien, car l'ancienne valeur est toujours dans votre historique de versions et dans les copies en cache de votre site.",[336,350,351],{},"Allez ensuite lire les règles de vos tables, car c'est là que les chiffres situent l'exposition réelle. Commencez par les tables qui contiennent des personnes.",[336,353,354],{},"Vérifiez la facturation et les journaux après toute exposition de clé secrète. Faire tourner la clé arrête ce qui vient ensuite, et ne dit rien de ce qui s'est déjà produit.",[10,356,357,358,362,363,206],{},"Parcourez toute la liste en une seule fois avec la\n",[28,359,361],{"href":360},"\u002Fchecklist","checklist de sécurité en 10 minutes",", qui couvre la clé et les\nrègles de tables à côté des autres choses à fermer dans une appli fraîchement\nlancée. Et si c'est la moitié base de données de cet article qui vous inquiète,\nelle a son propre relevé :\n",[28,364,366],{"href":365},"\u002Fblog\u002Fcan-anyone-read-your-supabase-database","qui peut lire votre base de données Supabase",{"title":368,"searchDepth":369,"depth":369,"links":370},"",3,[371,373,374,375,376,377,378],{"id":19,"depth":372,"text":20},2,{"id":47,"depth":372,"text":48},{"id":88,"depth":372,"text":89},{"id":209,"depth":372,"text":210},{"id":249,"depth":372,"text":250},{"id":278,"depth":372,"text":279},{"id":327,"depth":372,"text":328},"Bases de la sécurité","\u002Fblog\u002Fwhat-secrets-leak-from-vibe-coded-apps\u002Fcover-1200x630.png","Une page de code d'appli avec huit valeurs en forme de clé mises en évidence, la plupart ordinaires et une dessinée en rouge.","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.",false,"md",[386,389,392,395,398],{"q":387,"a":388},"Comment savoir si ma clé API a fuité ?","Ouvrez votre site en ligne, affichez le code source de la page et cherchez les formes : AIza pour une clé Google, sk_ pour un secret Stripe ou de fournisseur de modèle, et eyJ pour un JWT Supabase. Tout ce qui ressort est déjà entre les mains de chacun de vos visiteurs. Notre scan gratuit fait la même lecture depuis l'extérieur et rapporte ce qu'il voit en une vingtaine de secondes, sans compte pour obtenir la note.",{"q":390,"a":391},"Une clé API écrite en dur est-elle toujours un problème de sécurité ?","Non, et croire le contraire est exactement ce qui apprend aux gens à ignorer l'avertissement. Certaines clés sont publiées volontairement : une clé anon Supabase, une clé pk_ Stripe et une clé de configuration web Firebase sont toutes conçues pour vivre dans le navigateur, et ce qui protège vos données, ce sont les règles derrière elles. Une clé secrète est le cas inverse et sa place est sur un serveur. Le préfixe vous dit laquelle des deux vous avez sous les yeux.",{"q":393,"a":394},"On me dit que ma clé Supabase est exposée. Est-ce la mauvaise ?","Presque certainement non. Les deux clés Supabase se ressemblent, alors lisez le rôle inscrit dans le jeton ou vérifiez le préfixe : anon et sb_publishable_ sont faites pour être publiques, service_role et sb_secret_ ne le sont pas. Nous avons trouvé une clé service_role dans 3 applis sur 30 998, les probabilités penchent donc fortement du côté inoffensif. Si c'est bien la secrète, faites-la tourner dès aujourd'hui dans le tableau de bord Supabase.",{"q":396,"a":397},"De quoi devrais-je me préoccuper à la place ?","Des règles sur les tables de votre base. Parmi les applis où nous avons pu terminer cette vérification, plus de la moitié avaient au moins une table qui répondait à une requête sans aucune connexion, et dans 394 d'entre elles la table ouverte portait un nom de personnes : users, profiles, customers, orders. C'est bien plus fréquent que n'importe quelle clé qui fuit, et bien plus discret, parce que l'appli fonctionne exactement pareil dans les deux cas.",{"q":399,"a":400},"J'ai retiré la clé de mon code. Est-ce réglé ?","Pas à soi seul. L'ancienne valeur existe toujours dans votre historique de versions et dans toute copie en cache de la page, donc quiconque l'a déjà récupérée peut continuer à s'en servir. Ce qui ferme vraiment la porte, c'est de faire tourner la clé dans le tableau de bord du fournisseur, et c'est la première étape plutôt que la dernière. Ensuite, vérifiez la facturation et les journaux pour tout usage que vous ne pouvez pas expliquer.","\u002Fblog\u002Fwhat-secrets-leak-from-vibe-coded-apps\u002Fcard-800x500.png",[403,404,405,406,407],"clé api exposée dans le frontend","secrets dans le code côté client","clé api en dur dans le code","ma clé api a-t-elle fuité","trouver les clés api exposées",{},true,"Clé API exposée dans le frontend : 30 998 applis comptées","\u002Fblog\u002Fwhat-secrets-leak-from-vibe-coded-apps","2026-09-02",{"title":5,"description":382},"blog\u002Fwhat-secrets-leak-from-vibe-coded-apps",[416,417,418],"Une clé API exposée dans votre frontend est presque toujours du genre inoffensif. Nous avons trouvé une clé digne d'être signalée dans 1 332 applis sur 30 998, et 1 080 d'entre elles ne portaient qu'une clé API Google.","La clé Supabase service_role, celle contre laquelle chaque tutoriel met en garde, est apparue dans 3 applis sur 30 998. Une clé secrète Stripe aussi, dans 3.","Les clés qui dépensent de l’argent ou lisent des données par leur seule forme sont apparues dans 54 applis. Une table Supabase ouverte est apparue dans 2 096.","YFEYlagUQZJPXFJLhj4Ah8XgjguKY5lB0srR1ZfbBHM",[421,428,434,440,446,452,458,464,470,476,482,488,494,500,506,512,518,524,530,536,542,547,548,554,560,566,572,578,584,590,596,602,608,613,619,624,629,635,641,646,651,657],{"path":422,"title":423,"description":424,"published":425,"category":426,"image":427,"draft":383},"\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":429,"title":430,"description":431,"published":432,"category":379,"image":433,"draft":383},"\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":435,"title":436,"description":437,"published":438,"category":379,"image":439,"draft":383},"\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.","2026-09-21","\u002Fblog\u002Fis-lovable-safe\u002Fcard-800x500.png",{"path":441,"title":442,"description":443,"published":444,"category":379,"image":445,"draft":383},"\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":447,"title":448,"description":449,"published":450,"category":379,"image":451,"draft":383},"\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":453,"title":454,"description":455,"published":456,"category":379,"image":457,"draft":383},"\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":459,"title":460,"description":461,"published":462,"category":379,"image":463,"draft":383},"\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":465,"title":466,"description":467,"published":468,"category":379,"image":469,"draft":383},"\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":471,"title":472,"description":473,"published":474,"category":379,"image":475,"draft":383},"\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":477,"title":478,"description":479,"published":480,"category":426,"image":481,"draft":383},"\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":483,"title":484,"description":485,"published":486,"category":426,"image":487,"draft":383},"\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":489,"title":490,"description":491,"published":492,"category":426,"image":493,"draft":383},"\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":495,"title":496,"description":497,"published":498,"category":379,"image":499,"draft":383},"\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":501,"title":502,"description":503,"published":504,"category":379,"image":505,"draft":383},"\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":507,"title":508,"description":509,"published":510,"category":379,"image":511,"draft":383},"\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":513,"title":514,"description":515,"published":516,"category":379,"image":517,"draft":383},"\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":519,"title":520,"description":521,"published":522,"category":379,"image":523,"draft":383},"\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":525,"title":526,"description":527,"published":528,"category":379,"image":529,"draft":383},"\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":531,"title":532,"description":533,"published":534,"category":379,"image":535,"draft":383},"\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":537,"title":538,"description":539,"published":540,"category":379,"image":541,"draft":383},"\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":204,"title":543,"description":544,"published":545,"category":379,"image":546,"draft":383},"Votre clé API OpenAI est exposée dans votre frontend. Changez-la.","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.","2026-09-03","\u002Fblog\u002Fopenai-api-key-exposed-in-frontend\u002Fcard-800x500.png",{"path":411,"title":5,"description":382,"published":412,"category":379,"image":401,"draft":383},{"path":549,"title":550,"description":551,"published":552,"category":426,"image":553,"draft":383},"\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":555,"title":556,"description":557,"published":558,"category":379,"image":559,"draft":383},"\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":561,"title":562,"description":563,"published":564,"category":426,"image":565,"draft":383},"\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":567,"title":568,"description":569,"published":570,"category":379,"image":571,"draft":383},"\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":573,"title":574,"description":575,"published":576,"category":379,"image":577,"draft":383},"\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":579,"title":580,"description":581,"published":582,"category":379,"image":583,"draft":383},"\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":585,"title":586,"description":587,"published":588,"category":379,"image":589,"draft":383},"\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":591,"title":592,"description":593,"published":594,"category":426,"image":595,"draft":383},"\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":597,"title":598,"description":599,"published":600,"category":426,"image":601,"draft":383},"\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":603,"title":604,"description":605,"published":606,"category":379,"image":607,"draft":383},"\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":30,"title":609,"description":610,"published":611,"category":379,"image":612,"draft":383},"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":614,"title":615,"description":616,"published":617,"category":426,"image":618,"draft":383},"\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":365,"title":620,"description":621,"published":622,"category":379,"image":623,"draft":383},"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":625,"title":626,"description":627,"published":622,"category":379,"image":628,"draft":383},"\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":630,"title":631,"description":632,"published":633,"category":379,"image":634,"draft":383},"\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":636,"title":637,"description":638,"published":639,"category":426,"image":640,"draft":383},"\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":273,"title":642,"description":643,"published":644,"category":379,"image":645,"draft":383},"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":647,"title":648,"description":649,"published":644,"category":426,"image":650,"draft":383},"\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":652,"title":653,"description":654,"published":655,"category":426,"image":656,"draft":383},"\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":265,"title":658,"description":659,"published":655,"category":379,"image":660,"draft":383},"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",1790150953917]