{"id":1544,"date":"2014-01-08T14:58:58","date_gmt":"2014-01-08T13:58:58","guid":{"rendered":"http:\/\/qualilogy.com\/fr\/?p=1544"},"modified":"2014-01-11T17:21:14","modified_gmt":"2014-01-11T16:21:14","slug":"analyse-plsql-avec-sonarqube-criticals","status":"publish","type":"post","link":"http:\/\/qualilogy.com\/fr\/analyse-plsql-avec-sonarqube-criticals\/","title":{"rendered":"Analyse PL\/SQL avec SonarQube \u2013 Criticals"},"content":{"rendered":"<p><a href=\"http:\/\/500px.com\/Vicken\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-full wp-image-1546\" alt=\"PLSQL_Critical\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/01\/PLSQL_Critical.jpg\" width=\"252\" height=\"380\" srcset=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/01\/PLSQL_Critical.jpg 252w, http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/01\/PLSQL_Critical-198x300.jpg 198w\" sizes=\"(max-width: 252px) 100vw, 252px\" \/><\/a>Dans le post pr\u00e9c\u00e9dent de cette s\u00e9rie sur l&rsquo;analyse de code PL\/SQL avec SonarQube, nous avons examin\u00e9 <a href=\"http:\/\/qualilogy.com\/fr\/analyse-plsql-sonarqube-blockers\/\" target=\"_blank\">les r\u00e9gles Blockers<\/a> existantes dans <a href=\"http:\/\/qualilogy.com\/fr\/analyse-plsql-sonarqube-quality-profile-plsql\/\">notre Quality Profile<\/a>.<\/p>\n<p>Nous avons rencontr\u00e9 \u00e0 cette occasion 3 violations aux &lsquo;best practices&rsquo; de programmation PL\/SQL dont les cons\u00e9quences sont d&rsquo;une gravit\u00e9 telle qu&rsquo;aucune tol\u00e9rance n&rsquo;est envisageable pour celles-ci. Ce qui justifie donc leur statut de &lsquo;Blockers&rsquo;.<\/p>\n<p>Nous avons \u00e9galement constat\u00e9 un total de 18 d\u00e9fauts pour ces 3 r\u00e8gles, donc ce nombre limit\u00e9 nous laisse supposer que celles-ci sont connues de l&rsquo;\u00e9quipe de projet<\/p>\n<p>Enfin, ces d\u00e9fauts ont pour cons\u00e9quence un bug de logique applicative dans l&rsquo;application &#8211; une op\u00e9ration qui ne sera jamais effectu\u00e9e car la condition correspondante ne sera jamais rencontr\u00e9e &#8211; voire un crash pur et simple.<!--more--><\/p>\n<p>Ces trois r\u00e8gles Blockers sont donc orient\u00e9es robustesse ou solidit\u00e9 (Reliability) de l&rsquo;application, ce qui nous convient tr\u00e8s bien. En effet, nous souhaitons mettre en avant les d\u00e9fauts qui impactent directement l&rsquo;utilisateur, donc la fiabilit\u00e9 de l&rsquo;application mais \u00e9galement tout ce qui touche \u00e0 la S\u00e9curit\u00e9 et \u00e0 la Performance, tout ce qui peut \u00e9viter un possible piratage de l&rsquo;application, une corruption de donn\u00e9es ou des traitements trop long qui l\u00e0 encore vont impacter l&rsquo;utilisateur final.<\/p>\n<p>Voyons si nous rencontrons des d\u00e9fauts de ce type parmi les r\u00e8gles Critical.<\/p>\n<h2>Les r\u00e8gles de type Critical<\/h2>\n<p><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/01\/Criticals.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1555\" alt=\"Criticals\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/01\/Criticals.jpg\" width=\"676\" height=\"100\" srcset=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/01\/Criticals.jpg 676w, http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/01\/Criticals-300x44.jpg 300w, http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/01\/Criticals-624x92.jpg 624w\" sizes=\"(max-width: 676px) 100vw, 676px\" \/><\/a><\/p>\n<p>Nous disposons \u00e0 nouveau de 3 r\u00e8gles seulement, concernant cette cat\u00e9gorie des violations Critical. La premi\u00e8re de celles-ci, &lsquo;Sensitive SYS owned functions should not be used&rsquo; concerne l&rsquo;utilisation de packages Oracle, tels que:<\/p>\n<ul>\n<li><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/01\/UTLDefects.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignright size-full wp-image-1556\" alt=\"UTLDefects\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/01\/UTLDefects.jpg\" width=\"360\" height=\"199\" srcset=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/01\/UTLDefects.jpg 360w, http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/01\/UTLDefects-300x165.jpg 300w\" sizes=\"(max-width: 360px) 100vw, 360px\" \/><\/a>UTL_FILE pour g\u00e9rer des fichiers et des r\u00e9pertoires.<\/li>\n<li>UTL_SMTP pour g\u00e9rer des emails.<\/li>\n<li>UTL_TCIP pour g\u00e9rer des connections TCP, pour aller lire ou \u00e9crire sur un serveur distant par exemple.<\/li>\n<\/ul>\n<p>Il existe bien d&rsquo;autres packages Oracle de fonctions telles que celles-ci, mais ce sont en tout cas ceux que nous pouvons rencontrer dans le code analys\u00e9.<\/p>\n<p>Je dois dire que je ne connaissais pas cette norme. Je ne suis pas un expert en s\u00e9curit\u00e9, et en fait, il existe assez peu d\u2019experts s\u00e9curit\u00e9 en mati\u00e8re de base de donn\u00e9es.<\/p>\n<p>Bien \u00e9videmment, je connais le principe d&rsquo;injection SQL, qui permet \u00e0 un hacker de p\u00e9n\u00e9trer au niveau de la base de donn\u00e9es, mais dans ce cas, celui-ci aura les m\u00eames droits qu&rsquo;un simple utilisateur. Par contre, s\u2019il rencontre une de ces proc\u00e9dures ex\u00e9cut\u00e9es par un utilisateur de type \u2018SYS\u2019, alors, selon ces experts, c\u2019est \u00ab\u00a0GAME OVER\u00a0\u00bb. Cela revient \u00e0 donner les droits d&rsquo;administrateur de la base de donn\u00e9es, et donc de faire tout ce qu&rsquo;il est possible de faire, y compris de supprimer tous les acc\u00e8s.<\/p>\n<p>Manifestement, avec 320 d\u00e9fauts identifi\u00e9s par SonarQube dans le code analys\u00e9, ces normes ne sont pas connues. Les remplacer prendra \u00e9galement un peu de temps.<\/p>\n<p><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/01\/PLSQL_SysSunburst.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1560\" alt=\"PLSQL_SysSunburst\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/01\/PLSQL_SysSunburst.jpg\" width=\"582\" height=\"604\" srcset=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/01\/PLSQL_SysSunburst.jpg 582w, http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/01\/PLSQL_SysSunburst-289x300.jpg 289w\" sizes=\"(max-width: 582px) 100vw, 582px\" \/><\/a><\/p>\n<p>Comme nous pouvons le voir dans ce diagramme Sqale (<a href=\"http:\/\/www.sonarsource.com\/products\/plugins\/governance\/sqale\/\" target=\"_blank\">plugin commercial de SonarQube<\/a>), 40 jours sont n\u00e9cessaires pour rem\u00e9dier \u00e0 ces 320 d\u00e9fauts. Je recommanderais donc un chantier sp\u00e9cifique sur ces corrections, \u00e0 court terme.<\/p>\n<p>La deuxi\u00e8me de ces 3 r\u00e8gles concerne l&rsquo;utilisation d&rsquo;instructions DELETE ou UPDATE sans clause WHERE, ce qui revient \u00e0 supprimer ou \u00e0 mettre \u00e0 jour tous les enregistrements d&rsquo;une table. Il peut arriver qu&rsquo;on effectue un DELETE brutal sur une table temporaire mais un UPDATE est tr\u00e8s peu fr\u00e9quent. Dans tous les cas, nous souhaitons pouvoir v\u00e9rifier si l&rsquo;utilisation de cette instruction se justifie ou non.<\/p>\n<p><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/01\/Update.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignright size-full wp-image-1561\" alt=\"Update\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/01\/Update.jpg\" width=\"264\" height=\"61\" \/><\/a> Avec SonarQube, un drill-down au niveau du code nous permet d&rsquo;identifier imm\u00e9diatement l&rsquo;instruction et de v\u00e9rifier, en l&rsquo;occurence, qu&rsquo;il s&rsquo;agit fort probablement d&rsquo;un d\u00e9faut de programmation. Quelqu&rsquo;un va devoir s&rsquo;expliquer !<\/p>\n<p>D&rsquo;autant que ce m\u00eame bloc de code est r\u00e9p\u00e9t\u00e9 \u00e0 nouveau 8 fois dans le m\u00eame programme ! Nous avions d\u00e9j\u00e0 rencontr\u00e9 ce cas avec <a href=\"http:\/\/qualilogy.com\/fr\/analyse-plsql-sonarqube-blockers\/\" target=\"_blank\">les Blockers<\/a>, et un bug Copi\u00e9-Coll\u00e9 \u00e0 plusieur reprises. Une de mes recommandations sera de v\u00e9rifier si au moins une personne dans l&rsquo;\u00e9quipe de projet n\u00e9cessite une petite formation aux best practices de programmation PL\/SQL.<\/p>\n<p>Enfin nous rencontrons 1 unique violation concernant la r\u00e8gle &lsquo;Avoid CROSS JOIN queries&rsquo;, qui identifie des requ\u00eates sur 2 tables (ou plus) sans pr\u00e9ciser de jointure entre celles-ci, ce qui a pour effet de retourner le produit cart\u00e9sien de l&rsquo;ensemble des donn\u00e9es de ces 2 tables. Un tel d\u00e9faut peut avoir pour cons\u00e9quence un bug logique pour l&rsquo;utilisateur, tr\u00e8s certainement un probl\u00e8me de performance, voire m\u00eame une possible erreur (donc corruption) de donn\u00e9es.<\/p>\n<p>On pourrait d&rsquo;ailleurs justifier de remonter cette r\u00e8gle, voire m\u00eame les pr\u00e9c\u00e9dentes, au niveau des Blockers. Vous allez me dire que dans ce cas, nous n&rsquo;aurons plus de r\u00e8gles Criticals ? Si, car nous allons d\u00e9placer certaines r\u00e8gles de type Major en Criticals, celles qui pr\u00e9sentent \u00e9galement un impact sur l&rsquo;utilisateur en mati\u00e8re de Robustesse, S\u00e9curit\u00e9 et Performance.<\/p>\n<p>C&rsquo;est ce que nous verrons dans le prochain post sur les r\u00e8gles Major. A bient\u00f4t.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Dans le post pr\u00e9c\u00e9dent de cette s\u00e9rie sur l&rsquo;analyse de code PL\/SQL avec SonarQube, nous avons examin\u00e9 les r\u00e9gles Blockers existantes dans notre Quality Profile. Nous avons rencontr\u00e9 \u00e0 cette occasion 3 violations aux &lsquo;best practices&rsquo; de programmation PL\/SQL dont les cons\u00e9quences sont d&rsquo;une gravit\u00e9 telle qu&rsquo;aucune tol\u00e9rance n&rsquo;est envisageable pour celles-ci. Ce qui justifie [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[16],"tags":[],"class_list":["post-1544","post","type-post","status-publish","format-standard","hentry","category-sonarqube-plsql"],"_links":{"self":[{"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/posts\/1544"}],"collection":[{"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/comments?post=1544"}],"version-history":[{"count":27,"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/posts\/1544\/revisions"}],"predecessor-version":[{"id":1576,"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/posts\/1544\/revisions\/1576"}],"wp:attachment":[{"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/media?parent=1544"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/categories?post=1544"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/tags?post=1544"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}