{"id":10405,"date":"2024-01-03T09:00:02","date_gmt":"2024-01-03T08:00:02","guid":{"rendered":"https:\/\/blog.capdata.fr\/?p=10405"},"modified":"2024-01-03T08:47:11","modified_gmt":"2024-01-03T07:47:11","slug":"oracle-23c-se-proteger-des-attaques-par-injections-sql-grace-a-sql-firewall","status":"publish","type":"post","link":"https:\/\/blog.capdata.fr\/index.php\/oracle-23c-se-proteger-des-attaques-par-injections-sql-grace-a-sql-firewall\/","title":{"rendered":"Oracle 23c : se prot\u00e9ger des attaques par injections SQL gr\u00e2ce \u00e0 SQL Firewall"},"content":{"rendered":"<a class=\"synved-social-button synved-social-button-share synved-social-size-24 synved-social-resolution-single synved-social-provider-twitter nolightbox\" data-provider=\"twitter\" target=\"_blank\" rel=\"nofollow\" title=\"Share on Twitter\" href=\"https:\/\/twitter.com\/intent\/tweet?url=https%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fwp-json%2Fwp%2Fv2%2Fposts%2F10405&#038;text=Article%20sur%20le%20blog%20de%20la%20Capdata%20Tech%20Team%20%3A%20\" style=\"font-size: 0px;width:24px;height:24px;margin:0;margin-bottom:5px;margin-right:5px\"><img loading=\"lazy\" decoding=\"async\" alt=\"twitter\" title=\"Share on Twitter\" class=\"synved-share-image synved-social-image synved-social-image-share\" width=\"24\" height=\"24\" style=\"display: inline;width:24px;height:24px;margin: 0;padding: 0;border: none;box-shadow: none\" src=\"https:\/\/blog.capdata.fr\/wp-content\/plugins\/social-media-feather\/synved-social\/image\/social\/regular\/48x48\/twitter.png\" \/><\/a><a class=\"synved-social-button synved-social-button-share synved-social-size-24 synved-social-resolution-single synved-social-provider-linkedin nolightbox\" data-provider=\"linkedin\" target=\"_blank\" rel=\"nofollow\" title=\"Share on Linkedin\" href=\"https:\/\/www.linkedin.com\/shareArticle?mini=true&#038;url=https%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fwp-json%2Fwp%2Fv2%2Fposts%2F10405&#038;title=Oracle%2023c%20%3A%20se%20prot%C3%A9ger%20des%20attaques%20par%20injections%20SQL%20gr%C3%A2ce%20%C3%A0%20SQL%20Firewall\" style=\"font-size: 0px;width:24px;height:24px;margin:0;margin-bottom:5px;margin-right:5px\"><img loading=\"lazy\" decoding=\"async\" alt=\"linkedin\" title=\"Share on Linkedin\" class=\"synved-share-image synved-social-image synved-social-image-share\" width=\"24\" height=\"24\" style=\"display: inline;width:24px;height:24px;margin: 0;padding: 0;border: none;box-shadow: none\" src=\"https:\/\/blog.capdata.fr\/wp-content\/plugins\/social-media-feather\/synved-social\/image\/social\/regular\/48x48\/linkedin.png\" \/><\/a><a class=\"synved-social-button synved-social-button-share synved-social-size-24 synved-social-resolution-single synved-social-provider-mail nolightbox\" data-provider=\"mail\" rel=\"nofollow\" title=\"Share by email\" href=\"mailto:?subject=Oracle%2023c%20%3A%20se%20prot%C3%A9ger%20des%20attaques%20par%20injections%20SQL%20gr%C3%A2ce%20%C3%A0%20SQL%20Firewall&#038;body=Article%20sur%20le%20blog%20de%20la%20Capdata%20Tech%20Team%20%3A%20:%20https%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fwp-json%2Fwp%2Fv2%2Fposts%2F10405\" style=\"font-size: 0px;width:24px;height:24px;margin:0;margin-bottom:5px\"><img loading=\"lazy\" decoding=\"async\" alt=\"mail\" title=\"Share by email\" class=\"synved-share-image synved-social-image synved-social-image-share\" width=\"24\" height=\"24\" style=\"display: inline;width:24px;height:24px;margin: 0;padding: 0;border: none;box-shadow: none\" src=\"https:\/\/blog.capdata.fr\/wp-content\/plugins\/social-media-feather\/synved-social\/image\/social\/regular\/48x48\/mail.png\" \/><\/a><p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-10406\" src=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/12\/par_feu-300x235.png\" alt=\"\" width=\"300\" height=\"235\" srcset=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/12\/par_feu-300x235.png 300w, https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/12\/par_feu.png 398w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/>\u00a0 Bonjour \u00e0 toutes et tous et bonne ann\u00e9e 2024 !<\/p>\n<p>Nous d\u00e9butons cette nouvelle ann\u00e9e avec un article, une fois de plus, en lien avec la s\u00e9curit\u00e9 ! C&#8217;est un sujet que nous avons grandement abord\u00e9 au cours de l&#8217;ann\u00e9e 2023, sur les SGBD SQL Server et PostgreSQL.<br \/>\nPour d\u00e9buter 2024 dans la m\u00eame voie, je vous propose une pr\u00e9sentation de la brique SQL Firewall pr\u00e9sente dans la version Oracle 23c.<\/p>\n<p>&nbsp;<\/p>\n<p>Pour qualifier et tester les nouveaut\u00e9s Oracle 23c, nous avons la possibilit\u00e9 de t\u00e9l\u00e9charger et installer l&#8217;\u00e9dition FREE Edition qui, de plus, est utilisable &#8220;on prem&#8221;.<\/p>\n<p>Ce tableau, fourni par Oracle, nous montre les diff\u00e9rentes offres pr\u00e9sentes :<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-10407 size-full\" src=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/12\/Oracle_offres.png\" alt=\"\" width=\"838\" height=\"622\" srcset=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/12\/Oracle_offres.png 838w, https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/12\/Oracle_offres-300x223.png 300w, https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/12\/Oracle_offres-768x570.png 768w\" sizes=\"auto, (max-width: 838px) 100vw, 838px\" \/><\/p>\n<p>&nbsp;<\/p>\n<p>Vous remarquerez qu&#8217;il n&#8217;y a, \u00e0 ce jour, ni Standard Edition 2, ni offre Enterprise Edition on prem.<\/p>\n<p>Une note Oracle indique cependant une \u00e9ventuelle prise en charge de cette version d\u00e8s le premier semestre 2024 sous Linux x86-64<\/p>\n<p><a href=\"https:\/\/support.oracle.com\/epmos\/faces\/DocContentDisplay?_afrLoop=274050397197876&amp;id=742060.1&amp;_afrWindowMode=0&amp;_adf.ctrl-state=10y50u7v5a_4#aref_section19\">Release Schedule of Current Database Releases (Doc ID 742060.1)<\/a><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-10408 size-full\" src=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/12\/Oracle23cplatform.png\" alt=\"\" width=\"502\" height=\"89\" srcset=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/12\/Oracle23cplatform.png 502w, https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/12\/Oracle23cplatform-300x53.png 300w\" sizes=\"auto, (max-width: 502px) 100vw, 502px\" \/><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-10409 size-full\" src=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/12\/Oracle23cplatform2.png\" alt=\"\" width=\"500\" height=\"522\" srcset=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/12\/Oracle23cplatform2.png 500w, https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/12\/Oracle23cplatform2-287x300.png 287w\" sizes=\"auto, (max-width: 500px) 100vw, 500px\" \/><\/p>\n<p>Nous suivrons plus pr\u00e9cis\u00e9ment les informations \u00e0 ce sujet au cour de ce d\u00e9but d&#8217;ann\u00e9e.<\/p>\n<p>&nbsp;<\/p>\n<h2>Installation Oracle 23c FREE Edition<\/h2>\n<p>&nbsp;<\/p>\n<p>Nous disposons d&#8217;une VM EC2 de type Rocky Linux 8.6 pour tester la nouvelle version Oracle 23c<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">[oracle@ etc]$ cat os-release\r\nNAME=&quot;Rocky Linux&quot;\r\nVERSION=&quot;8.6 (Green Obsidian)&quot;\r\nID=&quot;rocky&quot;\r\nID_LIKE=&quot;rhel centos fedora&quot;\r\nVERSION_ID=&quot;8.6&quot;\r\nPLATFORM_ID=&quot;platform:el8&quot;\r\nPRETTY_NAME=&quot;Rocky Linux 8.6 (Green Obsidian)&quot;\r\nANSI_COLOR=&quot;0;32&quot;\r\nCPE_NAME=&quot;cpe:\/o:rocky:rocky:8:GA&quot;\r\nHOME_URL=&quot;https:\/\/rockylinux.org\/&quot;\r\nBUG_REPORT_URL=&quot;https:\/\/bugs.rockylinux.org\/&quot;\r\nROCKY_SUPPORT_PRODUCT=&quot;Rocky Linux&quot;\r\nROCKY_SUPPORT_PRODUCT_VERSION=&quot;8&quot;\r\nREDHAT_SUPPORT_PRODUCT=&quot;Rocky Linux&quot;\r\nREDHAT_SUPPORT_PRODUCT_VERSION=&quot;8&quot;<\/pre>\n<p>L&#8217;installation de la version Oracle 23c Free Edition sur un fork Red Hat est on ne peut plus simple :<\/p>\n<ul>\n<li>T\u00e9l\u00e9charger le package rpm de preinstallation -&gt; \u00a0<a class=\"\" href=\"https:\/\/yum.oracle.com\/repo\/OracleLinux\/OL8\/developer\/x86_64\/getPackage\/oracle-database-preinstall-23c-1.0-0.5.el8.x86_64.rpm\" data-lbl=\"oracle-database-preinstall-23c-1-0-1-el8-x86-64-rp\">oracle-database-preinstall-23c-1.0-1.el8.x86_64.rpm<\/a><\/li>\n<li>T\u00e9l\u00e9charger le package rpm d&#8217;installation du moteur Oracle 23c -&gt; <a href=\"https:\/\/download.oracle.com\/otn-pub\/otn_software\/db-free\/oracle-database-free-23c-1.0-1.el8.x86_64.rpm\" data-lbl=\"database-free-23c-1-0-1-el8-x86-64-rpm:red-hat\">oracle-database-free-23c-1.0-1.el8.x86_64.rpm<\/a><\/li>\n<\/ul>\n<p>Une fois t\u00e9l\u00e9charg\u00e9s et copi\u00e9s vers le serveur linux, passer \u00e0 l&#8217;installation via rpm sous &#8220;<strong>root<\/strong>&#8220;<\/p>\n<p>&nbsp;<\/p>\n<p>&#8212; Le package de preinstallation permettant la configuration OS propre \u00e0 Oracle.<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">[root@ ~]# rpm -iv \/tmp\/oracle-database-preinstall-23c-1.0-0.5.el8.x86_64.rpm\r\nwarning: \/tmp\/oracle-database-preinstall-23c-1.0-0.5.el8.x86_64.rpm: Header V3 RSA\/SHA256 Signature, key ID ad986da3: NOKEY\r\nVerifying packages...\r\nPreparing packages...\r\noracle-database-preinstall-23c-1.0-0.5.el8.x86_64<\/pre>\n<p>&nbsp;<\/p>\n<p>&#8212; Puis le package d&#8217;installation du moteur Oracle 23c. Attention, l&#8217;installation va se faire dans un r\u00e9pertoire &#8220;\/opt&#8221;. Pr\u00e9voir une place d&#8217;au moins 8Go sur ce montage.<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">[root@ ~]# rpm -iv \/tmp\/oracle-database-free-23c-1.0-1.el8.x86_64.rpm\r\nwarning: \/tmp\/oracle-database-free-23c-1.0-1.el8.x86_64.rpm: Header V3 RSA\/SHA256 Signature, key ID ad986da3: NOKEY\r\nVerifying packages...\r\nPreparing packages...\r\noracle-database-free-23c-1.0-1.x86_64\r\n[INFO] Executing post installation scripts...\r\n[INFO] Oracle home installed successfully and ready to be configured.\r\nTo configure Oracle Database Free, optionally modify the parameters in '\/etc\/sysconfig\/oracle-free-23c.conf' and then run '\/etc\/init.d\/oracle-free-23c configure' as root.<\/pre>\n<p>&nbsp;<\/p>\n<p>Valider l&#8217;installation des packages<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">[root@ ~]# rpm -qav | grep -i oracle\r\noracle-database-preinstall-23c-1.0-0.5.el8.x86_64\r\noracle-database-free-23c-1.0-1.x86_64<\/pre>\n<p>&nbsp;<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">[root@ ~]# ls \/opt\/oracle\/product\/23c\/dbhomeFree\/\r\naddnode clone ctx deinstall env.ora instantclient jdk LICENSE nls OPatch ord plsql R root.sh slax sqlplus usm\r\nassistants crs cv demo has inventory jlib md odbc opmn oss precomp racg runInstaller sqlcl srvm utl\r\nbin crypto data diagnostics hs javavm ldap mgw olap oracore oui python rdbms schagent.conf sqlj ss_oracle.sdo.acl xdk\r\ncfgtoollogs css dbs dv install jdbc lib network oml4py oraInst.loc perl QOpatch relnotes sdk sqlpatch ucp<\/pre>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">[root@ ~]# \/opt\/oracle\/product\/23c\/dbhomeFree\/root.sh\r\nCheck \/opt\/oracle\/product\/23c\/dbhomeFree\/install\/root_************_2023-12-20_11-38-30-060078626.log for the output of root script<\/pre>\n<p>&#8212; Comme indiqu\u00e9 en fin d&#8217;installation, lancer &#8216;\/etc\/init.d\/oracle-free-23c configure&#8217; sous &#8220;<strong>root<\/strong>&#8221; pour cr\u00e9er une nouvelle instance. Le script est interactif et vous serez amener \u00e0 saisir certaines informations comme le mot de passe SYS\/SYSTEM et PDB_ADMIN.<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">[root@~]# \/etc\/init.d\/oracle-free-23c configure\r\nSpecify a password to be used for database accounts. Oracle recommends that the password entered should be at least 8 characters in length, contain at least 1 uppercase character, 1 lower case character and 1 digit [0-9]. Note that the same password will be used for SYS, SYSTEM and PDBADMIN accounts:\r\nConfirm the password:\r\nConfiguring Oracle Listener.\r\nListener configuration succeeded.\r\nConfiguring Oracle Database FREE.\r\nEnter SYS user password:\r\n************\r\nEnter SYSTEM user password:\r\n**************\r\nEnter PDBADMIN User Password:\r\n************\r\nPrepare for db operation\r\n7% complete\r\nCopying database files\r\n29% complete\r\nCreating and starting Oracle instance\r\n30% complete\r\n33% complete\r\n36% complete\r\n39% complete\r\n[WARNING] ORA-20002: Directory creation failed\r\nORA-06512: at &quot;SYS.DBMS_QOPATCH&quot;, line 1644\r\nORA-06512: at &quot;SYS.DBMS_QOPATCH&quot;, line 1521\r\nORA-06512: at line 1\r\n\r\n43% complete\r\nCompleting Database Creation\r\n47% complete\r\n49% complete\r\n50% complete\r\nCreating Pluggable Databases\r\n54% complete\r\n71% complete\r\nExecuting Post Configuration Actions\r\n93% complete\r\nRunning Custom Scripts\r\n100% complete\r\nDatabase creation complete. For details check the logfiles at:\r\n\/opt\/oracle\/cfgtoollogs\/dbca\/FREE.\r\nDatabase Information:\r\nGlobal Database Name:FREE\r\nSystem Identifier(SID):FREE\r\nLook at the log file &quot;\/opt\/oracle\/cfgtoollogs\/dbca\/FREE\/FREE1.log&quot; for further details.\r\n\r\nDatabase configuration failed. Check logs under '\/opt\/oracle\/cfgtoollogs\/dbca'.<\/pre>\n<p>&nbsp;<\/p>\n<p>Ne pas tenir compte de l&#8217;erreur lors de la cr\u00e9ation du DIRECTORY Oracle, celui ci pointe vers un r\u00e9pertoire inexistant sur la machine. Il nous sera possible d&#8217;en cr\u00e9er un ult\u00e9rieurement.<\/p>\n<p>&nbsp;<\/p>\n<h2>Pr\u00e9sentation SQL Firewall<\/h2>\n<p>Comme son nom l&#8217;indique , Oracle 23c SQL Firewall est un firewall applicatif qui, au del\u00e0 d&#8217;un firewall web classique (WAF), est capable d&#8217;interpr\u00e9ter le code SQL en entr\u00e9e directement en base.<br \/>\nComme le montre l&#8217;image extraite de la documentation Oracle officielle, le processus passe par une phase d&#8217;apprentissage des diff\u00e9rentes requ\u00eates envoy\u00e9es \u00e0 la base de donn\u00e9es.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-10417 size-full\" src=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/12\/oracle_sql_firewall_etapes.png\" alt=\"\" width=\"716\" height=\"121\" srcset=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/12\/oracle_sql_firewall_etapes.png 716w, https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/12\/oracle_sql_firewall_etapes-300x51.png 300w\" sizes=\"auto, (max-width: 716px) 100vw, 716px\" \/><\/p>\n<p>&nbsp;<\/p>\n<p>Une liste des requ\u00eates dites &#8220;autoris\u00e9es&#8221; doit \u00eatre g\u00e9n\u00e9r\u00e9e afin de valider les op\u00e9rations business officielles d&#8217;une production classique au cour de la journ\u00e9e.<br \/>\nCeci peut bien \u00e9videmment \u00eatre facilit\u00e9 par un \u00e9diteur qui connait parfaitement son application, et donc son mod\u00e8le conceptuel de donn\u00e9es et les requ\u00eates SQL qui en d\u00e9coulent.<\/p>\n<p>Une fois cette phase d&#8217;apprentissage \u00e9tablie, nous allons pouvoir valider les requ\u00eates captur\u00e9es\u00a0 et dresser la liste &#8220;verte&#8221; des requ\u00eates autoris\u00e9es.<\/p>\n<p>C&#8217;est \u00e0 partir de la que l&#8217;on pourra potentiellement, emp\u00eacher tout autre code SQL de passer en base.<br \/>\nLe filtrage peut se faire selon plusieurs contextes \u00e0 savoir, un utilisateur en particulier, une adresse IP o\u00f9 bien un programme.<\/p>\n<p>&nbsp;<\/p>\n<h2>Les pr\u00e9requis pour Oracle 23c SQL Firewall<\/h2>\n<p>&nbsp;<\/p>\n<p>Rappelons que depuis la version 21c, Oracle nous impose la gestion du multitenant avec la possibilit\u00e9 de cr\u00e9er 3 PDBs gratuitement.<br \/>\nL&#8217;instance FREE comporte donc bien une PDB exploitable en lecture\/\u00e9criture<\/p>\n<p>&nbsp;<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">[oracle@ ~]$ . oraenv\r\nORACLE_SID = [oracle] ? FREE\r\nThe Oracle base has been set to \/opt\/oracle\r\n[oracle@ ~]$ sqlplus \/ as sysdba\r\n\r\nSQL*Plus: Release 23.0.0.0.0 - Production on Wed Dec 20 11:46:08 2023\r\nVersion 23.3.0.23.09\r\n\r\nCopyright (c) 1982, 2023, Oracle. All rights reserved.\r\n\r\nConnected to:\r\nOracle Database 23c Free Release 23.0.0.0.0 - Develop, Learn, and Run for Free\r\nVersion 23.3.0.23.09\r\n\r\nSQL&gt; show pdbs;\r\n\r\nCON_ID     CON_NAME                       OPEN MODE  RESTRICTED\r\n---------- ------------------------------ ---------- ----------\r\n2          PDB$SEED                       READ ONLY  NO\r\n3          FREEPDB1                       READ WRITE NO\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>Il sera donc n\u00e9cessaire, pour se connecter \u00e0 la PDB FREEPPDB1 depuis un compte applicatif, d&#8217;ajouter une entr\u00e9e dans le tnsnames.<\/p>\n<p>&nbsp;<\/p>\n<pre>FREEPDB1 =\r\n(DESCRIPTION =\r\n(ADDRESS = (PROTOCOL = TCP)(HOST = ip-********.eu-west-3.compute.internal)(PORT = 1521))\r\n(CONNECT_DATA =\r\n(SERVER = DEDICATED)\r\n(SERVICE_NAME = FREEPDB1)\r\n)\r\n)\r\n<\/pre>\n<h4>Configuration des donn\u00e9es.<\/h4>\n<p>Pour notre cas pratique, nous cr\u00e9ons 3 utilisateurs Oracle dans la PDB. 1 utilisateur administrateur du Firewall, 1 utilisateur propri\u00e9taire des objets et 1 utilisateur applicatif utilisant des ordres DML sur les objets. A noter le r\u00f4le &#8220;<strong>sql_firewall_admin<\/strong>&#8221; pour le compte &#8220;FW_ADMIN&#8221;.<\/p>\n<p>&nbsp;<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">SQL&gt; alter session set container = FREEPDB1;\r\n\r\nSQL&gt; create user FW_ADMIN identified by passwdfwadmin;\r\nSQL&gt; grant create session, sql_firewall_admin, audit_admin to FW_ADMIN;\r\nSQL&gt; create user application_owner identified by passwdappliowner default tablespace USERS quota unlimited on USERS;\r\nSQL&gt; grant create session, create table, create view, create procedure, create synonym to application_owner;\r\nSQL&gt; create user application identified by passwdappli default tablespace USERS quota unlimited on USERS;\r\nSQL&gt; grant create session to application;\r\nSQL&gt; grant select any table on schema application_owner to application;\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>Cr\u00e9ation des objets et du jeu de donn\u00e9es<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">\r\n\r\nSQL&gt;  create table salaries ( id number(15), name VARCHAR2(128), address VARCHAR2(400), date_entr\u00e9e VARCHAR2(128));\r\nSQL&gt;  create table entreprise (ent_id VARCHAR2(128), raison_sociale varchar2(20),taille_salaries number(5));\r\n\r\nSQL&gt;  insert into salaries values (154484, 'Manuel', '14 rue voltaire', '16\/12\/2020');\r\nSQL&gt;  insert into salaries values (275558, 'Jack', '24 rue du d\u00e9part', '12\/10\/2005');\r\nSQL&gt;  insert into salaries values (285548, 'Cyril', '27 avenue Pasteur', '01\/02\/2006');\r\nSQL&gt;  insert into salaries values (472245, 'Thomas', '12 avenue principale', '15\/02\/2021');\r\n\r\nSQL&gt;  insert into entreprise values (12232,'SARL',1200);\r\nSQL&gt;  insert into entreprise values (13456,'SARL', 500);\r\nSQL&gt;  insert into entreprise values (22522,'SA',288);\r\nSQL&gt;  insert into entreprise values (25485,'SA', 144);\r\nSQL&gt;  insert into entreprise values (31411,'SA',524);\r\nSQL&gt;  insert into entreprise values (36879,'SARL', 56);\r\nSQL&gt;  insert into entreprise values (40125,'EURL', 120);\r\nSQL&gt;  insert into entreprise values (44588, 'SA', 2510);\r\n\r\nSQL&gt;  create or replace view application_owner.somme_salaries_sa\r\nas\r\nselect raison_sociale, sum(taille_salaries) as &quot;Somme_SA&quot;\r\nfrom application_owner.entreprise\r\nwhere raison_sociale='SA'\r\ngroup by raison_sociale;\r\n\r\nSQL&gt;  create or replace procedure maj_salarie_addresse (id number, address varchar2)\r\nis\r\nreq varchar2(1000);\r\nbegin\r\nreq := 'BEGIN UPDATE salaries SET address = ''' || address || ''' WHERE id = ''' || id || '''; COMMIT; END;';\r\nDBMS_OUTPUT.PUT_LINE('Query: ' || req);\r\nexecute immediate req;\r\nend;\r\n\/\r\n\r\nSQL&gt;  CREATE OR REPLACE PROCEDURE maj_entreprise_salaries ( id number, taille_salaries number)\r\nIS\r\nreq VARCHAR2(1000);\r\nBEGIN\r\n\r\nreq := 'BEGIN UPDATE entreprise SET taille_salaries =''' || taille_salaries || ''' WHERE ent_id = ''' || id || '''; COMMIT; END;';\r\nDBMS_OUTPUT.PUT_LINE('Query: ' || req);\r\nEXECUTE IMMEDIATE req;\r\nEND;\r\n\/\r\n\r\nSQL&gt;  grant execute on application_owner.maj_salarie_addresse to application;\r\nSQL&gt;  grant execute on application_owner.maj_entreprise_salaries to application;\r\nSQL&gt;  grant select on application_owner.somme_salaries_sa to application;\r\nSQL&gt;  grant insert, update, delete on application_owner.salaries to application;\r\nSQL&gt;  grant insert, update, delete on application_owner.entreprise to application;\r\nSQL&gt;  create public synonym somme_salaries_sa for application_owner.somme_salaries_sa;\r\nSQL&gt;  create public synonym maj_salarie_addresse for application_owner.maj_salarie_addresse;\r\nSQL&gt;  create public synonym maj_entreprise_salaries for application_owner.maj_entreprise_salaries;\r\n<\/pre>\n<p>&nbsp;<\/p>\n<h2>Capture des requ\u00eates dans Oracle 23c SQL Firewall<\/h2>\n<p>&nbsp;<\/p>\n<p>A cette \u00e9tape, nous pouvons commencer \u00e0 capturer de l&#8217;activit\u00e9 afin de d\u00e9buter &#8220;l&#8217;apprentissage&#8221; pour le SQL Firewall.<\/p>\n<p>Tout d&#8217;abord, il nous faut activer le Firewall et v\u00e9rifier son statut avec le compte FW_ADMIN.<\/p>\n<p>&nbsp;<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">SQL&gt; connect fw_admin@freepdb1\r\nEnter password:\r\nConnected.\r\nSQL&gt; exec dbms_sql_firewall.enable;\r\n\r\nPL\/SQL procedure successfully completed.\r\n\r\nSQL&gt;  select STATUS,STATUS_UPDATED_ON from dba_sql_firewall_status;\r\n\r\nSTATUS   STATUS_UPDATED_ON\r\n-------- ---------------------------------------------------------------------------\r\nENABLED  20-DEC-23 03.45.23.677823 PM +00:00<\/pre>\n<p>&nbsp;<\/p>\n<p>D\u00e9marrer la capture d&#8217;activit\u00e9 pour l&#8217;utilisateur Oracle nomm\u00e9 application.<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">SQL&gt;  exec dbms_sql_firewall.create_capture('APPLICATION'); <\/pre>\n<p>V\u00e9rifier le statut de la capture<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">SQL&gt; col LAST_STARTED_ON for a35\r\nSQL&gt; col LAST_STOPPED_ON for a35\r\nSQL&gt; select * from dba_sql_firewall_captures where username='APPLICATION';\r\n\r\nUSERNAME        TOP_LEVEL_ONLY STATUS   LAST_STARTED_ON                     LAST_STOPPED_ON\r\n--------------- -------------- -------- ----------------------------------- -----------------------------------\r\nAPPLICATION     N              ENABLED  20-DEC-23 03.49.48.573900 PM +00:00                                     <\/pre>\n<p>&nbsp;<\/p>\n<p>La suite consiste donc \u00e0 g\u00e9n\u00e9rer de l&#8217;activit\u00e9 avec le compte APPLICATION<\/p>\n<p>&nbsp;<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">SQL&gt; conn application@FREEPDB1\r\nConnected.\r\nSQL&gt; execute maj_salarie_addresse(154484, '18 rue voltaire');\r\n\r\nSQL&gt; execute maj_entreprise_salaries(25485, 146);\r\n\r\nSQL&gt; select name, address from application_owner.salaries where id = 472245;\r\n\r\nSQL&gt; insert into application_owner.salaries values (510024, 'Marie', '12 rue de l eglise', '20\/12\/2023');\r\n\r\nSQL&gt; select name, address from application_owner.salaries where id = 510024;\r\n\r\nSQL&gt; delete from application_owner.salaries where id = 510024;\r\n\r\nSQL&gt; select name, address application_owner.salaries where id = 510024;\r\n\r\nSQL&gt; select * from application_owner.somme_salaries_sa;\r\n\r\nSQL&gt; select count(*) from application_owner.salaries where date_entr\u00e9e &amp;gt; '01\/01\/2015';<\/pre>\n<p>&nbsp;<\/p>\n<p>Allons voir \u00e0 pr\u00e9sent ce que le Firewall a captur\u00e9 comme requ\u00eates. Stoppons la capture et allons lire dans les logs du Firewall<\/p>\n<p>&nbsp;<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">SQL&gt; exec dbms_sql_firewall.stop_capture('APPLICATION');\r\n\r\nPL\/SQL procedure successfully completed.\r\n\r\nSQL&gt; select username, ip_address, login_time, client_program, os_user from dba_sql_firewall_session_logs order by login_time;\r\n\r\nUSERNAME        IP_ADDRESS      LOGIN_TIME                          CLIENT_PROGRAM                                     OS_USER\r\n--------------- --------------- ----------------------------------- -------------------------------------------------- --------------------\r\nAPPLICATION     172.44.****     20-DEC-23 04.08.38.884619 PM +00:00 sqlplus@ip-********.fr (TNS V1-V3)                 oracle\r\nAPPLICATION     172.44.****     20-DEC-23 04.15.26.633200 PM +00:00 sqlplus@ip-********.fr (TNS V1-V3)                 oracle\r\nAPPLICATION     172.44.****     20-DEC-23 04.19.46.220001 PM +00:00 sqlplus@ip-********.fr (TNS V1-V3)                 oracle<\/pre>\n<p>&nbsp;<\/p>\n<p>Nous avons captur\u00e9 les diff\u00e9rentes connexions avec le compte APPLICATION, gr\u00e2ce \u00e0 cela, les informations sur les SQL lanc\u00e9s sont enregistr\u00e9es.<br \/>\nA noter que les variables enregistr\u00e9es sont &#8220;bind\u00e9s&#8221;<\/p>\n<p>&nbsp;<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">SQL&gt; select username, top_level, command_type, sql_text,sql_signature,accessed_objects from dba_sql_firewall_capture_logs where username = 'APPLICATION' order by command_type, sql_signature;\r\n\r\nUSERNAME TOP_LEVEL COMMAND_TYPE\r\n--------------- --------- ----------------------------------------------------------------\r\nSQL_TEXT\r\n--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------\r\nSQL_SIGNATURE\r\n----------------------------------------------------------------\r\nACCESSED_OBJECTS\r\n--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------\r\nAPPLICATION Y DELETE\r\nDELETE FROM APPLICATION_OWNER.SALARIES WHERE ID=:&quot;SYS_B_0&quot;\r\n0D3C48AFA7C43F32036A1398B2C9FED8250C57D00C9731332E8B6BFAAD25F3A0\r\n&quot;APPLICATION_OWNER&quot;.&quot;SALARIES&quot;\r\n\r\nAPPLICATION N EXECUTE\r\nBEGIN UPDATE ENTREPRISE SET TAILLE_SALARIES=? WHERE ENT_ID=?; COMMIT; END;\r\n243A35B41DAB8171B60C30BE90A3D725DEEDA3A22C8E118B5EB7E99C8D73E890\r\n&quot;APPLICATION_OWNER&quot;.&quot;ENTREPRISE&quot;\r\n\r\nAPPLICATION Y EXECUTE\r\nBEGIN MAJ_SALARIE_ADDRESSE (?,?); END;\r\n6A8D28786FE3BFEBFEBEE70CF2AF81A3587F5FE8239696BE9939D443EFB52789\r\n&quot;APPLICATION_OWNER&quot;.&quot;MAJ_SALARIE_ADDRESSE&quot;\r\n\r\nAPPLICATION N EXECUTE\r\nBEGIN UPDATE SALARIES SET ADDRESS=? WHERE ID=?; COMMIT; END;\r\nED3DA8C122700A399BEB2D6C0CC88E5FC1B46A61961BF515E5DB0526856AD86A\r\n&quot;APPLICATION_OWNER&quot;.&quot;SALARIES&quot;\r\n\r\nAPPLICATION Y EXECUTE\r\nBEGIN MAJ_ENTREPRISE_SALARIES (?,?); END;\r\nF4F779482E86BC0537A6BC59470DB7E8A0EBBCF3B6F2CB21CE3242DC2863C45A\r\n&quot;APPLICATION_OWNER&quot;.&quot;MAJ_ENTREPRISE_SALARIES&quot;\r\n\r\nAPPLICATION Y INSERT\r\nINSERT INTO APPLICATION_OWNER.SALARIES VALUES (:&quot;SYS_B_0&quot;,:&quot;SYS_B_1&quot;,:&quot;SYS_B_2&quot;,:&quot;SYS_B_3&quot;)\r\nC24B251483E84751353F7B379414FFFBEBCC593E3E1CC32C0E419B69A66CA807\r\n&quot;APPLICATION_OWNER&quot;.&quot;SALARIES&quot;\r\n\r\nAPPLICATION Y SELECT\r\nSELECT NAME,ADDRESS FROM APPLICATION_OWNER.SALARIES WHERE ID=:&quot;SYS_B_0&quot;\r\n633C0FBB9B54CB5F6BC0A75B9BA34A2EA453671A78A799644CF4D7956F6EEE4B\r\n&quot;APPLICATION_OWNER&quot;.&quot;SALARIES&quot;\r\n\r\nAPPLICATION Y SELECT\r\nSELECT NAME,ADDRESS FROM APPLICATION_OWNER.SALARIES WHERE ID=:&quot;SYS_B_0&quot;\r\n633C0FBB9B54CB5F6BC0A75B9BA34A2EA453671A78A799644CF4D7956F6EEE4B\r\n&quot;APPLICATION_OWNER&quot;.&quot;SALARIES&quot;\r\n\r\nAPPLICATION Y SELECT\r\nSELECT DECODE (USER,:&quot;SYS_B_0&quot;,XS_SYS_CONTEXT (:&quot;SYS_B_1&quot;,:&quot;SYS_B_2&quot;),USER) FROM SYS.DUAL\r\n8CD0E5550A8AF32553BDED7C77B8CC1FD103C51F438E11F1BC5F9CA315102794\r\n&quot;SYS&quot;.&quot;DUAL&quot;\r\n\r\nAPPLICATION Y SELECT\r\nSELECT DECODE (USER,:&quot;SYS_B_0&quot;,XS_SYS_CONTEXT (:&quot;SYS_B_1&quot;,:&quot;SYS_B_2&quot;),USER) FROM SYS.DUAL\r\n8CD0E5550A8AF32553BDED7C77B8CC1FD103C51F438E11F1BC5F9CA315102794\r\n&quot;SYS&quot;.&quot;DUAL&quot;\r\n\r\nAPPLICATION Y SELECT\r\nSELECT DECODE (USER,:&quot;SYS_B_0&quot;,XS_SYS_CONTEXT (:&quot;SYS_B_1&quot;,:&quot;SYS_B_2&quot;),USER) FROM SYS.DUAL\r\n8CD0E5550A8AF32553BDED7C77B8CC1FD103C51F438E11F1BC5F9CA315102794\r\n&quot;SYS&quot;.&quot;DUAL&quot;\r\n\r\nAPPLICATION Y SELECT\r\nSELECT * FROM APPLICATION_OWNER.SOMME_SALARIES_SA\r\nBCCB5D0F6B4DE96D7C9E52C8678C489698D4ED23F8FEEA120FFC701560C99D0C\r\n&quot;APPLICATION_OWNER&quot;.&quot;SOMME_SALARIES_SA&quot;\r\n\r\nAPPLICATION Y SELECT\r\nSELECT * FROM APPLICATION_OWNER.SOMME_SALARIES_SA\r\nBCCB5D0F6B4DE96D7C9E52C8678C489698D4ED23F8FEEA120FFC701560C99D0C\r\n&quot;APPLICATION_OWNER&quot;.&quot;SOMME_SALARIES_SA&quot;\r\n\r\nAPPLICATION Y SELECT\r\nSELECT COUNT (*) FROM APPLICATION_OWNER.SALARIES WHERE DATE_ENTR??E &amp;gt;:&quot;SYS_B_0&quot;\r\nEE000C28DC61F8D21DCDC9BB6880A315EB12CC3682E0D3CD47A01EACF915EF98\r\n&quot;APPLICATION_OWNER&quot;.&quot;SALARIES&quot;\r\n\r\nAPPLICATION Y SELECT\r\nSELECT COUNT (*) FROM APPLICATION_OWNER.SALARIES WHERE DATE_ENTR??E &amp;gt;:&quot;SYS_B_0&quot;\r\nEE000C28DC61F8D21DCDC9BB6880A315EB12CC3682E0D3CD47A01EACF915EF98\r\n&quot;APPLICATION_OWNER&quot;.&quot;SALARIES&quot;\r\n\r\nAPPLICATION N UPDATE\r\nUPDATE ENTREPRISE SET TAILLE_SALARIES=:&quot;SYS_B_0&quot; WHERE ENT_ID=:&quot;SYS_B_1&quot;\r\n36FE5B2C529FD88D46DD6C69649D30C12719CD2600945F8EF2D4B3D039B4CD06\r\n&quot;APPLICATION_OWNER&quot;.&quot;ENTREPRISE&quot;\r\n\r\nAPPLICATION N UPDATE\r\nUPDATE SALARIES SET ADDRESS=:&quot;SYS_B_0&quot; WHERE ID=:&quot;SYS_B_1&quot;\r\n6D68C8BB02FFE46E37900E60275B0AB0698CF1217B95B3CA1C789E29FE8D0B6B\r\n&quot;APPLICATION_OWNER&quot;.&quot;SALARIES&quot;<\/pre>\n<p>&nbsp;<\/p>\n<p>Chaque ordre SQL a une signature propre \u00e0 lui. C&#8217;est ce qui permet au SQL Firewall de reconnaitre par la suite, tout ordre faisant parti de la liste.<\/p>\n<p>&nbsp;<\/p>\n<h2>G\u00e9n\u00e9rer la liste &#8220;verte&#8221; de requ\u00eates autoris\u00e9es<\/h2>\n<p>La liste &#8220;verte&#8221; se cr\u00e9e avec le compte FW_ADMIN<\/p>\n<p>&nbsp;<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">SQL&gt; connect fw_admin@FREEPDB1\r\nEnter password:\r\nConnected.\r\nSQL&gt; exec dbms_sql_firewall.generate_allow_list('APPLICATION');\r\n\r\nPL\/SQL procedure successfully completed.\r\n\r\nSQL&gt;; col GENERATED_ON for a35\r\nSQL&gt; select USERNAME,GENERATED_ON,STATUS,STATUS_UPDATED_ON,TOP_LEVEL_ONLY from dba_sql_firewall_allow_lists where username='APPLICATION';\r\n\r\nUSERNAME              GENERATED_ON                        STATUS   STATUS_UPDATED_ON                   TOP_LEVEL_ONLY\r\n---------------       ----------------------------------- -------- ----------------------------------- --------------\r\nAPPLICATION           20-DEC-23 04.49.56.169700 PM +00:00 DISABLED 20-DEC-23 04.49.56.169700 PM +00:00 N<\/pre>\n<p>&nbsp;<\/p>\n<p>Pour le moment, le statut de la liste est \u00e0 DISABLED car nous l&#8217;avons juste g\u00e9n\u00e9r\u00e9e.<\/p>\n<p>Comme \u00e9voqu\u00e9 quelques lignes au dessus, le contexte peut se faire via l&#8217;adresse IP<\/p>\n<p>&nbsp;<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">SQL&gt; select * from sys.dba_sql_firewall_allowed_ip_addr where username='APPLICATION';\r\n\r\nUSERNAME             IP_ADDRESS\r\n-------------------- ------------------------------\r\nAPPLICATION          172.44.*********<\/pre>\n<p>&nbsp;<\/p>\n<p>Le programme associ\u00e9<\/p>\n<p>&nbsp;<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">SQL&gt; select * from sys.dba_sql_firewall_allowed_os_prog where username='APPLICATION';\r\n\r\nUSERNAME               OS_PROGRAM\r\n--------------------   --------------------------------------------------------------------------------------------------------------------------------\r\nAPPLICATION            sqlplus@ip-172-44-*************s.fr (TNS V1-V3)<\/pre>\n<p>&nbsp;<\/p>\n<p>Ou bien le user OS<\/p>\n<p>&nbsp;<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">SQL&gt; select * from sys.dba_sql_firewall_allowed_os_user where username='APPLICATION';\r\n\r\nUSERNAME               OS_USER\r\n--------------------   --------------------------------------------------------------------------------------------------------------------------------\r\nAPPLICATION            oracle<\/pre>\n<p>&nbsp;<\/p>\n<h4>Activer la liste &#8220;verte&#8221;<\/h4>\n<p>&nbsp;<\/p>\n<p>la suite consiste \u00e0 valider et surtout, activer cette liste. Ceci se fait avec le compte FW_ADMIN.<\/p>\n<p>&nbsp;<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">SQL&gt; connect fw_admin@FREEPDB1\r\nEnter password:\r\nConnected.\r\nSQL&gt; exec dbms_sql_firewall.enable_allow_list('APPLICATION');\r\n\r\nPL\/SQL procedure successfully completed.\r\n\r\nSQL&gt; select username, status, top_level_only, enforce, block from dba_sql_firewall_allow_lists where username='APPLICATION';\r\n\r\nUSERNAME             STATUS          TOP_LEVEL_ONLY ENFORCE         BLOCK\r\n-------------------- --------------  -------------- --------------- --------------\r\nAPPLICATION          ENABLED         N              ENFORCE_ALL     N<\/pre>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>Cette liste &#8220;verte&#8221; est donc activ\u00e9e, elle &#8220;trappe&#8221; les futures requ\u00eates qui ne matcheraient pas avec celles qui sont enregistr\u00e9es. Mais, le &#8220;BLOCK&#8221; est \u00e0 N, donc l&#8217;utilisateur n&#8217;a pas de message d&#8217;erreur en cas de saisie d&#8217;une requ\u00eate non reconnue.<\/p>\n<p>Le user APPLICATION peut tout \u00e0 fait faire un SELECT sur une table.<\/p>\n<p>&nbsp;<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">SQL&gt; connect application@FREEPDB1\r\nEnter password:\r\nConnected.\r\nSQL&gt; select name from application_owner.salaries where id &gt; 300000;\r\n\r\nNAME\r\n--------------------------------------------------------------------------------------------------------------------------------\r\nManuel\r\nJack\r\nCyril<\/pre>\n<p>&nbsp;<\/p>\n<p>Mais une fois connect\u00e9 avec le user FW_ADMIN, une simple interrogation dans la vue DBA_SQL_FIREWALL_VIOLATIONS nous donne l&#8217;entr\u00e9e suivante<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">SQL&gt; select USERNAME,COMMAND_TYPE,SQL_TEXT,IP_ADDRESS,OS_USER,OCCURRED_AT from dba_sql_firewall_violations;\r\n\r\nUSERNAME\u00a0 \u00a0 \u00a0 \u00a0      COMMAND_TYPE\u00a0 \u00a0               SQL_TEXT\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\u00a0IP_ADDRESS\u00a0         OS_USER&lt;\/pre&gt;\r\n-------------------- ---------------\u00a0 \u00a0 \u00a0 \u00a0      \u00a0\u00a0--------------------------------------------------------------------------------\u00a0 \u00a0 \u00a0 ---------------\u00a0 \u00a0 \u00a0---------------\r\nOCCURRED_AT\r\n---------------------------------------------------------------------------\r\nAPPLICATION\u00a0 \u00a0 \u00a0     SELECT\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0   SELECT NAME FROM APPLICATION_OWNER.SALARIES WHERE ID &lt;:&quot;SYS_B_0&quot;                      172.44.******\u00a0 \u00a0     oracle\r\n21-DEC-23 02.09.53.047973 PM +00:00<\/pre>\n<p>&nbsp;<\/p>\n<p>La requ\u00eate lanc\u00e9e par le compte APPLICATION est donc bien enregistr\u00e9e dans la liste des violations des r\u00e8gles du firewall.<\/p>\n<p>&nbsp;<\/p>\n<h4>Bloquer les requ\u00eates non d\u00e9sir\u00e9es<\/h4>\n<p>Le blocage de requ\u00eates s&#8217;effecctue, avec le compte FW_ADMIN, en activant le mode BLOCK sur la liste &#8220;verte&#8221;<\/p>\n<p>&nbsp;<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">SQL&gt; connect fw_admin@FREEPDB1\r\nEnter password:\r\nConnected.\r\nSQL&gt; exec dbms_sql_firewall.update_allow_list_enforcement('APPLICATION', block=&gt;TRUE);\r\n\r\nPL\/SQL procedure successfully completed.<\/pre>\n<p>&nbsp;<\/p>\n<p>Et lorsque nous souhaitons interroger la m\u00eame requ\u00eate avec le compte APPLICATION<\/p>\n<p>&nbsp;<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">SQL&gt; connect application@FREEPDB1\r\nEnter password:\r\nConnected.\r\nSQL&gt; select name from application_owner.salaries where id &gt; 300000;\r\nselect name from application_owner.salaries where id &gt; 300000\r\n*\r\nERROR at line 1:\r\nORA-47605: SQL Firewall violation\r\nHelp: https:\/\/docs.oracle.com\/error-help\/db\/ora-47605\/\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>Nous avons une belle erreur &#8220;ORA-47605&#8221; nous indiquant une violation des r\u00e8gles du Firewall. Petite nouveaut\u00e9 avec la 23c, Oracle nous donne l&#8217;URL pour rechercher directement la d\u00e9finition du message d&#8217;erreur.<\/p>\n<p>Ceci se v\u00e9rifie pour toute autre requ\u00eate ne faisant pas partie de la liste &#8220;verte&#8221;<\/p>\n<p>&nbsp;<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">SQL&gt; select * from application_owner.entreprise where taille_salaries &gt; 10000;\r\nselect * from application_owner.entreprise where taille_salaries &gt; 10000\r\n*\r\nERROR at line 1:\r\nORA-47605: SQL Firewall violation\r\nHelp: https:\/\/docs.oracle.com\/error-help\/db\/ora-47605\/<\/pre>\n<p>&nbsp;<\/p>\n<p>Dans la vue DBA_SQL_FIREWALL_VIOLATIONS, ces 2 derni\u00e8res requ\u00eates nous sont relev\u00e9es<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">SQL&gt; connect fw_admin@FREEPDB1\r\nEnter password:\r\nConnected.\r\nSQL&gt; select USERNAME,COMMAND_TYPE,SQL_TEXT,OCCURRED_AT from dba_sql_firewall_violations;\r\n\r\nUSERNAME COMMAND_TYPE SQL_TEXT\r\n-------------------- --------------- --------------------------------------------------------------------------------\r\nOCCURRED_AT\r\n---------------------------------------------------------------------------\r\nAPPLICATION SELECT SELECT * FROM APPLICATION_OWNER.ENTREPRISE WHERE TAILLE_SALARIES &gt;:&quot;SYS_B_0&quot;\r\n21-DEC-23 02.30.31.690170 PM +00:00\r\n\r\nAPPLICATION SELECT SELECT NAME FROM APPLICATION_OWNER.SALARIES WHERE ID &lt;:&quot;SYS_B_0&quot;\r\n21-DEC-23 02.09.53.047973 PM +00:00\r\n\r\nAPPLICATION SELECT SELECT NAME FROM APPLICATION_OWNER.SALARIES WHERE ID &lt;:&quot;SYS_B_0&quot;\r\n21-DEC-23 02.24.29.523017 PM +00:00<\/pre>\n<p>&nbsp;<\/p>\n<p>Il est bien entendu possible de purger la table de log des requ\u00eates interdites afin de r\u00e9initialiser son contenu.<\/p>\n<p>&nbsp;<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">SQL&gt; exec dbms_sql_firewall.purge_log('APPLICATION', NULL, dbms_sql_firewall.VIOLATION_LOG);\r\n\r\nPL\/SQL procedure successfully completed.\r\n\r\nSQL&gt; select USERNAME,COMMAND_TYPE,SQL_TEXT,OCCURRED_AT from dba_sql_firewall_violations;\r\n\r\nno rows selected<\/pre>\n<p>&nbsp;<\/p>\n<h2>Conclusion<\/h2>\n<p>&nbsp;<\/p>\n<p>Gardez \u00e0 l&#8217;esprit que cette fonctionnalit\u00e9 SQL Firewall de Oracle peut vous prot\u00e9ger de toute injection SQL non d\u00e9sir\u00e9e, mais ceci sous entend surtout que la phase &#8220;d&#8217;apprentissage&#8221; soit correctement maitris\u00e9e afin de ne pas se retrouver avec une application potentiellement bloqu\u00e9e par des ordres SQL qui ne s&#8217;ex\u00e9cutent plus.<\/p>\n<p>C&#8217;est bien pour cela que cette phase peut \u00eatre longue, et n\u00e9cessite le recensement de tr\u00e8s nombreuses requ\u00eates trapp\u00e9es dans DBA_SQL_FIREWALL_ALLOWED_SQL.<br \/>\nLa valeur de &#8220;SQL_SIGNATURE&#8221; est essentielle , dans la mesure ou le relev\u00e9 des variables est &#8220;bind\u00e9&#8221;, les requ\u00eates suivantes seront autoris\u00e9es m\u00eame si les r\u00e9sultats sont diff\u00e9rents\u00a0 :<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">SQL&gt; select name, address from application_owner.salaries where id = 510024;\r\n\r\nSQL&gt; select name, address from application_owner.salaries where id = 285548;<\/pre>\n<p>&nbsp;<\/p>\n<p>Pensez \u00e9galement \u00e0 purger la vue DBA_SQL_FIREWALL_VIOLATIONS de fa\u00e7on r\u00e9guli\u00e8re, tout en portant attention sur ce qui aura \u00e9t\u00e9 relev\u00e9 durant les p\u00e9riodes de production.<\/p>\n<p>&nbsp;<\/p>\n<p>\ud83d\ude42<\/p>\n<a class=\"synved-social-button synved-social-button-share synved-social-size-24 synved-social-resolution-single synved-social-provider-twitter nolightbox\" data-provider=\"twitter\" target=\"_blank\" rel=\"nofollow\" title=\"Share on Twitter\" href=\"https:\/\/twitter.com\/intent\/tweet?url=https%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fwp-json%2Fwp%2Fv2%2Fposts%2F10405&#038;text=Article%20sur%20le%20blog%20de%20la%20Capdata%20Tech%20Team%20%3A%20\" style=\"font-size: 0px;width:24px;height:24px;margin:0;margin-bottom:5px;margin-right:5px\"><img loading=\"lazy\" decoding=\"async\" alt=\"twitter\" title=\"Share on Twitter\" class=\"synved-share-image synved-social-image synved-social-image-share\" width=\"24\" height=\"24\" style=\"display: inline;width:24px;height:24px;margin: 0;padding: 0;border: none;box-shadow: none\" src=\"https:\/\/blog.capdata.fr\/wp-content\/plugins\/social-media-feather\/synved-social\/image\/social\/regular\/48x48\/twitter.png\" \/><\/a><a class=\"synved-social-button synved-social-button-share synved-social-size-24 synved-social-resolution-single synved-social-provider-linkedin nolightbox\" data-provider=\"linkedin\" target=\"_blank\" rel=\"nofollow\" title=\"Share on Linkedin\" href=\"https:\/\/www.linkedin.com\/shareArticle?mini=true&#038;url=https%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fwp-json%2Fwp%2Fv2%2Fposts%2F10405&#038;title=Oracle%2023c%20%3A%20se%20prot%C3%A9ger%20des%20attaques%20par%20injections%20SQL%20gr%C3%A2ce%20%C3%A0%20SQL%20Firewall\" style=\"font-size: 0px;width:24px;height:24px;margin:0;margin-bottom:5px;margin-right:5px\"><img loading=\"lazy\" decoding=\"async\" alt=\"linkedin\" title=\"Share on Linkedin\" class=\"synved-share-image synved-social-image synved-social-image-share\" width=\"24\" height=\"24\" style=\"display: inline;width:24px;height:24px;margin: 0;padding: 0;border: none;box-shadow: none\" src=\"https:\/\/blog.capdata.fr\/wp-content\/plugins\/social-media-feather\/synved-social\/image\/social\/regular\/48x48\/linkedin.png\" \/><\/a><a class=\"synved-social-button synved-social-button-share synved-social-size-24 synved-social-resolution-single synved-social-provider-mail nolightbox\" data-provider=\"mail\" rel=\"nofollow\" title=\"Share by email\" href=\"mailto:?subject=Oracle%2023c%20%3A%20se%20prot%C3%A9ger%20des%20attaques%20par%20injections%20SQL%20gr%C3%A2ce%20%C3%A0%20SQL%20Firewall&#038;body=Article%20sur%20le%20blog%20de%20la%20Capdata%20Tech%20Team%20%3A%20:%20https%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fwp-json%2Fwp%2Fv2%2Fposts%2F10405\" style=\"font-size: 0px;width:24px;height:24px;margin:0;margin-bottom:5px\"><img loading=\"lazy\" decoding=\"async\" alt=\"mail\" title=\"Share by email\" class=\"synved-share-image synved-social-image synved-social-image-share\" width=\"24\" height=\"24\" style=\"display: inline;width:24px;height:24px;margin: 0;padding: 0;border: none;box-shadow: none\" src=\"https:\/\/blog.capdata.fr\/wp-content\/plugins\/social-media-feather\/synved-social\/image\/social\/regular\/48x48\/mail.png\" \/><\/a>","protected":false},"excerpt":{"rendered":"<p>\u00a0 Bonjour \u00e0 toutes et tous et bonne ann\u00e9e 2024 ! Nous d\u00e9butons cette nouvelle ann\u00e9e avec un article, une fois de plus, en lien avec la s\u00e9curit\u00e9 ! C&#8217;est un sujet que nous avons grandement abord\u00e9 au cours de&hellip; <a href=\"https:\/\/blog.capdata.fr\/index.php\/oracle-23c-se-proteger-des-attaques-par-injections-sql-grace-a-sql-firewall\/\" class=\"more-link\">Continuer la lecture <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":32,"featured_media":10420,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3],"tags":[475,278,476],"class_list":["post-10405","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-oracle","tag-firewall","tag-securite","tag-sql-injection"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v20.8 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Oracle 23c : se prot\u00e9ger des attaques par injections SQL gr\u00e2ce \u00e0 SQL Firewall - Capdata TECH BLOG<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/blog.capdata.fr\/index.php\/oracle-23c-se-proteger-des-attaques-par-injections-sql-grace-a-sql-firewall\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Oracle 23c : se prot\u00e9ger des attaques par injections SQL gr\u00e2ce \u00e0 SQL Firewall - Capdata TECH BLOG\" \/>\n<meta property=\"og:description\" content=\"\u00a0 Bonjour \u00e0 toutes et tous et bonne ann\u00e9e 2024 ! Nous d\u00e9butons cette nouvelle ann\u00e9e avec un article, une fois de plus, en lien avec la s\u00e9curit\u00e9 ! C&#8217;est un sujet que nous avons grandement abord\u00e9 au cours de&hellip; Continuer la lecture &rarr;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blog.capdata.fr\/index.php\/oracle-23c-se-proteger-des-attaques-par-injections-sql-grace-a-sql-firewall\/\" \/>\n<meta property=\"og:site_name\" content=\"Capdata TECH BLOG\" \/>\n<meta property=\"article:published_time\" content=\"2024-01-03T08:00:02+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-01-03T07:47:11+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/12\/sql_inject.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1000\" \/>\n\t<meta property=\"og:image:height\" content=\"667\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Emmanuel RAMI\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u00c9crit par\" \/>\n\t<meta name=\"twitter:data1\" content=\"Emmanuel RAMI\" \/>\n\t<meta name=\"twitter:label2\" content=\"Dur\u00e9e de lecture estim\u00e9e\" \/>\n\t<meta name=\"twitter:data2\" content=\"15 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/blog.capdata.fr\/index.php\/oracle-23c-se-proteger-des-attaques-par-injections-sql-grace-a-sql-firewall\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/blog.capdata.fr\/index.php\/oracle-23c-se-proteger-des-attaques-par-injections-sql-grace-a-sql-firewall\/\"},\"author\":{\"name\":\"Emmanuel RAMI\",\"@id\":\"https:\/\/blog.capdata.fr\/#\/schema\/person\/797b9b6698fa35f7ce3e9a70a8b102ae\"},\"headline\":\"Oracle 23c : se prot\u00e9ger des attaques par injections SQL gr\u00e2ce \u00e0 SQL Firewall\",\"datePublished\":\"2024-01-03T08:00:02+00:00\",\"dateModified\":\"2024-01-03T07:47:11+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/blog.capdata.fr\/index.php\/oracle-23c-se-proteger-des-attaques-par-injections-sql-grace-a-sql-firewall\/\"},\"wordCount\":4088,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/blog.capdata.fr\/#organization\"},\"keywords\":[\"firewall\",\"s\u00e9curit\u00e9\",\"sql injection\"],\"articleSection\":[\"Oracle\"],\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/blog.capdata.fr\/index.php\/oracle-23c-se-proteger-des-attaques-par-injections-sql-grace-a-sql-firewall\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/blog.capdata.fr\/index.php\/oracle-23c-se-proteger-des-attaques-par-injections-sql-grace-a-sql-firewall\/\",\"url\":\"https:\/\/blog.capdata.fr\/index.php\/oracle-23c-se-proteger-des-attaques-par-injections-sql-grace-a-sql-firewall\/\",\"name\":\"Oracle 23c : se prot\u00e9ger des attaques par injections SQL gr\u00e2ce \u00e0 SQL Firewall - Capdata TECH BLOG\",\"isPartOf\":{\"@id\":\"https:\/\/blog.capdata.fr\/#website\"},\"datePublished\":\"2024-01-03T08:00:02+00:00\",\"dateModified\":\"2024-01-03T07:47:11+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/blog.capdata.fr\/index.php\/oracle-23c-se-proteger-des-attaques-par-injections-sql-grace-a-sql-firewall\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/blog.capdata.fr\/index.php\/oracle-23c-se-proteger-des-attaques-par-injections-sql-grace-a-sql-firewall\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/blog.capdata.fr\/index.php\/oracle-23c-se-proteger-des-attaques-par-injections-sql-grace-a-sql-firewall\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\/\/blog.capdata.fr\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Oracle 23c : se prot\u00e9ger des attaques par injections SQL gr\u00e2ce \u00e0 SQL Firewall\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/blog.capdata.fr\/#website\",\"url\":\"https:\/\/blog.capdata.fr\/\",\"name\":\"Capdata TECH BLOG\",\"description\":\"Le blog technique sur les bases de donn\u00e9es de CAP DATA Consulting\",\"publisher\":{\"@id\":\"https:\/\/blog.capdata.fr\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/blog.capdata.fr\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"fr-FR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/blog.capdata.fr\/#organization\",\"name\":\"Capdata TECH BLOG\",\"url\":\"https:\/\/blog.capdata.fr\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\/\/blog.capdata.fr\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/01\/logo_capdata.webp\",\"contentUrl\":\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/01\/logo_capdata.webp\",\"width\":800,\"height\":254,\"caption\":\"Capdata TECH BLOG\"},\"image\":{\"@id\":\"https:\/\/blog.capdata.fr\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.linkedin.com\/company\/cap-data-consulting\/mycompany\/\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/blog.capdata.fr\/#\/schema\/person\/797b9b6698fa35f7ce3e9a70a8b102ae\",\"name\":\"Emmanuel RAMI\",\"sameAs\":[\"https:\/\/blog.capdata.fr\"],\"url\":\"https:\/\/blog.capdata.fr\/index.php\/author\/erami\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Oracle 23c : se prot\u00e9ger des attaques par injections SQL gr\u00e2ce \u00e0 SQL Firewall - Capdata TECH BLOG","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/blog.capdata.fr\/index.php\/oracle-23c-se-proteger-des-attaques-par-injections-sql-grace-a-sql-firewall\/","og_locale":"fr_FR","og_type":"article","og_title":"Oracle 23c : se prot\u00e9ger des attaques par injections SQL gr\u00e2ce \u00e0 SQL Firewall - Capdata TECH BLOG","og_description":"\u00a0 Bonjour \u00e0 toutes et tous et bonne ann\u00e9e 2024 ! Nous d\u00e9butons cette nouvelle ann\u00e9e avec un article, une fois de plus, en lien avec la s\u00e9curit\u00e9 ! C&#8217;est un sujet que nous avons grandement abord\u00e9 au cours de&hellip; Continuer la lecture &rarr;","og_url":"https:\/\/blog.capdata.fr\/index.php\/oracle-23c-se-proteger-des-attaques-par-injections-sql-grace-a-sql-firewall\/","og_site_name":"Capdata TECH BLOG","article_published_time":"2024-01-03T08:00:02+00:00","article_modified_time":"2024-01-03T07:47:11+00:00","og_image":[{"width":1000,"height":667,"url":"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/12\/sql_inject.jpg","type":"image\/jpeg"}],"author":"Emmanuel RAMI","twitter_card":"summary_large_image","twitter_misc":{"\u00c9crit par":"Emmanuel RAMI","Dur\u00e9e de lecture estim\u00e9e":"15 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/blog.capdata.fr\/index.php\/oracle-23c-se-proteger-des-attaques-par-injections-sql-grace-a-sql-firewall\/#article","isPartOf":{"@id":"https:\/\/blog.capdata.fr\/index.php\/oracle-23c-se-proteger-des-attaques-par-injections-sql-grace-a-sql-firewall\/"},"author":{"name":"Emmanuel RAMI","@id":"https:\/\/blog.capdata.fr\/#\/schema\/person\/797b9b6698fa35f7ce3e9a70a8b102ae"},"headline":"Oracle 23c : se prot\u00e9ger des attaques par injections SQL gr\u00e2ce \u00e0 SQL Firewall","datePublished":"2024-01-03T08:00:02+00:00","dateModified":"2024-01-03T07:47:11+00:00","mainEntityOfPage":{"@id":"https:\/\/blog.capdata.fr\/index.php\/oracle-23c-se-proteger-des-attaques-par-injections-sql-grace-a-sql-firewall\/"},"wordCount":4088,"commentCount":0,"publisher":{"@id":"https:\/\/blog.capdata.fr\/#organization"},"keywords":["firewall","s\u00e9curit\u00e9","sql injection"],"articleSection":["Oracle"],"inLanguage":"fr-FR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/blog.capdata.fr\/index.php\/oracle-23c-se-proteger-des-attaques-par-injections-sql-grace-a-sql-firewall\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/blog.capdata.fr\/index.php\/oracle-23c-se-proteger-des-attaques-par-injections-sql-grace-a-sql-firewall\/","url":"https:\/\/blog.capdata.fr\/index.php\/oracle-23c-se-proteger-des-attaques-par-injections-sql-grace-a-sql-firewall\/","name":"Oracle 23c : se prot\u00e9ger des attaques par injections SQL gr\u00e2ce \u00e0 SQL Firewall - Capdata TECH BLOG","isPartOf":{"@id":"https:\/\/blog.capdata.fr\/#website"},"datePublished":"2024-01-03T08:00:02+00:00","dateModified":"2024-01-03T07:47:11+00:00","breadcrumb":{"@id":"https:\/\/blog.capdata.fr\/index.php\/oracle-23c-se-proteger-des-attaques-par-injections-sql-grace-a-sql-firewall\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blog.capdata.fr\/index.php\/oracle-23c-se-proteger-des-attaques-par-injections-sql-grace-a-sql-firewall\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/blog.capdata.fr\/index.php\/oracle-23c-se-proteger-des-attaques-par-injections-sql-grace-a-sql-firewall\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/blog.capdata.fr\/"},{"@type":"ListItem","position":2,"name":"Oracle 23c : se prot\u00e9ger des attaques par injections SQL gr\u00e2ce \u00e0 SQL Firewall"}]},{"@type":"WebSite","@id":"https:\/\/blog.capdata.fr\/#website","url":"https:\/\/blog.capdata.fr\/","name":"Capdata TECH BLOG","description":"Le blog technique sur les bases de donn\u00e9es de CAP DATA Consulting","publisher":{"@id":"https:\/\/blog.capdata.fr\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blog.capdata.fr\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"fr-FR"},{"@type":"Organization","@id":"https:\/\/blog.capdata.fr\/#organization","name":"Capdata TECH BLOG","url":"https:\/\/blog.capdata.fr\/","logo":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/blog.capdata.fr\/#\/schema\/logo\/image\/","url":"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/01\/logo_capdata.webp","contentUrl":"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/01\/logo_capdata.webp","width":800,"height":254,"caption":"Capdata TECH BLOG"},"image":{"@id":"https:\/\/blog.capdata.fr\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.linkedin.com\/company\/cap-data-consulting\/mycompany\/"]},{"@type":"Person","@id":"https:\/\/blog.capdata.fr\/#\/schema\/person\/797b9b6698fa35f7ce3e9a70a8b102ae","name":"Emmanuel RAMI","sameAs":["https:\/\/blog.capdata.fr"],"url":"https:\/\/blog.capdata.fr\/index.php\/author\/erami\/"}]}},"_links":{"self":[{"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/posts\/10405","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/users\/32"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/comments?post=10405"}],"version-history":[{"count":29,"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/posts\/10405\/revisions"}],"predecessor-version":[{"id":10443,"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/posts\/10405\/revisions\/10443"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/media\/10420"}],"wp:attachment":[{"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/media?parent=10405"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/categories?post=10405"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/tags?post=10405"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}