{"id":5559,"date":"2025-07-24T14:49:59","date_gmt":"2025-07-24T14:49:59","guid":{"rendered":"https:\/\/techhub.saworks.io\/docs\/tutoriel-github\/securite-avancee-sur-github-partie-2-sur-2\/executer-codeql-sur-une-base-de-donnees\/"},"modified":"2025-07-31T14:02:20","modified_gmt":"2025-07-31T14:02:20","slug":"executer-codeql-sur-une-base-de-donnees","status":"publish","type":"docs","link":"https:\/\/techhub.saworks.io\/fr\/docs\/tutoriel-github\/securite-avancee-sur-github-partie-2-sur-2\/executer-codeql-sur-une-base-de-donnees\/","title":{"rendered":"Ex\u00e9cuter CodeQL sur une base de donn\u00e9es"},"content":{"rendered":"\n<div class=\"wp-block-group is-layout-constrained wp-block-group-is-layout-constrained\">\n<p>Une fois votre code extrait dans une base de donn\u00e9es, vous pouvez l\u2019analyser \u00e0 l\u2019aide de requ\u00eates&nbsp;<strong>CodeQL<\/strong>. Les requ\u00eates par d\u00e9faut sont \u00e9crites et maintenues par des experts GitHub, des chercheurs en s\u00e9curit\u00e9 et des contributeurs de la communaut\u00e9. Vous pouvez \u00e9galement \u00e9crire vos propres requ\u00eates.<\/p>\n\n\n\n<p>Les requ\u00eates CodeQL sont utilis\u00e9es dans l\u2019analyse de code pour d\u00e9tecter des probl\u00e8mes dans votre code source, y compris des vuln\u00e9rabilit\u00e9s potentielles. Vous pouvez aussi \u00e9crire des requ\u00eates personnalis\u00e9es pour identifier des probl\u00e8mes sp\u00e9cifiques \u00e0 chaque langage utilis\u00e9 dans votre projet.<\/p>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Il existe deux types importants de requ\u00eates :<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Requ\u00eates d\u2019alerte<\/strong>&nbsp;: elles mettent en \u00e9vidence des probl\u00e8mes \u00e0 des emplacements pr\u00e9cis dans votre code.<\/li>\n\n\n\n<li><strong>Requ\u00eates de chemin (path queries)<\/strong>&nbsp;: elles d\u00e9crivent le flux d\u2019informations entre une source et une cible (sink) dans votre code.<\/li>\n<\/ul>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Requ\u00eate CodeQL simple<\/h3>\n\n\n\n<p>La structure de base d\u2019une requ\u00eate CodeQL est enregistr\u00e9e dans un fichier avec l\u2019extension&nbsp;<strong><code>.ql<\/code><\/strong>&nbsp;et contient une clause&nbsp;<strong><code>select<\/code><\/strong>. Voici un exemple de structure de requ\u00eate :<\/p>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.75rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#EEFFFF;--cbp-line-number-width:calc(2 * 0.6 * .75rem);line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#212121\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#EEFFFF;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>\/**\n *\n * Query metadata\n *\n *\/\nimport \/* ... CodeQL libraries or modules ... *\/\n\/* ... Optional, define CodeQL classes and predicates ... *\/\nfrom \/* ... variable declarations ... \/\nwhere \/ ... logical formula ... \/\nselect \/ ... expressions ... *\/<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki material-theme-darker\" style=\"background-color: #212121\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #FFCB6B\">\/**<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #FFCB6B\">*<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #FFCB6B\">*<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #C3E88D\">Query<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #C3E88D\">metadata<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #FFCB6B\">*<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #FFCB6B\">*\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #FFCB6B\">import<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #C3E88D\">\/<\/span><span style=\"color: #EEFFFF\">*<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #C3E88D\">...<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #C3E88D\">CodeQL<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #C3E88D\">libraries<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #C3E88D\">or<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #C3E88D\">modules<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #C3E88D\">...<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #EEFFFF\">*<\/span><span style=\"color: #C3E88D\">\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #FFCB6B\">\/*<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #C3E88D\">...<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #C3E88D\">Optional,<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #C3E88D\">define<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #C3E88D\">CodeQL<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #C3E88D\">classes<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #C3E88D\">and<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #C3E88D\">predicates<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #C3E88D\">...<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #EEFFFF\">*<\/span><span style=\"color: #C3E88D\">\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #FFCB6B\">from<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #C3E88D\">\/<\/span><span style=\"color: #EEFFFF\">*<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #C3E88D\">...<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #C3E88D\">variable<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #C3E88D\">declarations<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #C3E88D\">...<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #C3E88D\">\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #FFCB6B\">where<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #C3E88D\">\/<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #C3E88D\">...<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #C3E88D\">logical<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #C3E88D\">formula<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #C3E88D\">...<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #C3E88D\">\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF; font-style: italic\">select<\/span><span style=\"color: #EEFFFF\"> \/ ... expressions ... <\/span><span style=\"color: #89DDFF\">*<\/span><span style=\"color: #EEFFFF\">\/<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">M\u00e9tadonn\u00e9es de requ\u00eate<\/h3>\n\n\n\n<p>L&rsquo;utilisation de CodeQL avec l\u2019analyse de code (code scanning) transforme les r\u00e9sultats de mani\u00e8re \u00e0 mettre en \u00e9vidence les probl\u00e8mes potentiels que les requ\u00eates sont con\u00e7ues pour d\u00e9tecter. Les requ\u00eates contiennent des&nbsp;<strong>propri\u00e9t\u00e9s de m\u00e9tadonn\u00e9es<\/strong>&nbsp;qui indiquent comment interpr\u00e9ter les r\u00e9sultats. Les m\u00e9tadonn\u00e9es de requ\u00eate permettent de :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Identifier vos requ\u00eates personnalis\u00e9es lorsque vous les ajoutez \u00e0 votre d\u00e9p\u00f4t GitHub.<\/li>\n\n\n\n<li>Fournir des informations sur l\u2019objectif de la requ\u00eate.<\/li>\n<\/ul>\n\n\n\n<p>Les m\u00e9tadonn\u00e9es peuvent inclure :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>une&nbsp;<strong>description<\/strong>&nbsp;de la requ\u00eate,<\/li>\n\n\n\n<li>un&nbsp;<strong>identifiant unique<\/strong>,<\/li>\n\n\n\n<li>le&nbsp;<strong>type de probl\u00e8me<\/strong>&nbsp;d\u00e9tect\u00e9 (alerte ou chemin).<\/li>\n<\/ul>\n\n\n\n<p>Les m\u00e9tadonn\u00e9es sp\u00e9cifient \u00e9galement comment interpr\u00e9ter et afficher les r\u00e9sultats de la requ\u00eate.<\/p>\n\n\n\n<p>GitHub propose un&nbsp;<strong>guide de style recommand\u00e9<\/strong>&nbsp;pour les m\u00e9tadonn\u00e9es de requ\u00eate. Vous pouvez le consulter dans la documentation de CodeQL.<\/p>\n\n\n\n<p>Voici un exemple de m\u00e9tadonn\u00e9es pour l\u2019une des requ\u00eates standard en Java :<\/p>\n\n\n\n<p><em>(L\u2019exemple n\u2019\u00e9tait pas inclus dans votre message. Souhaitez-vous que je vous en montre un ?)<\/em><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"857\" height=\"348\" data-src=\"https:\/\/techhub.saworks.io\/wp-content\/uploads\/2025\/07\/query-metadata.png\" alt=\"\" class=\"wp-image-5562 lazyload\" data-srcset=\"https:\/\/techhub.saworks.io\/wp-content\/uploads\/2025\/07\/query-metadata.png 857w, https:\/\/techhub.saworks.io\/wp-content\/uploads\/2025\/07\/query-metadata-300x122.png 300w, https:\/\/techhub.saworks.io\/wp-content\/uploads\/2025\/07\/query-metadata-768x312.png 768w\" data-sizes=\"(max-width: 857px) 100vw, 857px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 857px; --smush-placeholder-aspect-ratio: 857\/348;\" \/><\/figure>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">CodeQL n\u2019interpr\u00e8te pas les requ\u00eates sans m\u00e9tadonn\u00e9es<\/h3>\n\n\n\n<p>Les requ\u00eates qui ne contiennent pas de m\u00e9tadonn\u00e9es ne sont pas interpr\u00e9t\u00e9es par CodeQL. Les r\u00e9sultats sont alors affich\u00e9s sous forme de tableau, sans mise en \u00e9vidence dans le code source.<\/p>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Syntaxe QL<\/h3>\n\n\n\n<p><strong>QL<\/strong>&nbsp;est un langage de requ\u00eate d\u00e9claratif et orient\u00e9 objet. Il est optimis\u00e9 pour permettre une analyse efficace des structures de donn\u00e9es hi\u00e9rarchiques, en particulier les bases de donn\u00e9es repr\u00e9sentant des artefacts logiciels.<\/p>\n\n\n\n<p>La syntaxe de QL est similaire \u00e0 celle de&nbsp;<strong>SQL<\/strong>, mais sa s\u00e9mantique repose sur&nbsp;<strong>Datalog<\/strong>, un langage de programmation logique d\u00e9claratif souvent utilis\u00e9 comme langage de requ\u00eate. \u00c9tant un langage logique, toutes les op\u00e9rations en QL sont des op\u00e9rations logiques. QL h\u00e9rite \u00e9galement des&nbsp;<strong>pr\u00e9dicats r\u00e9cursifs<\/strong>&nbsp;de Datalog et ajoute la prise en charge des&nbsp;<strong>agr\u00e9gats<\/strong>&nbsp;pour rendre les requ\u00eates complexes plus concises et simples.<\/p>\n\n\n\n<p>Le langage QL est compos\u00e9 de&nbsp;<strong>formules logiques<\/strong>. Il utilise des connecteurs logiques courants comme&nbsp;<code>and<\/code>,&nbsp;<code>or<\/code>,&nbsp;<code>not<\/code>, ainsi que des quantificateurs comme&nbsp;<code>forall<\/code>&nbsp;et&nbsp;<code>exists<\/code>. Gr\u00e2ce aux pr\u00e9dicats r\u00e9cursifs, vous pouvez \u00e9crire des requ\u00eates r\u00e9cursives complexes en utilisant la syntaxe de base de QL et des agr\u00e9gats comme&nbsp;<code>count<\/code>,&nbsp;<code>sum<\/code>&nbsp;et&nbsp;<code>average<\/code>.<\/p>\n\n\n\n<p>Pour plus d\u2019informations sur le langage QL, consultez la documentation de CodeQL.<\/p>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Requ\u00eates de chemin (Path Queries)<\/h3>\n\n\n\n<p>Le&nbsp;<strong>flux d\u2019information<\/strong>&nbsp;dans un programme est crucial. Des donn\u00e9es apparemment inoffensives peuvent circuler de mani\u00e8re inattendue et \u00eatre utilis\u00e9es de fa\u00e7on malveillante.<\/p>\n\n\n\n<p>Les&nbsp;<strong>requ\u00eates de chemin<\/strong>&nbsp;permettent de visualiser ce flux d\u2019information dans une base de code. Une requ\u00eate peut suivre le chemin que prennent les donn\u00e9es depuis leurs&nbsp;<strong>points de d\u00e9part possibles (sources)<\/strong>&nbsp;jusqu\u2019\u00e0 leurs&nbsp;<strong>points d\u2019arriv\u00e9e possibles (sinks)<\/strong>. Pour mod\u00e9liser ces chemins, votre requ\u00eate doit d\u00e9finir :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>une&nbsp;<strong>source<\/strong>,<\/li>\n\n\n\n<li>un&nbsp;<strong>sink<\/strong>,<\/li>\n\n\n\n<li>les&nbsp;<strong>\u00e9tapes de flux de donn\u00e9es<\/strong>&nbsp;qui les relient.<\/li>\n<\/ul>\n\n\n\n<p>Le moyen le plus simple de commencer \u00e0 \u00e9crire une requ\u00eate de chemin est d\u2019utiliser une requ\u00eate existante comme mod\u00e8le. Pour obtenir ces requ\u00eates selon les langages pris en charge, consultez la documentation de CodeQL.<\/p>\n\n\n\n<p>Votre requ\u00eate de chemin doit inclure certaines&nbsp;<strong>m\u00e9tadonn\u00e9es<\/strong>, des&nbsp;<strong>pr\u00e9dicats de requ\u00eate<\/strong>, et une&nbsp;<strong>structure d\u2019instruction&nbsp;<code>select<\/code><\/strong>. La plupart des requ\u00eates de chemin int\u00e9gr\u00e9es dans CodeQL suivent une structure de base, qui d\u00e9pend de la mani\u00e8re dont CodeQL mod\u00e9lise le langage analys\u00e9.<\/p>\n\n\n\n<p>Voici un exemple de&nbsp;<strong>mod\u00e8le de requ\u00eate de chemin<\/strong>&nbsp;:<\/p>\n\n\n\n<p><em>(L\u2019exemple de code suit g\u00e9n\u00e9ralement ce paragraphe dans la documentation.)<\/em><\/p>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.75rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#EEFFFF;--cbp-line-number-width:calc(2 * 0.6 * .75rem);line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#212121\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#EEFFFF;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>\/**\n * ...\n * @kind path-problem\n * ...\n *\/\n\nimport &lt;language>\n\/\/ For some languages (Java\/C++\/Python\/Swift), you need to explicitly import the data-flow library, such as\n\/\/ import semmle.code.java.dataflow.DataFlow or import codeql.swift.dataflow.DataFlow\n...\n\nmodule Flow = DataFlow::Global&lt;MyConfiguration>;\nimport Flow::PathGraph\n\nfrom Flow::PathNode source, Flow::PathNode sink\nwhere Flow::flowPath(source, sink)\nselect sink.getNode(), source, sink, \"&lt;message>\"<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki material-theme-darker\" style=\"background-color: #212121\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #FFCB6B\">\/**<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #FFCB6B\">*<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #C3E88D\">...<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #FFCB6B\">*<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #C3E88D\">@kind<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #C3E88D\">path-problem<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #FFCB6B\">*<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #C3E88D\">...<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #FFCB6B\">*\/<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #FFCB6B\">import<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">&lt;<\/span><span style=\"color: #C3E88D\">languag<\/span><span style=\"color: #EEFFFF\">e<\/span><span style=\"color: #89DDFF\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #FFCB6B\">\/\/<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #C3E88D\">For<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #C3E88D\">some<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #C3E88D\">languages<\/span><span style=\"color: #EEFFFF\"> (Java\/C++\/Python\/Swift), you need to explicitly import the data-flow library, such as<\/span><\/span>\n<span class=\"line\"><span style=\"color: #FFCB6B\">\/\/<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #C3E88D\">import<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #C3E88D\">semmle.code.java.dataflow.DataFlow<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #C3E88D\">or<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #C3E88D\">import<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #C3E88D\">codeql.swift.dataflow.DataFlow<\/span><\/span>\n<span class=\"line\"><span style=\"color: #82AAFF\">...<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #FFCB6B\">module<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #C3E88D\">Flow<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #C3E88D\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #C3E88D\">DataFlow::Global<\/span><span style=\"color: #89DDFF\">&lt;<\/span><span style=\"color: #C3E88D\">MyConfiguratio<\/span><span style=\"color: #EEFFFF\">n<\/span><span style=\"color: #89DDFF\">&gt;;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #FFCB6B\">import<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #C3E88D\">Flow::PathGraph<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #FFCB6B\">from<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #C3E88D\">Flow::PathNode<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #C3E88D\">source,<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #C3E88D\">Flow::PathNode<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #C3E88D\">sink<\/span><\/span>\n<span class=\"line\"><span style=\"color: #FFCB6B\">where<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #C3E88D\">Flow::flowPath<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">source<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #C3E88D\">sink<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF; font-style: italic\">select<\/span><span style=\"color: #EEFFFF\"> sink.getNode(), source, sink, <\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #C3E88D\">&lt;message&gt;<\/span><span style=\"color: #89DDFF\">&quot;<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Dans ce mod\u00e8le :<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong><code>MyConfiguration<\/code><\/strong>&nbsp;est un module contenant les pr\u00e9dicats qui d\u00e9finissent comment les donn\u00e9es circulent entre la source et le puits (<em>sink<\/em>).<\/li>\n\n\n\n<li><strong><code>Flow<\/code><\/strong>&nbsp;est le r\u00e9sultat du calcul de flux de donn\u00e9es bas\u00e9 sur&nbsp;<code>MyConfiguration<\/code>.<\/li>\n\n\n\n<li><strong><code>Flow::PathGraph<\/code><\/strong>&nbsp;est le module de graphe de flux de donn\u00e9es \u00e0 importer pour inclure les explications de chemin dans la requ\u00eate.<\/li>\n\n\n\n<li><strong><code>source<\/code><\/strong>&nbsp;et&nbsp;<strong><code>sink<\/code><\/strong>&nbsp;sont des n\u0153uds du graphe d\u00e9finis dans la configuration, et&nbsp;<strong><code>Flow::PathNode<\/code><\/strong>&nbsp;est leur type.<\/li>\n\n\n\n<li><strong><code>DataFlow::Global&lt;...&gt;<\/code><\/strong>&nbsp;est une invocation du flux de donn\u00e9es. Vous pouvez utiliser&nbsp;<strong><code>TaintTracking::Global&lt;...&gt;<\/code><\/strong>&nbsp;\u00e0 la place pour inclure un ensemble par d\u00e9faut d\u2019\u00e9tapes de contamination (<em>taint steps<\/em>).<\/li>\n<\/ul>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Comment \u00e9crire une requ\u00eate de chemin<\/h3>\n\n\n\n<p>Votre requ\u00eate doit calculer un&nbsp;<strong>graphe de chemin<\/strong>&nbsp;pour g\u00e9n\u00e9rer des explications de chemin. Pour cela, vous devez d\u00e9finir un pr\u00e9dicat de requ\u00eate appel\u00e9&nbsp;<strong><code>edges<\/code><\/strong>. Un pr\u00e9dicat de requ\u00eate est un pr\u00e9dicat non-membre avec une annotation&nbsp;<code>@query<\/code>. Cette annotation retourne tous les tuples que le pr\u00e9dicat \u00e9value.<\/p>\n\n\n\n<p>Le pr\u00e9dicat&nbsp;<strong><code>edges<\/code><\/strong>&nbsp;d\u00e9finit les relations d\u2019ar\u00eates du graphe que vous calculez. Il est utilis\u00e9 pour d\u00e9terminer les chemins associ\u00e9s \u00e0 chaque r\u00e9sultat g\u00e9n\u00e9r\u00e9 par votre requ\u00eate. Vous pouvez aussi importer un pr\u00e9dicat&nbsp;<code>edges<\/code>&nbsp;pr\u00e9d\u00e9fini depuis un module de graphe de chemin dans l\u2019une des biblioth\u00e8ques de flux de donn\u00e9es standard.<\/p>\n\n\n\n<p>Les biblioth\u00e8ques de flux de donn\u00e9es contiennent d\u2019autres classes, pr\u00e9dicats et modules couramment utilis\u00e9s pour l\u2019analyse de flux de donn\u00e9es, en plus du module de graphe de chemin. Elles mod\u00e9lisent le graphe de flux de donn\u00e9es ou impl\u00e9mentent l\u2019analyse de flux. Les biblioth\u00e8ques classiques sont utilis\u00e9es pour analyser les flux o\u00f9 les valeurs de donn\u00e9es sont conserv\u00e9es \u00e0 chaque \u00e9tape.<\/p>\n\n\n\n<p>Voici un exemple d\u2019instruction pour importer le module&nbsp;<code>PathGraph<\/code>&nbsp;depuis la biblioth\u00e8que&nbsp;<code>DataFlow.qll<\/code>, o\u00f9&nbsp;<code>edges<\/code>&nbsp;est d\u00e9fini : import&nbsp;DataFlow::PathGraph <\/p>\n\n\n\n<p>Vous pouvez importer de nombreuses autres biblioth\u00e8ques incluses avec CodeQL, y compris celles con\u00e7ues pour des frameworks ou environnements sp\u00e9cifiques.<\/p>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">La classe&nbsp;<code>PathNode<\/code><\/h3>\n\n\n\n<p>La classe&nbsp;<strong><code>PathNode<\/code><\/strong>&nbsp;est con\u00e7ue pour impl\u00e9menter l\u2019analyse de flux de donn\u00e9es. Elle est bas\u00e9e sur&nbsp;<code>Node<\/code>, enrichie d\u2019un&nbsp;<strong>contexte d\u2019appel<\/strong>&nbsp;(sauf pour les sinks), d\u2019un&nbsp;<strong>chemin d\u2019acc\u00e8s<\/strong>&nbsp;et d\u2019une&nbsp;<strong>configuration<\/strong>. Seuls les&nbsp;<code>PathNode<\/code>&nbsp;atteignables depuis une source sont g\u00e9n\u00e9r\u00e9s.<\/p>\n\n\n\n<p>Exemple de chemin d\u2019importation : import&nbsp;semmle.code.cpp.ir.dataflow.internal.DataFlowImpl<\/p>\n\n\n\n<p>Vous pouvez aussi d\u00e9finir un pr\u00e9dicat de requ\u00eate&nbsp;<strong><code>nodes<\/code><\/strong>, qui sp\u00e9cifie les n\u0153uds du graphe de chemin pour tous les langages. Si vous d\u00e9finissez&nbsp;<code>nodes<\/code>, seuls les n\u0153uds s\u00e9lectionn\u00e9s formeront des ar\u00eates. Si vous ne le d\u00e9finissez pas, vous devez s\u00e9lectionner tous les points d\u2019extr\u00e9mit\u00e9 possibles des ar\u00eates.<\/p>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Analyse de base de donn\u00e9es<\/h3>\n\n\n\n<p>Lorsque vous utilisez des requ\u00eates pour analyser une base de donn\u00e9es CodeQL, vous obtenez des r\u00e9sultats pertinents dans le contexte du code source. Les r\u00e9sultats sont pr\u00e9sent\u00e9s sous forme d\u2019<strong>alertes<\/strong>&nbsp;ou de&nbsp;<strong>chemins<\/strong>&nbsp;au format&nbsp;<strong>SARIF<\/strong>&nbsp;ou autre format interpr\u00e9t\u00e9.<\/p>\n\n\n\n<p>Exemple de commande pour analyser une base de donn\u00e9es CodeQL : codeql&nbsp;database&nbsp;analyze&nbsp;&#8211;format=&nbsp;&#8211;output=&nbsp;[&#8211;threads=]&nbsp;[&#8211;ram=]&nbsp;&#8230;&nbsp;&#8212;&nbsp;&nbsp;&#8230;<br>Cette commande combine les effets de&nbsp;<code>codeql database run-queries<\/code>&nbsp;et&nbsp;<code>codeql database interpret-results<\/code>.<\/p>\n\n\n\n<p>Vous pouvez aussi ex\u00e9cuter des requ\u00eates qui ne produisent pas d\u2019alertes interpr\u00e9tables. Dans ce cas, utilisez : codeql&nbsp;database&nbsp;run-queries ou codeql&nbsp;query&nbsp;run <\/p>\n\n\n\n<p>Puis convertissez les r\u00e9sultats bruts avec :  codeql&nbsp;bqrs&nbsp;decode<br>Utiliser un fichier SARIF avec des cat\u00e9gories<\/p>\n\n\n\n<p>CodeQL prend en charge&nbsp;<strong>SARIF<\/strong>&nbsp;pour partager les r\u00e9sultats d\u2019analyse statique. SARIF permet de repr\u00e9senter les sorties de nombreux outils d\u2019analyse.<\/p>\n\n\n\n<p>Vous devez sp\u00e9cifier une&nbsp;<strong>cat\u00e9gorie<\/strong>&nbsp;lors de l\u2019utilisation du format SARIF. Cela permet de distinguer plusieurs analyses sur le m\u00eame d\u00e9p\u00f4t ou sur diff\u00e9rentes parties du code. Les fichiers SARIF avec la m\u00eame cat\u00e9gorie se&nbsp;<strong>remplacent<\/strong>&nbsp;mutuellement.<\/p>\n\n\n\n<p>Il est recommand\u00e9 d\u2019utiliser le&nbsp;<strong>langage analys\u00e9<\/strong>&nbsp;comme identifiant de cat\u00e9gorie.<\/p>\n\n\n\n<p>Exemple : la valeur de cat\u00e9gorie appara\u00eet dans :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>run.automationId<\/code>&nbsp;(SARIF v1),<\/li>\n\n\n\n<li><code>run.automationLogicalId<\/code>&nbsp;(SARIF v2),<\/li>\n\n\n\n<li><code>run.automationDetails.id<\/code>&nbsp;(SARIF v2.1.0).<\/li>\n<\/ul>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Publier les r\u00e9sultats SARIF sur GitHub<\/h3>\n\n\n\n<p>Une fois la base pr\u00eate, vous pouvez interroger la base ou ex\u00e9cuter une suite de requ\u00eates pour g\u00e9n\u00e9rer un fichier SARIF, puis l\u2019envoyer sur GitHub : codeql&nbsp;github&nbsp;upload-results&nbsp;&#8211;sarif=&nbsp;[&#8211;github-auth-stdin]&nbsp;[&#8211;github-url=]&nbsp;[&#8211;repository=]&nbsp;[&#8211;ref=]&nbsp;[&#8211;commit=]&nbsp;[&#8211;checkout-path=]&nbsp;&#8230;<br>Pour cela, chaque serveur CI doit disposer d\u2019un&nbsp;GitHub App&nbsp;ou d\u2019un&nbsp;jeton d\u2019acc\u00e8s personnel&nbsp;avec la permission&nbsp;security_events: write. <\/p>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">T\u00e9l\u00e9verser les r\u00e9sultats SARIF<\/h2>\n\n\n\n<p>Pour que GitHub affiche les r\u00e9sultats d\u2019un outil d\u2019analyse statique non-Microsoft, les r\u00e9sultats doivent \u00eatre dans un fichier SARIF conforme au sch\u00e9ma JSON SARIF 2.1.0.<\/p>\n\n\n\n<p>\u00c0 chaque t\u00e9l\u00e9versement, CodeQL traite les r\u00e9sultats et ajoute des alertes. Pour \u00e9viter les doublons, CodeQL utilise la propri\u00e9t\u00e9&nbsp;<strong><code>partialFingerprints<\/code><\/strong>&nbsp;pour faire correspondre les r\u00e9sultats entre les ex\u00e9cutions.<\/p>\n\n\n\n<p>Le champ&nbsp;<code>partialFingerprints<\/code>&nbsp;contient au minimum une valeur pour&nbsp;<code>primaryLocationLineHash<\/code>, qui fournit une empreinte bas\u00e9e sur le contexte de la ligne principale.<\/p>\n\n\n\n<p>Si vous t\u00e9l\u00e9versez un fichier SARIF sans empreintes, GitHub tente de les g\u00e9n\u00e9rer automatiquement. Mais cela peut entra\u00eener des alertes dupliqu\u00e9es.<\/p>\n\n\n\n<p><strong>Bonnes pratiques<\/strong>&nbsp;: calculez les empreintes et remplissez&nbsp;<code>partialFingerprints<\/code>&nbsp;avant le t\u00e9l\u00e9versement. Vous pouvez vous baser sur le script utilis\u00e9 par l\u2019action&nbsp;<code>upload-sarif<\/code>.<\/p>\n\n\n\n<p>Pour \u00e9viter les alertes en double lors de l\u2019utilisation d\u2019outils d\u2019analyse statique,<\/p>\n\n\n\n<p>Calculez les&nbsp;<strong>empreintes num\u00e9riques (fingerprints)<\/strong>&nbsp;et renseignez la propri\u00e9t\u00e9&nbsp;<strong><code>partialFingerprints<\/code><\/strong>&nbsp;avant de t\u00e9l\u00e9verser le fichier&nbsp;<strong>SARIF<\/strong>.<\/p>\n\n\n\n<p>Un bon point de d\u00e9part consiste \u00e0 utiliser le&nbsp;<strong>m\u00eame script<\/strong>&nbsp;que celui utilis\u00e9 par l\u2019action&nbsp;<strong><code>upload-sarif<\/code><\/strong>.<br><\/p>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Une fois votre code extrait dans une base de donn\u00e9es, vous pouvez l\u2019analyser \u00e0 l\u2019aide de requ\u00eates&nbsp;CodeQL. Les requ\u00eates par d\u00e9faut sont \u00e9crites [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"parent":5546,"menu_order":4,"comment_status":"closed","ping_status":"closed","template":"","doc_tag":[],"doc_badge":[],"class_list":["post-5559","docs","type-docs","status-publish","hentry"],"author_avatar":"https:\/\/secure.gravatar.com\/avatar\/6a70e7c73db9f245e650948d09d74f61?s=96&d=mm&r=g","author_name":"Annick N'dri","_links":{"self":[{"href":"https:\/\/techhub.saworks.io\/fr\/wp-json\/wp\/v2\/docs\/5559"}],"collection":[{"href":"https:\/\/techhub.saworks.io\/fr\/wp-json\/wp\/v2\/docs"}],"about":[{"href":"https:\/\/techhub.saworks.io\/fr\/wp-json\/wp\/v2\/types\/docs"}],"author":[{"embeddable":true,"href":"https:\/\/techhub.saworks.io\/fr\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/techhub.saworks.io\/fr\/wp-json\/wp\/v2\/comments?post=5559"}],"version-history":[{"count":0,"href":"https:\/\/techhub.saworks.io\/fr\/wp-json\/wp\/v2\/docs\/5559\/revisions"}],"up":[{"embeddable":true,"href":"https:\/\/techhub.saworks.io\/fr\/wp-json\/wp\/v2\/docs\/5546"}],"wp:attachment":[{"href":"https:\/\/techhub.saworks.io\/fr\/wp-json\/wp\/v2\/media?parent=5559"}],"wp:term":[{"taxonomy":"doc_tag","embeddable":true,"href":"https:\/\/techhub.saworks.io\/fr\/wp-json\/wp\/v2\/doc_tag?post=5559"},{"taxonomy":"doc_badge","embeddable":true,"href":"https:\/\/techhub.saworks.io\/fr\/wp-json\/wp\/v2\/doc_badge?post=5559"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}