{"id":1250,"date":"2025-08-29T15:29:26","date_gmt":"2025-08-29T13:29:26","guid":{"rendered":"https:\/\/dyb.fr\/?p=1250"},"modified":"2025-08-29T15:29:26","modified_gmt":"2025-08-29T13:29:26","slug":"%f0%9f%9a%a8-top-15-erreurs-de-securite-qui-ruinent-ton-saas","status":"publish","type":"post","link":"https:\/\/dyb.eu\/blog\/%f0%9f%9a%a8-top-15-erreurs-de-securite-qui-ruinent-ton-saas\/","title":{"rendered":"\ud83d\udea8 Top 15 erreurs de s\u00e9curit\u00e9 qui ruinent ton SaaS"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Lorsqu\u2019on construit une application SaaS, beaucoup de d\u00e9veloppeurs \u2014 notamment freelances ou juniors \u2014 se concentrent sur les fonctionnalit\u00e9s et l\u2019UX. La s\u00e9curit\u00e9 passe souvent apr\u00e8s\u2026 jusqu\u2019au jour o\u00f9 une fuite ou une attaque survient.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Voici une <strong>liste des erreurs de s\u00e9curit\u00e9 que l\u2019on retrouve le plus souvent dans les projets<\/strong>, et qui sont pourtant faciles \u00e0 \u00e9viter :<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udd11 API et gestion des droits<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Endpoints d\u2019administration non prot\u00e9g\u00e9s<\/strong><br>Trop souvent, l\u2019API d\u2019admin reste expos\u00e9e sans contr\u00f4le d\u2019acc\u00e8s strict.<\/li>\n\n\n\n<li><strong>Logique admin dans le client<\/strong><br>Le frontend contient parfois des morceaux de code r\u00e9v\u00e9lant comment fonctionnent les privil\u00e8ges. Un vrai guide pour un attaquant.<\/li>\n\n\n\n<li><strong>Acc\u00e8s aux ressources d\u2019autres utilisateurs<\/strong><br>C\u2019est l\u2019erreur num\u00e9ro un : un simple changement d\u2019ID dans l\u2019URL permet de consulter les donn\u00e9es d\u2019un autre utilisateur.<\/li>\n\n\n\n<li><strong>Mise \u00e0 jour de propri\u00e9t\u00e9s sensibles<\/strong><br>Exemple classique : la variable <code>isAdmin<\/code> dans le mod\u00e8le utilisateur, modifiable via un simple PATCH.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udd75\ufe0f\u200d\u2642\ufe0f Fuites d\u2019informations<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Secrets dans le frontend<\/strong><br>Cl\u00e9s API, tokens, ou m\u00eame fichiers IPA\/APK de vieilles versions : tout \u00e7a finit parfois expos\u00e9 au grand public.<\/li>\n\n\n\n<li><strong>Sitemaps ou listes d\u2019endpoints oubli\u00e9es<\/strong><br>Ce sont des cartes au tr\u00e9sor pour qui veut explorer les zones sensibles de votre app.<\/li>\n\n\n\n<li><strong>R\u00e9ponses API trop bavardes<\/strong><br>Inutile de renvoyer un <code>password_hash<\/code> ou des tokens internes dans un JSON.<\/li>\n\n\n\n<li><strong>Publication de source maps<\/strong><br>Les fichiers <code>.map<\/code> rendent votre code compr\u00e9hensible et facilitent l\u2019ing\u00e9nierie inverse.<\/li>\n\n\n\n<li><strong>IDs incr\u00e9ment\u00e9s<\/strong><br>Les <code>\/users\/1<\/code>, <code>\/users\/2<\/code>, <code>\/users\/3<\/code> permettent de dumper une base enti\u00e8re. Pr\u00e9f\u00e9rez des UUIDs.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83e\uddd1\u200d\ud83d\udcbb Dev &amp; CI\/CD<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Secrets commit\u00e9s dans Git<\/strong><br>Cl\u00e9s API et variables d\u2019environnement pouss\u00e9es par erreur (puis supprim\u00e9es en commit suivant, mais toujours visibles dans l\u2019historique).<\/li>\n\n\n\n<li><strong>.env expos\u00e9s<\/strong><br>Le fichier <code>.env<\/code> tra\u00eene parfois sur un serveur, accessible en simple GET <code>\/env<\/code> ou via une mauvaise config Nginx\/Apache.<\/li>\n\n\n\n<li><strong>Droits trop larges en CI\/CD<\/strong><br>Les runners CI ont acc\u00e8s \u00e0 toute la prod au lieu d\u2019un r\u00f4le limit\u00e9 (principe du moindre privil\u00e8ge oubli\u00e9).<\/li>\n\n\n\n<li><strong>Pas de rotation des cl\u00e9s<\/strong><br>Une cl\u00e9 API g\u00e9n\u00e9r\u00e9e il y a 3 ans reste valide et expos\u00e9e dans plusieurs environnements.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udd10 Authentification &amp; sessions<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Pas de rate limiting sur le login<\/strong><br>Laisser un formulaire de connexion sans limite de tentatives = brute force assur\u00e9.<\/li>\n\n\n\n<li><strong>JWT qui n\u2019expirent jamais<\/strong><br>Un token vol\u00e9 reste valable ind\u00e9finiment \u2192 un acc\u00e8s permanent pour l\u2019attaquant.<\/li>\n\n\n\n<li><strong>Cookies de session sans <code>HttpOnly<\/code> ni <code>Secure<\/code><\/strong><br>Facilement volables via XSS ou interceptables en clair.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udee0\ufe0f Divers erreurs \"b\u00eates mais communes\"<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Backup expos\u00e9 dans un r\u00e9pertoire \/backup<\/strong><br>Zip ou SQL dump oubli\u00e9 apr\u00e8s un test \u2192 jackpot pour un attaquant.<\/li>\n\n\n\n<li><strong>Admin panel avec mot de passe par d\u00e9faut<\/strong><br>Le fameux <code>admin\/admin<\/code> qui tra\u00eene encore trop souvent.<\/li>\n\n\n\n<li><strong>Pas de monitoring ni alerting<\/strong><br>On d\u00e9couvre l\u2019intrusion uniquement\u2026 quand un client appelle pour dire qu\u2019il a vu ses donn\u00e9es fuiter.<\/li>\n\n\n\n<li><strong>Pas de politique de logs<\/strong><br>Soit trop de logs sensibles, soit pas assez pour comprendre un incident.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">\u2705 Conclusion<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">La majorit\u00e9 de ces failles ne demandent pas de techniques complexes : ce sont des oublis, des mauvaises habitudes ou un manque de relecture. Les corriger ne prend pas beaucoup de temps, mais <strong>peut \u00e9viter une catastrophe<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Un bon r\u00e9flexe : consid\u00e9rer chaque mise en production comme une ouverture de porte vers l\u2019ext\u00e9rieur. La question \u00e0 se poser : <em>\u201cEst-ce que je n\u2019ai pas laiss\u00e9 les cl\u00e9s sous le paillasson ?\u201d<\/em><\/p>\n\n\n\n<ul class=\"wp-block-list\"><\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Lorsqu\u2019on construit une application SaaS, beaucoup de d\u00e9veloppeurs \u2014 notamment freelances ou juniors \u2014 se concentrent sur les fonctionnalit\u00e9s et l\u2019UX. La s\u00e9curit\u00e9 passe souvent apr\u00e8s\u2026 jusqu\u2019au jour o\u00f9 une fuite ou une attaque survient. Voici une liste des erreurs de s\u00e9curit\u00e9 que l\u2019on retrouve le plus souvent dans les projets, et qui sont pourtant [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":1251,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[22,34],"tags":[21,33],"class_list":["post-1250","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-cybersecurite","category-dev","tag-cybersecurite","tag-dev"],"_links":{"self":[{"href":"https:\/\/dyb.eu\/blog\/wp-json\/wp\/v2\/posts\/1250","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dyb.eu\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/dyb.eu\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/dyb.eu\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/dyb.eu\/blog\/wp-json\/wp\/v2\/comments?post=1250"}],"version-history":[{"count":0,"href":"https:\/\/dyb.eu\/blog\/wp-json\/wp\/v2\/posts\/1250\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/dyb.eu\/blog\/wp-json\/wp\/v2\/media\/1251"}],"wp:attachment":[{"href":"https:\/\/dyb.eu\/blog\/wp-json\/wp\/v2\/media?parent=1250"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dyb.eu\/blog\/wp-json\/wp\/v2\/categories?post=1250"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dyb.eu\/blog\/wp-json\/wp\/v2\/tags?post=1250"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}