{"id":13514,"date":"2025-06-03T19:08:21","date_gmt":"2025-06-03T17:08:21","guid":{"rendered":"https:\/\/www.vaadata.com\/blog\/?p=13514"},"modified":"2025-06-04T10:36:30","modified_gmt":"2025-06-04T08:36:30","slug":"comprendre-la-methodologie-daudit-de-code-source-dapplication-web","status":"publish","type":"post","link":"https:\/\/www.vaadata.com\/blog\/fr\/comprendre-la-methodologie-daudit-de-code-source-dapplication-web\/","title":{"rendered":"Comprendre la m\u00e9thodologie d&rsquo;audit de code source d&rsquo;application web"},"content":{"rendered":"<div class=\"wp-block-image\">\n<figure class=\"alignright size-large is-resized\"><img decoding=\"async\" width=\"1024\" height=\"535\" src=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2025\/06\/audit-de-code-source-app-web-1024x535.png\" alt=\"Comprendre la m\u00e9thodologie d'audit de code source d'application web\" class=\"wp-image-13583\" style=\"width:418px;height:auto\" srcset=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2025\/06\/audit-de-code-source-app-web-1024x535.png 1024w, https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2025\/06\/audit-de-code-source-app-web-300x157.png 300w, https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2025\/06\/audit-de-code-source-app-web-1536x803.png 1536w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div>\n\n\n<p>Dans le cycle de d\u00e9veloppement d\u2019une application web, la s\u00e9curit\u00e9 ne doit jamais \u00eatre rel\u00e9gu\u00e9e au second plan.<\/p>\n\n\n\n<p>Elle s\u2019invite \u00e0 chaque \u00e9tape : d\u00e8s la phase de conception, lors des choix d\u2019architecture, tout au long du d\u00e9veloppement, mais aussi apr\u00e8s le d\u00e9ploiement, au travers de tests continus.<\/p>\n\n\n\n<!--more-->\n\n\n\n<p>Parmi les diff\u00e9rentes approches pour \u00e9valuer la s\u00e9curit\u00e9 d\u2019une application, l\u2019audit de code source tient une place de choix. Contrairement aux <a href=\"https:\/\/www.vaadata.com\/blog\/fr\/en-quoi-consiste-un-test-dintrusion-objectifs-et-methodologie\/#conditions-des-tests-boite-noire-grise-et-blanche\" target=\"_blank\" rel=\"noopener\" title=\"\">tests d\u2019intrusion en boite noire ou grise<\/a>, cette m\u00e9thode permet de plonger au c\u0153ur du fonctionnement interne de l\u2019application, d\u2019en comprendre les m\u00e9canismes et d\u2019identifier des failles parfois invisibles en surface.<\/p>\n\n\n\n<p>Dans cet article, nous explorerons les principes et objectifs d\u2019un audit de code source d\u2019application web. Nous d\u00e9taillerons \u00e9galement une m\u00e9thode d\u2019audit de code source bas\u00e9 sur l\u2019analyse des \u00ab&nbsp;sources&nbsp;\u00bb et des \u00ab&nbsp;sinks&nbsp;\u00bb, des impl\u00e9mentations s\u00e9curit\u00e9, des d\u00e9pendances, etc. Enfin, nous pr\u00e9senterons des exemples concrets de vuln\u00e9rabilit\u00e9s identifiables dans le code source afin de mieux comprendre comment cette m\u00e9thodologie peut \u00eatre appliqu\u00e9e.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Guide complet sur la m\u00e9thodologie d\u2019audit de code source<\/h2>\n\n\n<div class=\"wp-block-aioseo-table-of-contents\"><ul><li><a class=\"aioseo-toc-item\" href=\"#quest-ce-quun-audit-de-code-source\">Qu\u2019est-ce qu\u2019un audit de code source\u00a0?<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#audit-de-code-source-via-analyse-des-sources-et-des-sinks\">Audit de code source via analyse des \u00ab\u00a0sources\u00a0\u00bb et des \u00ab\u00a0sinks\u00a0\u00bb<\/a><ul><li><a class=\"aioseo-toc-item\" href=\"#analyse-des-sources\">Analyse des sources<\/a><ul><li><a class=\"aioseo-toc-item\" href=\"#comprendre-les-differentes-sources-de-donnees\">Comprendre les diff\u00e9rentes sources de donn\u00e9es<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#suivre-les-flux-et-les-usages-dans-le-code\">Suivre les flux et les usages dans le code source<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#prioriser-les-analyses-en-fonction-des-risques\">Prioriser les analyses en fonction des risques<\/a><\/li><\/ul><\/li><li><a class=\"aioseo-toc-item\" href=\"#audit-des-sinks\">Audit des sinks<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#quelle-approche-choisir-entre-analyse-des-sources-et-audit-des-sinks\">Quelle approche choisir entre analyse des sources et audit des sinks ?<\/a><\/li><\/ul><\/li><li><a class=\"aioseo-toc-item\" href=\"#revue-des-implementations-securite-dans-le-code-source\">Revue des impl\u00e9mentations s\u00e9curit\u00e9 dans le code source<\/a><ul><li><a class=\"aioseo-toc-item\" href=\"#analyse-des-listes-dinterdiction-deny-lists-ou-listes-noires\">Analyse des listes d\u2019interdiction (deny lists ou listes noires)<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#analyse-des-listes-dautorisation-allow-lists-ou-listes-blanches\">Analyse des listes d&#039;autorisation (allow lists ou listes blanches)<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#neutralisation\">Neutralisation<\/a><\/li><\/ul><\/li><li><a class=\"aioseo-toc-item\" href=\"#analyse-des-dependances\">Analyse des d\u00e9pendances<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#exemples-de-vulnerabilites-identifiees-lors-dun-audit-de-code-source-dune-application-web\">Exemples de vuln\u00e9rabilit\u00e9s identifi\u00e9es lors d\u2019un audit de code source d&#039;une application web<\/a><ul><li><a class=\"aioseo-toc-item\" href=\"#mass-assignment\">Mass Assignment<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#file-path-traversal\">File Path Traversal<\/a><\/li><\/ul><\/li><li><a class=\"aioseo-toc-item\" href=\"#conclusion\">Conclusion<\/a><\/li><\/ul><\/div>\n\n\n<h2 class=\"wp-block-heading\" id=\"quest-ce-quun-audit-de-code-source\">Qu\u2019est-ce qu\u2019un audit de code source&nbsp;?<\/h2>\n\n\n\n<p>L\u2019audit de code source est une d\u00e9marche d\u2019analyse approfondie du code d\u2019une application afin d\u2019identifier des failles de s\u00e9curit\u00e9, des erreurs de logique et des mauvaises pratiques de d\u00e9veloppement.<\/p>\n\n\n\n<p>Cette analyse repose sur une approche mixte combinant des outils automatis\u00e9s et l\u2019intervention d\u2019experts en s\u00e9curit\u00e9. Les outils permettent de balayer l\u2019ensemble du code pour d\u00e9tecter des vuln\u00e9rabilit\u00e9s connues. Toutefois, ils sont souvent limit\u00e9s. C\u2019est pourquoi l\u2019intervention humaine reste indispensable. Gr\u00e2ce \u00e0 une lecture cibl\u00e9e et une compr\u00e9hension fine du contexte, un pentester est en mesure d\u2019identifier des failles complexes sp\u00e9cifiques \u00e0 l\u2019application, souvent ind\u00e9tectables par des outils.<\/p>\n\n\n\n<p>Dans cette optique, la collaboration avec les d\u00e9veloppeurs est essentielle. Leur connaissance de l\u2019architecture et des fonctionnalit\u00e9s leur permet d\u2019orienter les auditeurs vers les composants critiques, en particulier ceux qui manipulent des donn\u00e9es sensibles, interagissent avec le syst\u00e8me de fichiers, ex\u00e9cutent des commandes ou effectuent des requ\u00eates vers d\u2019autres services.<\/p>\n\n\n\n<p>Il est \u00e9galement important de pr\u00eater une attention particuli\u00e8re aux fonctionnalit\u00e9s jug\u00e9es complexes, mal document\u00e9es ou potentiellement probl\u00e9matiques dans leur impl\u00e9mentation. Pour guider efficacement cette analyse, l\u2019acc\u00e8s \u00e0 une documentation technique d\u00e9taill\u00e9e ou \u00e0 une cartographie de l\u2019architecture applicative est un v\u00e9ritable atout. Cela permet de mieux comprendre les flux de donn\u00e9es, les points d\u2019entr\u00e9e utilisateurs, les interactions entre modules, et donc d\u2019anticiper les vecteurs d\u2019attaque les plus probables.<\/p>\n\n\n\n<p>Suite \u00e0 cette phase pr\u00e9paratoire, l\u2019analyse du code peut commencer.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"audit-de-code-source-via-analyse-des-sources-et-des-sinks\">Audit de code source via analyse des \u00ab&nbsp;sources&nbsp;\u00bb et des \u00ab&nbsp;sinks&nbsp;\u00bb<\/h2>\n\n\n\n<p>Un audit de code source ne consiste pas \u00e0 examiner chaque ligne une \u00e0 une. Une telle approche serait inefficace, chronophage et contre-productive. L\u2019enjeu est de cibler les portions du code les plus sensibles, celles qui pr\u00e9sentent un risque pour la s\u00e9curit\u00e9 de l\u2019application.<\/p>\n\n\n\n<p>Pour ce faire, une des approches les plus courantes en audit de code consiste \u00e0 analyser les \u00ab\u00a0sources\u00a0\u00bb et les \u00ab\u00a0sinks\u00a0\u00bb, ainsi que les chemins qui les relient.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Une source repr\u00e9sente une donn\u00e9e en entr\u00e9e de l\u2019application, typiquement fournie par un utilisateur via un formulaire, une URL, un en-t\u00eate HTTP ou le corps d\u2019une requ\u00eate.<\/li>\n\n\n\n<li>Un sink, \u00e0 l\u2019inverse, d\u00e9signe un point du code o\u00f9 cette donn\u00e9e est utilis\u00e9e de fa\u00e7on potentiellement dangereuse : ex\u00e9cution d\u2019une commande syst\u00e8me, insertion dans une requ\u00eate SQL, rendu HTML non \u00e9chapp\u00e9, etc.<\/li>\n<\/ul>\n\n\n\n<p>L\u2019audit consiste alors \u00e0 tracer les chemins que parcourent les donn\u00e9es entre leur point d\u2019entr\u00e9e et leur point de sortie potentiellement vuln\u00e9rable. Ce travail permet d\u2019\u00e9valuer si des protections sont en place pour valider, filtrer ou transformer ces donn\u00e9es avant leur usage. Par exemple, une cha\u00eene de caract\u00e8res pass\u00e9e en param\u00e8tre pourrait \u00eatre nettoy\u00e9e pour supprimer les caract\u00e8res sp\u00e9ciaux, ou encod\u00e9e pour \u00e9viter toute interpr\u00e9tation ind\u00e9sirable.<\/p>\n\n\n\n<p>Le fait d\u2019avoir acc\u00e8s au code source permet de comprendre pr\u00e9cis\u00e9ment la logique de ces filtres. On peut ainsi d\u00e9couvrir qu\u2019un contr\u00f4le ne couvre pas tous les cas, qu\u2019un caract\u00e8re dangereux a \u00e9t\u00e9 oubli\u00e9, ou que le filtre est mal positionn\u00e9 dans la cha\u00eene de traitement. <\/p>\n\n\n\n<h3 class=\"wp-block-heading has-text-color has-link-color wp-elements-a8c6efe5d59e0430f3dd456be32027bb\" id=\"analyse-des-sources\" style=\"color:#c0b800\">Analyse des sources<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"comprendre-les-differentes-sources-de-donnees\">Comprendre les diff\u00e9rentes sources de donn\u00e9es<\/h4>\n\n\n\n<p>Les sources directes correspondent aux valeurs fournies directement par l\u2019utilisateur lors de son interaction avec l\u2019application. Elles peuvent \u00eatre transmises via l\u2019URL (segments du chemin, param\u00e8tres de requ\u00eate), les en-t\u00eates HTTP (comme les en-t\u00eates d\u2019autorisation, les en-t\u00eates sp\u00e9cifiques ou les cookies), ou dans le corps d\u2019une requ\u00eate.<\/p>\n\n\n\n<p>Il existe \u00e9galement des sources indirectes, souvent plus difficiles \u00e0 identifier. Par exemple, au lieu qu\u2019une valeur soit transmise directement \u00e0 un composant, le code peut la r\u00e9cup\u00e9rer depuis une base de donn\u00e9es. Cette donn\u00e9e pourrait avoir \u00e9t\u00e9 ins\u00e9r\u00e9e pr\u00e9alablement par l\u2019utilisateur via une autre fonctionnalit\u00e9. Une autre forme de source indirecte peut survenir lorsqu\u2019un serveur effectue une requ\u00eate \u00e0 un autre serveur et utilise sa r\u00e9ponse.<\/p>\n\n\n\n<p>En disposant d\u2019un contexte sur la source, comme l\u2019endroit o\u00f9 elle est utilis\u00e9e et son format, il devient possible d\u2019anticiper les vuln\u00e9rabilit\u00e9s potentielles li\u00e9es \u00e0 sa manipulation. Par exemple :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Si la source est un champ de commentaire sur un article de blog, une vuln\u00e9rabilit\u00e9 de type <a href=\"https:\/\/www.vaadata.com\/blog\/fr\/failles-xss-principes-types-dattaques-exploitations-et-bonnes-pratiques-securite\/\" target=\"_blank\" rel=\"noopener\" title=\"\">Cross-Site Scripting (XSS)<\/a> est probable.<\/li>\n\n\n\n<li>Si la source correspond \u00e0 un mod\u00e8le de g\u00e9n\u00e9ration d\u2019email, une <a href=\"https:\/\/www.vaadata.com\/blog\/fr\/vulnerabilite-web-server-side-template-injection-ssti-qu-est-ce-que-c-est-comment-s-en-proteger\/\" target=\"_blank\" rel=\"noopener\" title=\"\">injection de template c\u00f4t\u00e9 serveur (SSTI)<\/a> est envisageable.<\/li>\n\n\n\n<li>Et si la source repr\u00e9sente un identifiant de ressource, une vuln\u00e9rabilit\u00e9 de type <a href=\"https:\/\/www.vaadata.com\/blog\/fr\/failles-idor-principes-attaques-exploitations-mesures-tests-securite\/\" target=\"_blank\" rel=\"noopener\" title=\"\">Insecure Direct Object Reference (IDOR)<\/a> peut \u00eatre pr\u00e9sente.<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"suivre-les-flux-et-les-usages-dans-le-code\">Suivre les flux et les usages dans le code source<\/h4>\n\n\n\n<p>Une fois que le contexte autour de la source est suffisamment compris, l\u2019\u00e9tape suivante consiste \u00e0 suivre toutes les utilisations de cette source dans le code. Il faut relever comment la valeur est manipul\u00e9e, transform\u00e9e ou conditionn\u00e9e \u00e0 certains contextes. Il est \u00e9galement crucial de prendre en compte les interactions entre plusieurs sources. Par exemple, une source peut indiquer \u00e0 l\u2019application d\u2019appliquer une transformation sur une autre source.<\/p>\n\n\n\n<p>Enfin, certains chemins d&rsquo;ex\u00e9cution aboutissent \u00e0 un stockage de la donn\u00e9e dans un emplacement qui sera utilis\u00e9 ult\u00e9rieurement par un autre composant. Par exemple, une entr\u00e9e utilisateur peut \u00eatre enregistr\u00e9e en base de donn\u00e9es pour \u00eatre affich\u00e9e sur d&rsquo;autres pages. Cela cr\u00e9e une nouvelle source indirecte d\u00e9riv\u00e9e de la source initiale. Dans ce cas, les portions de code qui r\u00e9cup\u00e8rent cette donn\u00e9e stock\u00e9e deviennent un nouveau point de d\u00e9part pour une analyse approfondie.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"1024\" height=\"411\" src=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2025\/05\/code-source-audit-using-sources-1024x411.png\" alt=\"Analyse des sources\" class=\"wp-image-13526\" srcset=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2025\/05\/code-source-audit-using-sources-1024x411.png 1024w, https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2025\/05\/code-source-audit-using-sources-300x120.png 300w, https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2025\/05\/code-source-audit-using-sources-1536x617.png 1536w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"prioriser-les-analyses-en-fonction-des-risques\">Prioriser les analyses en fonction des risques<\/h4>\n\n\n\n<p>Cette approche permet de couvrir l\u2019ensemble de l\u2019application. Elle offre \u00e9galement la possibilit\u00e9 d\u2019identifier des sinks jusqu\u2019alors inconnus, notamment des fonctions potentiellement dangereuses issues de biblioth\u00e8ques tierces.<\/p>\n\n\n\n<p>Cependant, cette m\u00e9thode est particuli\u00e8rement chronophage, car tous les chemins analys\u00e9s ne d\u00e9bouchent pas n\u00e9cessairement sur des sinks pertinents ou exploitables. Il faut donc accepter une part d\u2019exploration peu fructueuse.<\/p>\n\n\n\n<p>Une fois que tous les chemins ont \u00e9t\u00e9 identifi\u00e9s et r\u00e9pertori\u00e9s, il devient possible de les classer en fonction du niveau de dangerosit\u00e9 des sinks atteints. Cette \u00e9tape permet de prioriser l\u2019analyse et les actions correctives en se concentrant sur les zones les plus sensibles du code.<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-text-color has-link-color wp-elements-d0c353d5cafd6dcdf2525d01fec02e8b\" id=\"audit-des-sinks\" style=\"color:#c0b800\">Audit des sinks<\/h3>\n\n\n\n<p>Cette m\u00e9thode adopte une approche inverse de la pr\u00e9c\u00e9dente : l\u2019analyse ne part plus des sources, mais directement des sinks. <\/p>\n\n\n\n<p>L\u2019int\u00e9r\u00eat est qu\u2019en ciblant d\u2019embl\u00e9e les points critiques du code, on peut interrompre l\u2019analyse d\u00e8s qu\u2019un filtre efficace est d\u00e9tect\u00e9, rendant l\u2019exploitation du sink impossible ou improbable.<\/p>\n\n\n\n<p>Pour identifier les sinks pr\u00e9sents dans l\u2019application, on peut rechercher dans le code des motifs connus comme dangereux, par exemple l\u2019usage de requ\u00eates SQL non pr\u00e9par\u00e9es ou de fonctions ex\u00e9cutant des commandes syst\u00e8me.<\/p>\n\n\n\n<p>Il existe des outils permettant d&rsquo;automatiser cette d\u00e9tection. <a href=\"https:\/\/github.com\/semgrep\/semgrep\" target=\"_blank\" rel=\"noopener\" title=\"\">Semgrep<\/a>, par exemple, permet d\u2019identifier l\u2019utilisation de m\u00e9thodes sensibles. Toutefois, il s\u2019appuie sur des mod\u00e8les cr\u00e9\u00e9s par d\u2019autres utilisateurs, ce qui pr\u00e9sente plusieurs limites.<\/p>\n\n\n\n<p>Certains sinks \u00e9vidents peuvent ne pas \u00eatre d\u00e9tect\u00e9s, et inversement, l\u2019outil peut g\u00e9n\u00e9rer de nombreuses fausses alertes sur des mod\u00e8les inoffensifs. Ce ph\u00e9nom\u00e8ne, connu sous le nom de fatigue d\u2019alerte, peut entra\u00eener une lassitude et un d\u00e9sengagement des d\u00e9veloppeurs face aux rapports de s\u00e9curit\u00e9.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"1024\" height=\"314\" src=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2025\/05\/code-source-analysis-using-sinks-1024x314.png\" alt=\"Audit des sinks\" class=\"wp-image-13532\" srcset=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2025\/05\/code-source-analysis-using-sinks-1024x314.png 1024w, https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2025\/05\/code-source-analysis-using-sinks-300x92.png 300w, https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2025\/05\/code-source-analysis-using-sinks-1536x471.png 1536w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Il est possible de cr\u00e9er des r\u00e8gles personnalis\u00e9es pour renforcer la s\u00e9curit\u00e9 du code. Par exemple, une r\u00e8gle peut imposer que toutes les routes d\u2019une application soient prot\u00e9g\u00e9es par des m\u00e9canismes d\u2019authentification et d\u2019autorisation.<\/p>\n\n\n\n<p>Comme pour l\u2019analyse orient\u00e9e sources, un sink peut \u00eatre indirectement influenc\u00e9 par une donn\u00e9e utilisateur. Si la valeur transmise \u00e0 un sink provient d\u2019une base de donn\u00e9es, alors toute insertion pass\u00e9e dans cette base devient un nouveau point d\u2019entr\u00e9e potentiel, \u00e0 explorer comme un sink \u00e0 part enti\u00e8re.<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-text-color has-link-color wp-elements-acdff945e52e73f2cb32fd5310ca474c\" id=\"quelle-approche-choisir-entre-analyse-des-sources-et-audit-des-sinks\" style=\"color:#c0b800\">Quelle approche choisir entre analyse des sources et audit des sinks ?<\/h3>\n\n\n\n<p>Chaque m\u00e9thode pr\u00e9sente ses avantages et ses limites. L\u2019analyse orient\u00e9e sources g\u00e9n\u00e8re souvent un grand nombre de chemins \u00e0 examiner, mais elle permet une meilleure couverture des sinks pr\u00e9sents dans l\u2019application. <\/p>\n\n\n\n<p>\u00c0 l\u2019inverse, l\u2019approche par les sinks est plus rapide et permet de r\u00e9duire le nombre de chemins \u00e0 analyser, car on peut stopper l\u2019exploration d\u00e8s qu\u2019un filtre rend la donn\u00e9e inoffensive.<\/p>\n\n\n\n<p>En pratique, un audit de code source efficace combine les deux approches afin de b\u00e9n\u00e9ficier \u00e0 la fois de la pr\u00e9cision de l\u2019analyse orient\u00e9e sinks et de l\u2019exhaustivit\u00e9 de l\u2019analyse orient\u00e9e sources.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"revue-des-implementations-securite-dans-le-code-source\">Revue des impl\u00e9mentations s\u00e9curit\u00e9 dans le code source<\/h2>\n\n\n\n<p>Une fois qu\u2019un chemin entre une source et un sink a \u00e9t\u00e9 identifi\u00e9, l\u2019\u00e9tape suivante consiste \u00e0 v\u00e9rifier que la valeur transite de fonction en fonction sans \u00eatre alt\u00e9r\u00e9e de mani\u00e8re \u00e0 emp\u00eacher l\u2019exploitation du sink.<\/p>\n\n\n\n<p>Tout au long de ce parcours, la donn\u00e9e peut traverser des filtres ou des transformateurs. Un filtre peut, par exemple, bloquer certains caract\u00e8res, tandis qu\u2019un transformateur peut accepter la valeur mais supprimer les \u00e9l\u00e9ments consid\u00e9r\u00e9s comme invalides. <\/p>\n\n\n\n<p>L\u2019objectif est donc de documenter toutes les transformations subies par la donn\u00e9e, afin de pouvoir construire une entr\u00e9e qui franchisse chaque \u00e9tape du traitement tout en conservant la capacit\u00e9 d\u2019exploiter le sink final.<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-text-color has-link-color wp-elements-55eafb1dd07d178b3257ee969a658066\" id=\"analyse-des-listes-dinterdiction-deny-lists-ou-listes-noires\" style=\"color:#c0b800\">Analyse des listes d\u2019interdiction (deny lists ou listes noires)<\/h3>\n\n\n\n<p>Une strat\u00e9gie de filtrage bas\u00e9e sur une liste d\u2019interdictions<strong> <\/strong>consiste \u00e0 bloquer une valeur si elle pr\u00e9sente certaines caract\u00e9ristiques ou si elle appartient \u00e0 une liste explicite d\u2019\u00e9l\u00e9ments interdits. <\/p>\n\n\n\n<p>Par exemple, un code peut tenter de d\u00e9tecter la pr\u00e9sence de caract\u00e8res non valides dans une cha\u00eene avant de proc\u00e9der \u00e0 son insertion.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"1024\" height=\"291\" src=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2025\/05\/deny-lists-source-code-1024x291.png\" alt=\"\" class=\"wp-image-13540\" srcset=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2025\/05\/deny-lists-source-code-1024x291.png 1024w, https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2025\/05\/deny-lists-source-code-300x85.png 300w, https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2025\/05\/deny-lists-source-code-1536x437.png 1536w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Cependant, tous les filtres ne se valent pas. Un filtre fond\u00e9 sur une liste de valeurs interdites est souvent consid\u00e9r\u00e9 comme faible, car il ne bloque que les \u00e9l\u00e9ments explicitement connus comme dangereux. <\/p>\n\n\n\n<p>Des cas peuvent avoir \u00e9t\u00e9 oubli\u00e9s ou tout simplement m\u00e9connus, ce qui laisse une marge importante \u00e0 un attaquant pour introduire des valeurs inattendues capables d\u2019alt\u00e9rer le comportement du programme. <\/p>\n\n\n\n<p>Par exemple, le caract\u00e8re antislash (<code>\\<\/code>) ajout\u00e9 en fin de cha\u00eene peut permettre d\u2019\u00e9chapper une apostrophe. Avec MariaDB, si une autre propri\u00e9t\u00e9 manipulable intervient ensuite dans la requ\u00eate, cela pourrait \u00eatre exploit\u00e9 pour ex\u00e9cuter des requ\u00eates SQL arbitraires.<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-text-color has-link-color wp-elements-235fdf23661a769ee22cf770a979ddf9\" id=\"analyse-des-listes-dautorisation-allow-lists-ou-listes-blanches\" style=\"color:#c0b800\">Analyse des listes d&rsquo;autorisation (allow lists ou listes blanches)<\/h3>\n\n\n\n<p>Une strat\u00e9gie bas\u00e9e sur une liste d\u2019autorisations consiste \u00e0 n\u2019accepter que certaines valeurs sp\u00e9cifiques. Ce type de filtre est g\u00e9n\u00e9ralement consid\u00e9r\u00e9 comme plus robuste, car l\u2019ensemble des valeurs autoris\u00e9es est d\u00e9fini \u00e0 l\u2019avance, ce qui facilite leur revue et limite les comportements inattendus.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"1024\" height=\"209\" src=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2025\/05\/allow-lists-source-code-1024x209.png\" alt=\"\" class=\"wp-image-13544\" srcset=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2025\/05\/allow-lists-source-code-1024x209.png 1024w, https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2025\/05\/allow-lists-source-code-300x61.png 300w, https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2025\/05\/allow-lists-source-code-1536x314.png 1536w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Adopter une telle approche renforce significativement la s\u00e9curit\u00e9, en r\u00e9duisant consid\u00e9rablement les possibilit\u00e9s d\u2019attaque. Par exemple, en l\u2019absence d\u2019un filtre ad\u00e9quat, un attaquant pourrait injecter des caract\u00e8res sp\u00e9ciaux pour ex\u00e9cuter des sous-commandes et ainsi obtenir une ex\u00e9cution de code arbitraire sur le service cibl\u00e9.<\/p>\n\n\n\n<p>Cependant, m\u00eame une strat\u00e9gie bas\u00e9e sur une liste d\u2019autorisation n\u2019est pas infaillible. Dans l\u2019exemple \u00e9voqu\u00e9, le param\u00e8tre <code>\"host\"<\/code> reste interpr\u00e9t\u00e9 par le programme. Le filtre en place autorise l\u2019utilisation du tiret (<code>-<\/code>) en d\u00e9but de valeur, ce qui peut \u00eatre d\u00e9tourn\u00e9 pour injecter des arguments suppl\u00e9mentaires dans la commande et contourner les protections.<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-text-color has-link-color wp-elements-b3f54350dc3bbcfaa47888fa0d0642a4\" id=\"neutralisation\" style=\"color:#c0b800\">Neutralisation<\/h3>\n\n\n\n<p>Les filtres doivent \u00eatre appliqu\u00e9s lorsque la valeur peut atteindre un sink capable de l\u2019interpr\u00e9ter de mani\u00e8re dangereuse. Cependant, la meilleure solution reste d\u2019\u00e9viter d\u2019avoir des sinks dangereux d\u00e8s le d\u00e9part.<\/p>\n\n\n\n<p>Il existe souvent des alternatives plus s\u00fbres aux m\u00e9thodes \u00e0 risque, permettant de garantir que la valeur transmise ne sera pas utilis\u00e9e de fa\u00e7on sp\u00e9ciale ou malveillante. Les d\u00e9veloppeurs devraient privil\u00e9gier l\u2019usage de m\u00e9thodes s\u00e9curis\u00e9es plut\u00f4t que d\u2019ajouter des filtres par-dessus des m\u00e9thodes intrins\u00e8quement dangereuses.<\/p>\n\n\n\n<p>Par exemple, dans les cas \u00e9voqu\u00e9s pr\u00e9c\u00e9demment, il est pr\u00e9f\u00e9rable d\u2019utiliser des requ\u00eates SQL pr\u00e9par\u00e9es plut\u00f4t que des requ\u00eates brutes. Dans un autre cas, il vaut mieux utiliser une m\u00e9thode qui n\u2019ex\u00e9cute pas la commande via un shell, et, si possible, recourir au s\u00e9parateur d\u2019options de fin de commande pour \u00e9viter toute interpr\u00e9tation ind\u00e9sirable.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"1024\" height=\"182\" src=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2025\/05\/neutralization-source-code-1024x182.png\" alt=\"\" class=\"wp-image-13548\" srcset=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2025\/05\/neutralization-source-code-1024x182.png 1024w, https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2025\/05\/neutralization-source-code-300x53.png 300w, https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2025\/05\/neutralization-source-code-1536x273.png 1536w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>La neutralisation consiste donc \u00e0 s\u2019assurer que la valeur n\u2019est pas trait\u00e9e avec une signification particuli\u00e8re susceptible d\u2019\u00eatre exploit\u00e9e.<\/p>\n\n\n\n<p>Plusieurs mesures de protection peuvent \u00eatre mises en place sur le chemin menant \u00e0 sink. La meilleure pratique pour les d\u00e9veloppeurs est de toujours placer les contre-mesures les plus robustes le plus pr\u00e8s possible du sink.<\/p>\n\n\n\n<p>Par exemple, dans une m\u00eame fonction, il est conseill\u00e9 d\u2019appliquer les filtres juste avant l\u2019appel au sink dangereux. Cela facilite l\u2019analyse du code source, car cela garantit que tous les chemins menant au sink passent obligatoirement par ces filtres. <\/p>\n\n\n\n<p>En revanche, si les filtres sont plac\u00e9s trop en amont, pr\u00e8s de la source, il existe un risque que de nouveaux chemins vers le sink apparaissent sans passer par ces protections.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"analyse-des-dependances\">Analyse des d\u00e9pendances<\/h2>\n\n\n\n<p>Des alertes de s\u00e9curit\u00e9 peuvent \u00eatre publi\u00e9es lorsqu\u2019une vuln\u00e9rabilit\u00e9 est d\u00e9couverte dans une biblioth\u00e8que. Une vuln\u00e9rabilit\u00e9 est souvent signal\u00e9e lorsqu\u2019une fonctionnalit\u00e9 cens\u00e9e \u00eatre s\u00e9curis\u00e9e peut \u00eatre exploit\u00e9e de mani\u00e8re inattendue. <\/p>\n\n\n\n<p>Cependant, si la biblioth\u00e8que est con\u00e7ue pour fournir des m\u00e9thodes non s\u00e9curis\u00e9es, il est possible qu\u2019aucune CVE ne soit publi\u00e9e \u00e0 son sujet.<\/p>\n\n\n\n<p>Il est donc important d\u2019examiner les d\u00e9pendances utilis\u00e9es par l\u2019application afin d\u2019identifier si l\u2019une d\u2019entre elles propose des m\u00e9thodes dangereuses, comme l\u2019ex\u00e9cution de requ\u00eates SQL brutes ou l\u2019acc\u00e8s \u00e0 des fichiers locaux. Ces m\u00e9thodes \u00e0 risque doivent \u00eatre int\u00e9gr\u00e9es \u00e0 la liste des sinks \u00e0 analyser.<\/p>\n\n\n\n<p>Dans certains cas, des contre-mesures sont mises en \u0153uvre via des fonctions utilitaires fournies par des biblioth\u00e8ques tierces. Par exemple, une fonctionnalit\u00e9 d&rsquo;upload de fichiers peut utiliser une fonction externe pour d\u00e9terminer le type du fichier. <\/p>\n\n\n\n<p>Pour s\u2019assurer qu\u2019un filtre emp\u00eache effectivement d\u2019atteindre un sink, il peut \u00eatre n\u00e9cessaire d\u2019analyser le code de ces biblioth\u00e8ques afin de v\u00e9rifier si des valeurs sp\u00e9ciales, non anticip\u00e9es par les d\u00e9veloppeurs, peuvent \u00eatre exploit\u00e9es.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"exemples-de-vulnerabilites-identifiees-lors-dun-audit-de-code-source-dune-application-web\">Exemples de vuln\u00e9rabilit\u00e9s identifi\u00e9es lors d\u2019un audit de code source d&rsquo;une application web<\/h2>\n\n\n\n<p>Dans le cas le plus simple, la source et le sink sont proches l\u2019un de l\u2019autre. Cependant, la plupart des situations sont plus complexes et impliquent un flux de donn\u00e9es passant par plusieurs fonctions et plusieurs fichiers.<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-text-color has-link-color wp-elements-3901cefd0404b6457dcf00b9b5fa9b6b\" id=\"mass-assignment\" style=\"color:#c0b800\">Mass Assignment<\/h3>\n\n\n\n<p>Les vuln\u00e9rabilit\u00e9s de type <a href=\"https:\/\/www.vaadata.com\/blog\/fr\/mass-assignment-principes-attaques-et-bonnes-pratiques-securite\/\" target=\"_blank\" rel=\"noopener\" title=\"\">mass assignment<\/a> apparaissent souvent dans les applications o\u00f9 les utilisateurs peuvent modifier leur profil.<\/p>\n\n\n\n<p>L\u2019application utilise alors toutes les propri\u00e9t\u00e9s re\u00e7ues et les enregistre en base de donn\u00e9es, sans v\u00e9rifier pr\u00e9cis\u00e9ment quels champs sont modifi\u00e9s.<\/p>\n\n\n\n<p>Souvent, l\u2019application ne contr\u00f4le que l\u2019autorisation de modifier l\u2019utilisateur lui-m\u00eame, ce qui signifie que modifier l\u2019utilisateur courant est autoris\u00e9, mais cela ne garantit pas que les champs modifi\u00e9s le soient \u00e9galement.<\/p>\n\n\n\n<p>Dans certains cas, cela peut m\u00eame permettre d\u2019\u00e9crire des propri\u00e9t\u00e9s ou des objets li\u00e9s de mani\u00e8re non d\u00e9sir\u00e9e.<\/p>\n\n\n\n<p>Lors de l\u2019analyse du code source de l\u2019application, il est important d\u2019identifier tous les points d\u2019entr\u00e9e. On peut commencer par examiner le routeur de l\u2019application.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"1024\" height=\"352\" src=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2025\/05\/mass-assignment-source-code-1024x352.png\" alt=\"\" class=\"wp-image-13556\" srcset=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2025\/05\/mass-assignment-source-code-1024x352.png 1024w, https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2025\/05\/mass-assignment-source-code-300x103.png 300w, https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2025\/05\/mass-assignment-source-code-1536x527.png 1536w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Le param\u00e8tre \u00ab request \u00bb constitue la source \u00e0 analyser. On remarque dans les lignes suivantes que cette valeur est utilis\u00e9e dans une comparaison avant d\u2019\u00eatre pass\u00e9e \u00e0 une fonction, ce qui permet de poursuivre l\u2019analyse dans cette fonction.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"1024\" height=\"387\" src=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2025\/05\/detecting-mass-assignment-source-code-1024x387.png\" alt=\"\" class=\"wp-image-13558\" srcset=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2025\/05\/detecting-mass-assignment-source-code-1024x387.png 1024w, https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2025\/05\/detecting-mass-assignment-source-code-300x113.png 300w, https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2025\/05\/detecting-mass-assignment-source-code-1536x581.png 1536w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Dans la fonction finale, on observe que la valeur contr\u00f4l\u00e9e par l\u2019utilisateur atteint la m\u00e9thode \u00ab save \u00bb. Nous disposons ainsi d\u2019un chemin complet entre la source et le sink.<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-text-color has-link-color wp-elements-7700797f0b6a2f1209eee7ade1f70d58\" id=\"file-path-traversal\" style=\"color:#c0b800\">File Path Traversal<\/h3>\n\n\n\n<p>Il arrive parfois que des d\u00e9veloppeurs cherchent \u00e0 simplifier le processus et, au lieu de cr\u00e9er une couche d\u2019indirection s\u00e9curis\u00e9e, laissent les utilisateurs sp\u00e9cifier directement le chemin du fichier qu\u2019ils souhaitent acc\u00e9der.<\/p>\n\n\n\n<p>Lors de l\u2019analyse des sinks de l\u2019application, on cherche \u00e0 identifier toutes les fonctions dangereuses susceptibles d\u2019\u00eatre appel\u00e9es. Par exemple, on peut commencer par rechercher les appels \u00e0 la fonction <code>file_get_contents<\/code> dans le code de l\u2019application.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"1024\" height=\"280\" src=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2025\/05\/file-path-traversal-1024x280.png\" alt=\"\" class=\"wp-image-13560\" srcset=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2025\/05\/file-path-traversal-1024x280.png 1024w, https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2025\/05\/file-path-traversal-300x82.png 300w, https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2025\/05\/file-path-traversal-1536x420.png 1536w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>On remarque que cette fonction est utilis\u00e9e dans la fonction <code>read_from_storage<\/code> . La source de cette fonction passe par une mesure de s\u00e9curit\u00e9 qui ajoute un dossier au d\u00e9but du chemin du fichier. Malheureusement, cette mesure est insuffisante, et un attaquant pourrait exploiter une vuln\u00e9rabilit\u00e9 de type <a href=\"https:\/\/www.vaadata.com\/blog\/fr\/comprendre-se-proteger-vulnerabilite-path-traversal\/\" target=\"_blank\" rel=\"noopener\" title=\"\">path traversal<\/a> pour acc\u00e9der \u00e0 n\u2019importe quel fichier du serveur.<\/p>\n\n\n\n<p>Les \u00e9tapes suivantes consistent \u00e0 consid\u00e9rer cette fonction comme un sink et \u00e0 rechercher toutes ses utilisations dans le code de l\u2019application.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"1024\" height=\"379\" src=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2025\/05\/file-path-traversal-2-1024x379.png\" alt=\"\" class=\"wp-image-13562\" srcset=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2025\/05\/file-path-traversal-2-1024x379.png 1024w, https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2025\/05\/file-path-traversal-2-300x111.png 300w, https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2025\/05\/file-path-traversal-2-1536x569.png 1536w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Enfin, on constate que la cha\u00eene compl\u00e8te est pr\u00e9sente : il est possible de fournir le param\u00e8tre de requ\u00eate \u00ab file \u00bb (source) pour atteindre la fonction \u00ab file_get_contents \u00bb (sink) et lire le contenu du fichier.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"conclusion\">Conclusion<\/h2>\n\n\n\n<p>\u00c9tant donn\u00e9 que les audits de code source sont limit\u00e9s dans le temps, diff\u00e9rentes strat\u00e9gies sont utilis\u00e9es pour effectuer une analyse plus efficace. <\/p>\n\n\n\n<p>L&rsquo;utilisation d&rsquo;une strat\u00e9gie source-sink permet d&rsquo;identifier les chemins dans le code qui peuvent \u00eatre compromis par un attaquant ou les contre-mesures mises en \u0153uvre pour prot\u00e9ger un sink. De cette fa\u00e7on, un auditeur peut se concentrer sur les lignes les plus pertinentes de l&rsquo;application.<\/p>\n\n\n\n<p>M\u00eame s&rsquo;il existe des outils pour aider \u00e0 la d\u00e9couverte des sinks, ces derniers ne sont pas encore assez aboutis pour identifier tous les cas. Ils peuvent toutefois \u00eatre int\u00e9gr\u00e9s dans les cycles de d\u00e9veloppement afin de sensibiliser les d\u00e9veloppeurs aux mod\u00e8les susceptibles d&rsquo;\u00eatre exploit\u00e9s par des attaquants. Quoi qu&rsquo;il en soit, les outils automatis\u00e9s ne sont pas encore pr\u00eats \u00e0 remplacer l&rsquo;analyse manuelle.<\/p>\n\n\n\n<p><strong>Auteur : Arnaud PASCAL &#8211; Pentester @Vaadata<\/strong><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Dans le cycle de d\u00e9veloppement d\u2019une application web, la s\u00e9curit\u00e9 ne doit jamais \u00eatre rel\u00e9gu\u00e9e au second plan. Elle s\u2019invite \u00e0 chaque \u00e9tape : d\u00e8s la phase de conception, lors des choix d\u2019architecture, tout au long du d\u00e9veloppement, mais aussi apr\u00e8s le d\u00e9ploiement, au travers de tests continus.<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[13],"tags":[],"class_list":{"0":"post-13514","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-solutions-fr"},"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.vaadata.com\/blog\/fr\/wp-json\/wp\/v2\/posts\/13514","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.vaadata.com\/blog\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.vaadata.com\/blog\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.vaadata.com\/blog\/fr\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.vaadata.com\/blog\/fr\/wp-json\/wp\/v2\/comments?post=13514"}],"version-history":[{"count":35,"href":"https:\/\/www.vaadata.com\/blog\/fr\/wp-json\/wp\/v2\/posts\/13514\/revisions"}],"predecessor-version":[{"id":14795,"href":"https:\/\/www.vaadata.com\/blog\/fr\/wp-json\/wp\/v2\/posts\/13514\/revisions\/14795"}],"wp:attachment":[{"href":"https:\/\/www.vaadata.com\/blog\/fr\/wp-json\/wp\/v2\/media?parent=13514"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.vaadata.com\/blog\/fr\/wp-json\/wp\/v2\/categories?post=13514"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.vaadata.com\/blog\/fr\/wp-json\/wp\/v2\/tags?post=13514"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}