[{"data":1,"prerenderedAt":921},["ShallowReactive",2],{"blog-fr-open-api-endpoint-exposed":3,"blog-index-fr":571},{"id":4,"title":5,"body":6,"category":529,"cover":530,"coverAlt":531,"description":532,"draft":533,"extension":534,"faq":535,"image":550,"keywords":551,"meta":559,"navigation":560,"ogTitle":561,"path":562,"published":563,"seo":564,"stem":565,"tldr":566,"updated":563,"__hash__":570},"blog_fr\u002Fblog\u002Fopen-api-endpoint-exposed.md","Un endpoint d'API ouvert est-il un problème de sécurité ?",{"type":7,"value":8,"toc":515},"minimark",[9,13,21,26,29,32,35,41,44,48,51,54,118,121,125,128,138,144,150,168,179,188,192,195,202,274,282,294,298,301,304,307,312,322,326,329,332,356,359,363,366,369,379,382,388,399,421,427,430,436,445,450,453,459,462,471,475,495,502],[10,11,12],"p",{},"Votre scan est revenu avec une ligne qui ne se lit pas comme un verdict :\ncertains endpoints d'API répondent sans login. Quelqu'un vous l'a peut-être dit\nplus franchement, en parlant d'un endpoint d'API ouvert. En dessous il y a une\nadresse, et il y a de bonnes chances que vous ne la reconnaissiez pas.",[10,14,15,16,20],{},"Voici la partie que guide après guide présente de travers : ",[17,18,19],"strong",{},"le conseil\nhabituel pour ce constat est de mettre un login devant votre endpoint, et sur la\nplupart des applications que nous avons scannées il n'y a aucun endpoint à vous\ndevant lequel en mettre un."," Sept sur dix de ceux que nous avons trouvés\nappartiennent à la plateforme sur laquelle l'application a été publiée. Lire ce\nconstat commence donc par déterminer à qui appartient l'adresse, et la réponse\nse voit le plus souvent dès la première ligne de ce qui revient.",[22,23,25],"h2",{"id":24},"ce-que-signifie-un-endpoint-dapi-ouvert-dans-votre-rapport","Ce que signifie un endpoint d'API ouvert dans votre rapport",[10,27,28],{},"Cela signifie qu'un chemin inscrit dans le code de votre application a répondu à\nune requête qui ne portait pas de login, et que ce qui est revenu était du JSON.",[10,30,31],{},"Trois étapes, et aucune n'est maligne. Nous chargeons votre application dans un\nnavigateur comme le ferait un visiteur, et nous lisons le code que ce navigateur\na téléchargé. Dedans se trouvent les adresses que votre application appelle\nquand elle a besoin de données. Puis nous demandons des données à chacune, sans\ncompte, sans cookie et sans clé. Si une adresse répond avec du JSON qui n'est pas\nun message d'erreur, elle part au rapport.",[10,33,34],{},"Cela rapporte ce qui s'est passé. Ce n'est pas un jugement sur les données, car\nrien qui se tienne à l'extérieur de votre application ne peut dire si une liste\nde choses est une liste de choses publiques. C'est pour cela que le constat est\nformulé ainsi : ces endpoints ont renvoyé des données sans aucune\nauthentification, cela peut être voulu pour des données publiques, vérifiez\nqu'aucun n'expose d'informations privées.",[36,37],"diagram",{"alt":38,"caption":39,"src":40},"Du code téléchargé depuis une application, dont quatre adresses sont extraites. Chaque adresse se voit demander des données par une requête portant une clé barrée, c'est-à-dire sans login. Trois reviennent vides ou refusées et une revient avec un bloc de données.","Les adresses sortent de votre propre code, et chacune est interrogée sans rien y joindre. Ce qui répond est ce qui atterrit dans le rapport.","\u002Fblog\u002Fopen-api-endpoint-exposed\u002Fwhat-the-check-does-1600x620.png",[10,42,43],{},"Le rapport vous tend donc une liste d'adresses à ouvrir. Chacune d'elles demande\nà être ouverte dans un navigateur déconnecté, et ce sont les premières lignes de\nla réponse qui tranchent.",[22,45,47],{"id":46},"tout-endpoint-dapi-ouvert-est-il-un-problème-de-sécurité","Tout endpoint d'API ouvert est-il un problème de sécurité ?",[10,49,50],{},"Non. Il y en a trois sortes, et seule la troisième est un problème.",[10,52,53],{},"Pensez à un immeuble. Certaines choses y sont faites pour quiconque entre : les\nhoraires près de la porte, les sorties de secours, l'avis annonçant l'entretien\nde l'ascenseur mardi. Ailleurs dans ce même immeuble il y a un classeur avec les\ncoordonnées des locataires. Depuis le couloir, un tableau d'affichage et un\nclasseur non verrouillé sont deux meubles qu'on peut ouvrir, et la seule façon\nde les distinguer est de lire ce qu'il y a sur le papier.",[55,56,57,73],"table",{},[58,59,60],"thead",{},[61,62,63,67,70],"tr",{},[64,65,66],"th",{},"Ce qui a répondu",[64,68,69],{},"À qui appartient l'adresse",[64,71,72],{},"Où vous en êtes",[74,75,76,92,104],"tbody",{},[61,77,78,82,85],{},[79,80,81],"td",{},"Réglages de la plateforme : avis de cookies, interrupteurs",[79,83,84],{},"À votre builder, dans toutes les applications qu'il publie",[79,86,87],{},[88,89,91],"key-verdict",{"type":90},"safe","Rien à faire",[61,93,94,97,100],{},[79,95,96],{},"Vos propres données publiques : une liste de prix, un article",[79,98,99],{},"À vous, et faites pour être lues",[79,101,102],{},[88,103,91],{"type":90},[61,105,106,109,112],{},[79,107,108],{},"Des lignes sur des personnes : noms, e-mails, commandes",[79,110,111],{},"À vous, et accessibles à quiconque détient l'adresse",[79,113,114],{},[88,115,117],{"type":116},"danger","Fermez-la aujourd'hui",[10,119,120],{},"La première ligne est un tableau d'affichage que quelqu'un d'autre a vissé au\nmur. La deuxième est un tableau que vous avez accroché exprès. La troisième est\nle classeur, et il est ouvert depuis aussi longtemps que l'adresse existe.",[22,122,124],{"id":123},"comment-vérifier-ce-que-renvoient-vos-endpoints","Comment vérifier ce que renvoient vos endpoints",[10,126,127],{},"Ouvrez chacun déconnecté et lisez ce qui arrive. La lecture prend plus de temps\nque le constat ne le laisse croire, et c'est la seule étape qui répond à la\nquestion.",[10,129,130,133,134,137],{},[17,131,132],{},"Trouvez les adresses."," Ouvrez votre application en production, appuyez sur\nF12 pour faire apparaître les outils de développement du navigateur, cliquez sur\n",[17,135,136],{},"Réseau"," et rechargez la page. Parcourez les requêtes qui reviennent en JSON.\nCe sont les adresses auxquelles votre application va chercher des données, et la\nliste du rapport en est un sous-ensemble.",[10,139,140,143],{},[17,141,142],{},"Interrogez chacune en inconnu."," Copiez une URL, ouvrez une fenêtre de\nnavigation privée pour être déconnecté, et collez-la. Ce que vous voyez est\nexactement ce que voit à cette adresse n'importe qui sur internet.",[10,145,146,149],{},[17,147,148],{},"Lisez les premières lignes."," Trois choses peuvent revenir :",[151,152,153,162,165],"ul",{},[154,155,156,157,161],"li",{},"Une erreur, un refus, ou ",[158,159,160],"code",{},"[]",". L'adresse veut un login, ou il n'y a rien\ndedans pour un appelant déconnecté. Passez à la suivante.",[154,163,164],{},"Des réglages. Des drapeaux, des interrupteurs, une couleur, la liste des\nfonctionnalités activées, un numéro de version. Personne n'est nommé et rien\nn'est décrit. Passez à la suivante.",[154,166,167],{},"Des lignes. Une adresse e-mail, le nom d'une personne, le montant d'une\ncommande, le texte d'un message, un numéro de téléphone. Arrêtez-vous ici,\nc'est celle-là.",[10,169,170,171,174,175,178],{},"Si vous trouvez des lignes, essayez de changer un chiffre dans l'URL avant de\nfermer l'onglet. Une adresse qui livre la fiche d'une personne sur ",[158,172,173],{},"id=1"," et\ncelle d'une autre sur ",[158,176,177],{},"id=2"," les livre toutes, et cela vaut la peine de le\nsavoir avant de décider à quel point c'est urgent.",[10,180,181,182,187],{},"Notre scan gratuit fait les deux premières étapes pour vous : il lit dans le\ncode de votre application les adresses qu'elle appelle, interroge chacune sans\nlogin, et liste celles qui ont répondu avec des données. Il prend une vingtaine\nde secondes et ne demande aucun compte :\n",[183,184,186],"a",{"href":185},"\u002Fsecurity-scanner","scannez votre application",". La troisième étape est à vous,\nparce que vous êtes la seule personne à savoir si un nom de cette liste est un\nvrai client.",[22,189,191],{"id":190},"la-plupart-de-ceux-que-nous-avons-trouvés-sont-à-la-plateforme","La plupart de ceux que nous avons trouvés sont à la plateforme",[10,193,194],{},"Lors de notre passage d'août 2026, 3 852 des 30 926 applications où cette\nvérification a pu obtenir une réponse avaient au moins une adresse qui répond\nsans login. Sur ce total, 2 705 étaient des applications Base44, et sur Base44\nc'est presque toujours la même adresse.",[10,196,197,198,201],{},"Il s'agit de ",[158,199,200],{},"\u002Fapi\u002Fconsent\u002Fconfig",", les réglages de cookies de la plateforme.\nNous avons rouvert en septembre un échantillon d'applications Base44 signalées,\net la seule adresse qui a répondu était celle-là. Elle renvoie des réglages, elle\nest identique d'une application à l'autre, et les données de personne n'y sont.\nLe scanner la rapporte correctement et le propriétaire n'a rien à corriger.",[55,203,204,217],{},[58,205,206],{},[61,207,208,211,214],{},[64,209,210],{},"Plateforme",[64,212,213],{},"Applications avec le constat",[64,215,216],{},"Applications où la vérification a répondu",[74,218,219,230,241,252,263],{},[61,220,221,224,227],{},[79,222,223],{},"Base44",[79,225,226],{},"2 705",[79,228,229],{},"5 419",[61,231,232,235,238],{},[79,233,234],{},"Domaines propres",[79,236,237],{},"82",[79,239,240],{},"955",[61,242,243,246,249],{},[79,244,245],{},"Bolt",[79,247,248],{},"4",[79,250,251],{},"1 120",[61,253,254,257,260],{},[79,255,256],{},"Lovable",[79,258,259],{},"8",[79,261,262],{},"18 518",[61,264,265,268,271],{},[79,266,267],{},"v0",[79,269,270],{},"0",[79,272,273],{},"1 786",[10,275,276,277,281],{},"Une plateforme manque à ce tableau, exprès. Replit représente un bloc important\ndes constats restants, et personne n'en a rouvert un échantillon comme nous\nl'avons fait pour Base44, donc nous ne savons pas encore à qui sont ces\nadresses. Publier un chiffre comme étant le problème du propriétaire avant que\nquiconque l'ait regardé, c'est exactement ainsi qu'un réglage de plateforme\nBase44 devient une statistique sur des propriétaires négligents. Chacun des\nchiffres ci-dessus vient de\n",[183,278,280],{"href":279},"\u002Fresearch\u002Fvibe-coded-app-security-2026","notre scan de 30 998 applications vibe-coded en production",",\nqui publie chaque chiffre avec la base sur laquelle il a été mesuré.",[10,283,284,285,288,289,293],{},"Lisez les deux extrémités de ce tableau ensemble, car l'écart est la partie\nutile. Sur Lovable, c'est 8 applications sur 18 518, et sur v0 aucune. Ces\napplications n'ont pas de petit serveur à elles : la page parle à Supabase\ndirectement depuis le navigateur, il n'y a donc nulle part de ",[158,286,287],{},"\u002Fapi\u002F…"," à vous\nque cette vérification puisse trouver. Ce qui protège les données sur une\napplication comme celle-là, ce sont les règles sur chaque table, et c'est un\nautre constat avec une\n",[183,290,292],{"href":291},"\u002Fblog\u002Fsupabase-rls-on-but-table-still-public","façon bien à lui de mal tourner",".",[22,295,297],{"id":296},"quand-le-json-est-des-réglages-et-quand-ce-sont-des-personnes","Quand le JSON est des réglages, et quand ce sont des personnes",[10,299,300],{},"Une question tranche : quelque chose dans la réponse décrit-il une personne ?",[10,302,303],{},"Les réglages décrivent votre application. Un drapeau disant si le mode sombre\nest activé, la liste des devises que vous acceptez, la version de quelque chose,\nle texte d'un bandeau de cookies. Publier cela révèle comment votre application\nest configurée, et votre application tourne de toute façon sous les yeux de tout\nle monde.",[10,305,306],{},"Les lignes décrivent vos utilisateurs. Un nom, une adresse e-mail, ce que\nquelqu'un a acheté, ce qu'il a écrit, où il habite. Ce n'est pas une phrase sur\nune configuration, c'est le contenu du classeur, et cela compte à cause de la\nbanalité du geste qui l'emporte. Il n'y a pas d'effraction. L'adresse est une\nligne de texte qui fonctionne dans n'importe quel navigateur, alors elle se\nretrouve collée dans une conversation de groupe, enregistrée dans les notes de\nquelqu'un, et appelée à intervalles réguliers par un script que personne ne\nsurveille.",[36,308],{"alt":309,"caption":310,"src":311},"Deux réponses de taille et de forme identiques. Celle de gauche contient quatre interrupteurs, deux allumés et deux éteints. Celle de droite contient quatre lignes, chacune avec la silhouette d'une personne et une ligne caviardée à côté.","Les deux sont un 200 et un bloc de JSON, et c'est tout ce que la vérification voit. La différence entre elles est toute la question, et vous pouvez y répondre en lisant.","\u002Fblog\u002Fopen-api-endpoint-exposed\u002Fsettings-or-people-1600x660.png",[313,314,316],"callout",{"type":315},"note",[10,317,318,321],{},[17,319,320],{},"Le cas embarrassant, c'est l'adresse qui était des réglages."," Un endpoint qui\nrenvoyait la liste des catégories de votre application était une donnée publique\nle jour où il a été écrit. Puis quelqu'un a ajouté une colonne à la table\nderrière, pour que la page puisse afficher qui a créé chaque catégorie, et cette\nmême adresse s'est mise à livrer des noms. Rien n'a changé à l'écran, l'adresse\nn'a pas bougé, et le constat dans votre rapport se lit exactement comme avant.",[22,323,325],{"id":324},"fermer-un-endpoint-et-pourquoi-renommer-le-chemin-ne-le-ferme-pas","Fermer un endpoint, et pourquoi renommer le chemin ne le ferme pas",[10,327,328],{},"Exigez un login à l'adresse, et répondez 401 à un appelant qui n'en a pas.",[10,330,331],{},"C'est toute la correction, et elle se pose à l'adresse et nulle part ailleurs.\nTrois choses qui ressemblent à la correction sans en être une :",[151,333,334,340,350],{},[154,335,336,339],{},[17,337,338],{},"Renommer le chemin, ou le sortir de votre code."," C'est celle dont il faut\nse méfier, parce que le constat disparaît. Celui qui avait déjà l'URL l'a\ntoujours, elle est dans les historiques de navigation et les journaux serveur,\net le classeur est encore ouvert, simplement sans étiquette sur le devant.",[154,341,342,345,346,293],{},[17,343,344],{},"Restreindre votre en-tête CORS."," Cela décide quels autres sites peuvent\nlire une réponse dans le navigateur de quelqu'un, et rien d'autre ne le\nconsulte. Un script ou un terminal lit la même adresse dans les deux cas, et\nc'est pourquoi\n",[183,347,349],{"href":348},"\u002Fblog\u002Fcors-wildcard-security-risk","le constat du joker est une autre question",[154,351,352,355],{},[17,353,354],{},"Filtrer dans l'application."," Si la page cache les lignes qu'elle ne devrait\npas montrer, l'adresse les envoie quand même. Le filtrage doit se produire\navant que la réponse ne parte.",[10,357,358],{},"Il y a une quatrième option, et sur une page publique c'est souvent la\nmeilleure : ne plus avoir l'endpoint du tout. Si les données ne servent qu'à\nvotre propre page, la page peut les recevoir pendant sa construction, et\nl'adresse sort de votre code avec elles.",[22,360,362],{"id":361},"à-quoi-ressemble-la-correction-en-code","À quoi ressemble la correction en code",[10,364,365],{},"Deux choses, dans le handler qui répond à l'adresse : déterminer qui demande, et\ns'arrêter si la réponse est personne.",[10,367,368],{},"Vous ne taperez peut-être jamais cela vous-même, et ce n'est pas grave. Lisez-le\nquand même, parce que c'est ce avec quoi vous vérifiez que votre builder a bien\nfait ce que vous lui avez demandé. Voici la forme d'avant, celle que le scan a\ntrouvée :",[370,371,376],"pre",{"className":372,"code":374,"language":375},[373],"language-text","app.get('\u002Fapi\u002Forders', async (req, res) => {\n  const orders = await db.orders.findMany()\n  res.json(orders)\n})\n","text",[158,377,374],{"__ignoreMap":378},"",[10,380,381],{},"Et après :",[370,383,386],{"className":384,"code":385,"language":375},[373],"app.get('\u002Fapi\u002Forders', async (req, res) => {\n  const user = await getUserFromRequest(req)\n  if (!user) {\n    return res.status(401).json({ error: 'Not signed in' })\n  }\n\n  const orders = await db.orders.findMany({ where: { userId: user.id } })\n  res.json(orders)\n})\n",[158,387,385],{"__ignoreMap":378},[10,389,390,391,394,395,398],{},"Deux choses ont changé et toutes les deux comptent. Le ",[158,392,393],{},"401"," est la porte. Le\n",[158,396,397],{},"where"," est la raison pour laquelle la porte vaut la peine : sans lui, un\nvisiteur connecté peut lire les commandes de tous les autres clients, ce qui\nfait un public plus petit pour les mêmes données et reste le mauvais.",[10,400,401,404,405,408,409,412,413,416,417,420],{},[17,402,403],{},"Sur les Edge Functions de Supabase, lisez la configuration avant d'écrire quoi\nque ce soit."," Les Edge Functions vérifient le jeton de l'appelant d'elles-mêmes :\nla référence de configuration de Supabase met ",[158,406,407],{},"verify_jwt"," à ",[158,410,411],{},"true"," par défaut,\ndonc une fonction qui répond à des inconnus est une fonction où quelqu'un a\ndésactivé cela, soit par une ligne dans ",[158,414,415],{},"supabase\u002Fconfig.toml",", soit en\ndéployant avec ",[158,418,419],{},"--no-verify-jwt"," :",[370,422,425],{"className":423,"code":424,"language":375},[373],"[functions.orders]\nverify_jwt = false\n",[158,426,424],{"__ignoreMap":378},[10,428,429],{},"Si votre fonction doit être privée, supprimez ces deux lignes et redéployez. Ne\nles laissez que là où l'endpoint doit vraiment répondre à tout le monde, ce qui\nest le cas que la documentation de Supabase elle-même prend en exemple : un\nwebhook de paiement. À l'intérieur de la fonction, le SDK actuel vous donne un\nclient déjà restreint à la personne qui a appelé :",[370,431,434],{"className":432,"code":433,"language":375},[373],"import { withSupabase } from 'npm:@supabase\u002Fserver'\n\nexport default {\n  fetch: withSupabase({ auth: 'user' }, async (_req, ctx) => {\n    const { data } = await ctx.supabase.from('orders').select()\n    return Response.json(data)\n  }),\n}\n",[158,435,433],{"__ignoreMap":378},[10,437,438,441,442,293],{},[158,439,440],{},"ctx.supabase"," s'exécute en tant que l'appelant, ce sont donc vos règles de\nsécurité au niveau des lignes qui décident de ce qui revient, la même protection\nsur laquelle repose le reste de votre application, et\n",[183,443,444],{"href":291},"ce qu'il vaut la peine de vérifier à part",[446,447,449],"h3",{"id":448},"le-prompt-à-coller-dans-votre-builder","Le prompt à coller dans votre builder",[10,451,452],{},"Si vous construisez dans Lovable, Bolt, Cursor, Replit ou v0, donnez-lui ceci.\nLaissez-le en anglais, quelle que soit la langue dans laquelle vous lisez cet\narticle, parce que c'est la langue dans laquelle ces outils raisonnent, et\nremplacez les deux parties entre crochets par ce que dit votre propre rapport :",[370,454,457],{"className":455,"code":456,"language":375},[373],"A security scan of [my-app.com] found these API endpoints answer\nwithout any authentication: [\u002Fapi\u002Forders, \u002Fapi\u002Fusers].\n\nPlease look at each one and decide whether it is meant to be public.\nFor the ones that are not, require a valid session or API token and\nreturn 401 otherwise. Make sure each one returns only the rows that\nbelong to the person asking, not the whole table filtered in the UI.\nFor any that must stay open, make sure they return only non-sensitive\ndata and add rate limiting so they cannot be abused.\n\nTell me what you changed for each endpoint, and do not rename or\nremove the paths.\n",[158,458,456],{"__ignoreMap":378},[10,460,461],{},"Cette dernière phrase est là exprès. Quand on demande à un modèle de faire\ndisparaître un constat, il prend parfois le chemin le plus court et déplace\nl'adresse, qui est le seul résultat ayant l'air d'une réussite au scan suivant\nsans rien changer.",[313,463,465],{"type":464},"warn",[10,466,467,470],{},[17,468,469],{},"Rescannez déconnecté, pas connecté."," Une fois la correction déployée,\nvérifiez-la comme le décrit la section ci-dessus : une fenêtre de navigation\nprivée et l'URL. La tester connecté prouve que l'endpoint fonctionne toujours\npour vous, ce dont personne n'a jamais douté. Déconnectez-vous et relisez-la.",[22,472,474],{"id":473},"ce-quil-faut-faire-maintenant","Ce qu'il faut faire maintenant",[476,477,478],"key-takeaways",{},[151,479,480,483,486,489,492],{},[154,481,482],{},"Ouvrez chaque adresse signalée dans une fenêtre de navigation privée et lisez ce qui revient. C'est l'étape que le rapport ne peut pas faire à votre place.",[154,484,485],{},"Si la réponse est des réglages et que l'adresse en est une que vous n'avez jamais écrite, elle est à votre builder et il n'y a rien à corriger. Cherchez le chemin dans la documentation de votre plateforme avant d'y dépenser quoi que ce soit.",[154,487,488],{},"Si la réponse contient un nom, un e-mail ou une commande, exigez un login à cette adresse dès aujourd'hui et renvoyez un 401 à quiconque n'en a pas.",[154,490,491],{},"Ne renommez pas le chemin et n'en supprimez pas la référence. Le constat disparaît et l'adresse continue de répondre.",[154,493,494],{},"Essayez de changer un id dans l'URL sur votre propre application. Une adresse qui sert une fiche à un inconnu les sert en général toutes.",[10,496,497,498,293],{},"Les adresses de cette liste ont toutes été écrites par quelqu'un qui savait ce\nqu'il y avait derrière à ce moment-là, et ce qui change, c'est ce qu'il y a\nderrière. Reeve Care repasse ce scan sur votre application en production selon\nun calendrier et vous envoie un e-mail quand un résultat se dégrade, ce qui est\nprécisément le cas que le passage déconnecté ci-dessus ne peut pas attraper :\n",[183,499,501],{"href":500},"\u002Fpricing","ce qu'il surveille et ce qu'il coûte",[10,503,504,505,509,510,514],{},"Si vous préférez tout traiter d'une traite, la\n",[183,506,508],{"href":507},"\u002Fchecklist","checklist de sécurité en 10 minutes"," couvre ceci à côté du reste de\nce qu'une application fraîchement lancée a tendance à laisser ouvert, et\n",[183,511,513],{"href":512},"\u002Fblog\u002Fwhich-api-keys-are-safe-in-your-frontend","quelles clés sont sûres dans votre frontend","\nest l'autre constat avec lequel les gens arrivent le plus souvent.",{"title":378,"searchDepth":516,"depth":516,"links":517},3,[518,520,521,522,523,524,525,528],{"id":24,"depth":519,"text":25},2,{"id":46,"depth":519,"text":47},{"id":123,"depth":519,"text":124},{"id":190,"depth":519,"text":191},{"id":296,"depth":519,"text":297},{"id":324,"depth":519,"text":325},{"id":361,"depth":519,"text":362,"children":526},[527],{"id":448,"depth":516,"text":449},{"id":473,"depth":519,"text":474},"Bases de la sécurité","\u002Fblog\u002Fopen-api-endpoint-exposed\u002Fcover-1200x630.png","Deux guichets identiques dans un mur. D'un dépasse une feuille d'interrupteurs, de l'autre une feuille de visages.","Votre scan a signalé un endpoint d'API ouvert. Que cela compte dépend de ce qui est revenu, et la plupart de ceux trouvés étaient à la plateforme.",false,"md",[536,539,541,544,547],{"q":537,"a":538},"Que veut dire \"endpoint d'API ouvert\" dans mon rapport ?","Cela veut dire que nous avons lu le code que votre application envoie à un navigateur, que nous y avons trouvé une adresse à laquelle votre application demande des données, et que nous avons demandé des données à cette adresse sans compte et sans login. Elle a répondu, et la réponse était du JSON. C'est tout le constat. Il rapporte ce qui s'est passé, et ne juge pas si les données étaient privées, car rien à l'extérieur de votre application ne peut le savoir.",{"q":47,"a":540},"Non. Beaucoup d'adresses sont faites pour répondre à tout le monde : une liste de prix publiée, un article, la liste des fonctionnalités activées. Le problème, c'est l'adresse qui renvoie des lignes appartenant à des personnes, parce qu'elle le fait pour quiconque possède l'URL. Lisez ce qui est revenu et demandez-vous si quoi que ce soit là-dedans décrit une personne.",{"q":542,"a":543},"Mon rapport signale un endpoint que je n'ai pas écrit. Qu'est-ce que c'est ?","En général, celui de votre builder. Les plateformes qui donnent à votre application un petit serveur à elle y glissent aussi quelques adresses à elles, et celles-là sont dans le code de toutes les applications de la plateforme. L'exemple le plus net que nous ayons mesuré, ce sont les réglages de cookies de Base44 sur \u002Fapi\u002Fconsent\u002Fconfig, qui représentent 2 705 des 3 852 constats de notre passage d'août 2026. Ils renvoient des réglages, ils sont identiques sur toutes les applications Base44, et rien là-dedans ne vous appartient.",{"q":545,"a":546},"Comment vérifier ce que renvoient les endpoints de mon application ?","Ouvrez votre application en production, appuyez sur F12, cliquez sur Réseau et rechargez. Les requêtes qui reviennent en JSON sont les adresses auxquelles votre application va chercher des données. Copiez chaque URL, ouvrez une fenêtre de navigation privée pour être déconnecté, et collez-les une par une. Lisez ce qui arrive. Une erreur ou une liste vide, c'est très bien. Les lignes contenant des noms, des e-mails ou des montants de commande sont lisibles par quiconque détient cette adresse.",{"q":548,"a":549},"Cacher le chemin suffit-il ?","Non. Renommer l'adresse, ou retirer la référence de votre code, empêche un scanner de la trouver et la laisse répondre exactement comme avant. Celui qui avait déjà l'URL l'a toujours, et elle reste dans les historiques de navigation, les journaux serveur et tout ce qui a parcouru votre site. La correction se fait à l'adresse : exiger un login et répondre 401 à un inconnu.","\u002Fblog\u002Fopen-api-endpoint-exposed\u002Fcard-800x500.png",[552,553,554,555,556,557,558],"endpoint d'api ouvert","endpoint d'api sans authentification","endpoint d'api renvoie des données sans login","mon endpoint d'api est-il public","route api non protégée","endpoint d'api sans login","endpoint json exposé",{},true,"Un endpoint d'API ouvert est-il un problème ?","\u002Fblog\u002Fopen-api-endpoint-exposed","2026-09-25",{"title":5,"description":532},"blog\u002Fopen-api-endpoint-exposed",[567,568,569],"Un endpoint d'API ouvert signifie qu'un chemin inscrit dans le code de votre application a répondu à une requête sans login, et que ce qui est revenu était du JSON.","Sur ceux que nous avons trouvés dans 30 926 applications, sept sur dix ont été posés par la plateforme sur laquelle l'application a été publiée, et ils renvoient des réglages.","La question qui tranche est de savoir si quelque chose dans la réponse décrit une personne. Une liste de prix est publique à dessein. Une liste de vos clients ne l'a jamais été.","FXbB66Hh6XkI51XPsHiCVmZjyevHMZ991CxBx7U60Ig",[572,578,584,590,596,602,608,614,620,626,632,638,644,651,657,663,668,669,675,681,687,693,699,705,711,717,723,729,735,741,747,753,759,765,771,777,783,789,795,801,807,813,819,825,831,837,843,848,854,860,866,872,878,884,889,895,901,906,911,917],{"path":573,"title":574,"description":575,"published":576,"category":529,"image":577,"draft":533},"\u002Fblog\u002Fbase44-security-scan","Scan de sécurité Base44 : ce que lui seul peut voir","Le scan de sécurité Base44 vérifie sept types de problèmes depuis l’intérieur. Voici la moitié que lui seul lit, et celle qu’il ne regarde jamais.","2026-10-10","\u002Fblog\u002Fbase44-security-scan\u002Fcard-800x500.png",{"path":579,"title":580,"description":581,"published":582,"category":529,"image":583,"draft":533},"\u002Fblog\u002Fapi-key-leaked-what-to-do","Votre clé API a fuité. L'ordre dans lequel agir","Une clé API a fuité et vous ne savez pas par quoi commencer. Toutes les clés de votre frontend n'en sont pas une, et l'ordre compte plus que la vitesse.","2026-10-09","\u002Fblog\u002Fapi-key-leaked-what-to-do\u002Fcard-800x500.png",{"path":585,"title":586,"description":587,"published":588,"category":529,"image":589,"draft":533},"\u002Fblog\u002Finfinite-recursion-in-policy-for-relation","\"Infinite recursion detected in policy\" sans désactiver RLS","\"Infinite recursion detected in policy for relation\" signifie que votre policy a interrogé la table qu'elle protège. Voici comment rompre le cercle.","2026-10-08","\u002Fblog\u002Finfinite-recursion-in-policy-for-relation\u002Fcard-800x500.png",{"path":591,"title":592,"description":593,"published":594,"category":529,"image":595,"draft":533},"\u002Fblog\u002Fno-api-key-found-in-request","\"No API key found in request\" sur Supabase, et le mauvais correctif","\"No API key found in request\" veut dire que votre requête est arrivée sans clé. La plupart des réponses pointent vers les règles de votre base.","2026-10-07","\u002Fblog\u002Fno-api-key-found-in-request\u002Fcard-800x500.png",{"path":597,"title":598,"description":599,"published":600,"category":529,"image":601,"draft":533},"\u002Fblog\u002Fis-base44-safe","Base44 est-il sûr ? Ce que 5 442 applications ont montré","Base44 est-il sûr ? Neuf vérifications sur 5 442 applications Base44 en ligne. Presque toutes ont eu un B, pour des raisons que personne n’a choisies.","2026-10-06","\u002Fblog\u002Fis-base44-safe\u002Fcard-800x500.png",{"path":603,"title":604,"description":605,"published":606,"category":529,"image":607,"draft":533},"\u002Fblog\u002Fmove-a-secret-to-an-edge-function","Cacher une clé API : la déplacer dans une Edge Function Supabase","Cacher une clé API veut dire la sortir du navigateur, et une Edge Function Supabase est le plus petit endroit où la mettre. Deux étapes comptent davantage.","2026-10-05","\u002Fblog\u002Fmove-a-secret-to-an-edge-function\u002Fcard-800x500.png",{"path":609,"title":610,"description":611,"published":612,"category":529,"image":613,"draft":533},"\u002Fblog\u002Fenv-file-exposed-on-your-server","Votre fichier .env est-il exposé ? Les douze chemins à vérifier","Votre fichier .env est-il exposé sur votre propre serveur web ? Douze adresses vous le disent, et une réponse signifie que tout son contenu est public.","2026-10-04","\u002Fblog\u002Fenv-file-exposed-on-your-server\u002Fcard-800x500.png",{"path":615,"title":616,"description":617,"published":618,"category":529,"image":619,"draft":533},"\u002Fblog\u002Fis-v0-safe","Sécurité de v0 : les 1 790 applications scannées ont toutes eu A","La sécurité de v0 mesurée sur 1 790 applications en ligne : toutes ont eu A. Seules 17 citaient une base de données, et c’est surtout cela que ce A mesure.","2026-10-03","\u002Fblog\u002Fis-v0-safe\u002Fcard-800x500.png",{"path":621,"title":622,"description":623,"published":624,"category":529,"image":625,"draft":533},"\u002Fblog\u002Fis-bolt-safe","Bolt est-il sûr ? Ce que 1 123 applications Bolt ont montré","Bolt est-il sûr ? Neuf vérifications sur 1 123 applications Bolt en ligne. L’hébergement était propre. Les trouvailles : des clés et des tables ouvertes.","2026-10-02","\u002Fblog\u002Fis-bolt-safe\u002Fcard-800x500.png",{"path":627,"title":628,"description":629,"published":630,"category":529,"image":631,"draft":533},"\u002Fblog\u002Fis-supabase-down-or-your-app","Supabase en panne, ou est-ce votre app ? Comment le savoir","Supabase est-il en panne, ou est-ce votre app ? Un projet en pause, une base pleine et un bug chez vous se ressemblent. Quatre vérifications les séparent.","2026-10-01","\u002Fblog\u002Fis-supabase-down-or-your-app\u002Fcard-800x500.png",{"path":633,"title":634,"description":635,"published":636,"category":529,"image":637,"draft":533},"\u002Fblog\u002Fdoes-supabase-encrypt-my-data","Supabase chiffre-t-il mes données ? Oui. Ce que cela arrête","Supabase chiffre-t-il les données ? Oui : AES-256 au repos, TLS en transit, SOC 2 et ISO 27001. Ce que couvre chacun, et la fuite qu'aucun n'arrête.","2026-09-30","\u002Fblog\u002Fdoes-supabase-encrypt-my-data\u002Fcard-800x500.png",{"path":639,"title":640,"description":641,"published":642,"category":529,"image":643,"draft":533},"\u002Fblog\u002Fsupabase-free-plan-limits","Limites du plan gratuit Supabase : ce qui se passe à chacune","Les limites du plan gratuit Supabase : 500 Mo de base, 5 Go d'egress, aucune sauvegarde. Ce qui se passe à chaque seuil, et ce que change Pro à $25.","2026-09-29","\u002Fblog\u002Fsupabase-free-plan-limits\u002Fcard-800x500.png",{"path":645,"title":646,"description":647,"published":648,"category":649,"image":650,"draft":533},"\u002Fblog\u002Ftest-your-supabase-backup","Testez votre sauvegarde Supabase avant d'en avoir besoin","Comment tester votre sauvegarde Supabase : la restaurer dans un projet d'exercice, compter les lignes, se connecter, chercher la ligne qui manque.","2026-09-28","Backups","\u002Fblog\u002Ftest-your-supabase-backup\u002Fcard-800x500.png",{"path":652,"title":653,"description":654,"published":655,"category":649,"image":656,"draft":533},"\u002Fblog\u002Fsupabase-backup-github-action","Sauvegarde Supabase gratuite avec une GitHub Action, et le piège","Une sauvegarde Supabase par GitHub Action est gratuite et convient à beaucoup d'apps. Le workflow, la bonne connection string et l'egress de chaque run.","2026-09-27","\u002Fblog\u002Fsupabase-backup-github-action\u002Fcard-800x500.png",{"path":658,"title":659,"description":660,"published":661,"category":649,"image":662,"draft":533},"\u002Fblog\u002Fdownload-your-supabase-backup","Pourquoi vous ne pouvez pas télécharger votre sauvegarde Supabase","Impossible de télécharger votre sauvegarde Supabase sur un projet récent : la copie quotidienne est physique. Comment le vérifier et garder la vôtre.","2026-09-26","\u002Fblog\u002Fdownload-your-supabase-backup\u002Fcard-800x500.png",{"path":664,"title":665,"description":666,"published":661,"category":529,"image":667,"draft":533},"\u002Fblog\u002Fsupabase-permission-denied-for-table","Supabase \"permission denied for table\" : le grant manquant","Dès le 30 octobre, une nouvelle table Supabase répond \"permission denied for table\" tant que l'accès n'est pas accordé. Le grant de l'e-mail est la moitié.","\u002Fblog\u002Fsupabase-permission-denied-for-table\u002Fcard-800x500.png",{"path":562,"title":5,"description":532,"published":563,"category":529,"image":550,"draft":533},{"path":670,"title":671,"description":672,"published":673,"category":529,"image":674,"draft":533},"\u002Fblog\u002Flovable-security-scan","Scan de sécurité Lovable : ce qu’il ne peut pas prouver","Scan de sécurité Lovable : ce que vérifient le Quick scan et le Deep scan, quand chacun part, et la seule chose qu’un scan de l’intérieur ne prouve pas.","2026-09-24","\u002Fblog\u002Flovable-security-scan\u002Fcard-800x500.png",{"path":676,"title":677,"description":678,"published":679,"category":649,"image":680,"draft":533},"\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","\u002Fblog\u002Fsupabase-backup-auth-users\u002Fcard-800x500.png",{"path":682,"title":683,"description":684,"published":685,"category":529,"image":686,"draft":533},"\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":688,"title":689,"description":690,"published":691,"category":529,"image":692,"draft":533},"\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":694,"title":695,"description":696,"published":697,"category":529,"image":698,"draft":533},"\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":700,"title":701,"description":702,"published":703,"category":529,"image":704,"draft":533},"\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":706,"title":707,"description":708,"published":709,"category":529,"image":710,"draft":533},"\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":712,"title":713,"description":714,"published":715,"category":529,"image":716,"draft":533},"\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":718,"title":719,"description":720,"published":721,"category":529,"image":722,"draft":533},"\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":724,"title":725,"description":726,"published":727,"category":529,"image":728,"draft":533},"\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":730,"title":731,"description":732,"published":733,"category":649,"image":734,"draft":533},"\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":736,"title":737,"description":738,"published":739,"category":649,"image":740,"draft":533},"\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":742,"title":743,"description":744,"published":745,"category":649,"image":746,"draft":533},"\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":748,"title":749,"description":750,"published":751,"category":529,"image":752,"draft":533},"\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":754,"title":755,"description":756,"published":757,"category":529,"image":758,"draft":533},"\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":760,"title":761,"description":762,"published":763,"category":529,"image":764,"draft":533},"\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":766,"title":767,"description":768,"published":769,"category":529,"image":770,"draft":533},"\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":772,"title":773,"description":774,"published":775,"category":529,"image":776,"draft":533},"\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":778,"title":779,"description":780,"published":781,"category":529,"image":782,"draft":533},"\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":784,"title":785,"description":786,"published":787,"category":529,"image":788,"draft":533},"\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":790,"title":791,"description":792,"published":793,"category":529,"image":794,"draft":533},"\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":796,"title":797,"description":798,"published":799,"category":529,"image":800,"draft":533},"\u002Fblog\u002Fopenai-api-key-exposed-in-frontend","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":802,"title":803,"description":804,"published":805,"category":529,"image":806,"draft":533},"\u002Fblog\u002Fwhat-secrets-leak-from-vibe-coded-apps","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":808,"title":809,"description":810,"published":811,"category":649,"image":812,"draft":533},"\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":814,"title":815,"description":816,"published":817,"category":529,"image":818,"draft":533},"\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":820,"title":821,"description":822,"published":823,"category":649,"image":824,"draft":533},"\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":826,"title":827,"description":828,"published":829,"category":529,"image":830,"draft":533},"\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":832,"title":833,"description":834,"published":835,"category":529,"image":836,"draft":533},"\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":838,"title":839,"description":840,"published":841,"category":529,"image":842,"draft":533},"\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":348,"title":844,"description":845,"published":846,"category":529,"image":847,"draft":533},"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":849,"title":850,"description":851,"published":852,"category":649,"image":853,"draft":533},"\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":855,"title":856,"description":857,"published":858,"category":649,"image":859,"draft":533},"\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":861,"title":862,"description":863,"published":864,"category":529,"image":865,"draft":533},"\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":867,"title":868,"description":869,"published":870,"category":529,"image":871,"draft":533},"\u002Fblog\u002Fgoogle-api-key-exposed-in-frontend","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":873,"title":874,"description":875,"published":876,"category":649,"image":877,"draft":533},"\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":879,"title":880,"description":881,"published":882,"category":529,"image":883,"draft":533},"\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":885,"title":886,"description":887,"published":882,"category":529,"image":888,"draft":533},"\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":890,"title":891,"description":892,"published":893,"category":529,"image":894,"draft":533},"\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":896,"title":897,"description":898,"published":899,"category":649,"image":900,"draft":533},"\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":291,"title":902,"description":903,"published":904,"category":529,"image":905,"draft":533},"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":907,"title":908,"description":909,"published":904,"category":649,"image":910,"draft":533},"\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":912,"title":913,"description":914,"published":915,"category":649,"image":916,"draft":533},"\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":512,"title":918,"description":919,"published":915,"category":529,"image":920,"draft":533},"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",1791618969096]