{"id":8010,"date":"2017-12-17T00:46:08","date_gmt":"2017-12-16T23:46:08","guid":{"rendered":"https:\/\/www.salvis.com\/blog\/?p=8010"},"modified":"2023-11-08T20:38:06","modified_gmt":"2023-11-08T19:38:06","slug":"how-to-prove-that-your-smartdb-app-is-secured-against-sql-injection-attacks","status":"publish","type":"post","link":"https:\/\/www.salvis.com\/blog\/2017\/12\/17\/how-to-prove-that-your-smartdb-app-is-secured-against-sql-injection-attacks\/","title":{"rendered":"How to Prove That Your SmartDB App Is Secure"},"content":{"rendered":"\n<p>If you are <a href=\"https:\/\/community.oracle.com\/servlet\/JiveServlet\/downloadBody\/1018915-102-1-164853\/Guarding_Your_Data_Behind_a_Hard_Shell_Plsql_API.pdf\">guarding your data behind a hard shell PL\/SQL API<\/a>&nbsp;as Bryn Llewellyn, Toon Koppelaars and others recommend, then it should be quite easy to prove, that your PL\/SQL application is secured against <a href=\"https:\/\/en.wikipedia.org\/wiki\/SQL_injection\">SQL injection<\/a> attacks. The basic idea is 1) that you do not expose data via tables nor views to Oracle users used in the middle-tier, by end-users and in the GUI; and 2) that you use only static SQL within PL\/SQL packages. By following these two rules, you ensure that only SQL statements with bind variables are used in your application, making the injection of unwanted SQL fragments impossible. In this blog post, I show how to check if an application is complying with these two rules.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Demo Applications<\/h2>\n\n\n\n<p>I&#8217;ve prepared three tiny demo applications to visualise what guarding data behind a hard shell PL\/SQL API means and how static and dynamic SQL can be used within Oracle Database 12c Release 2 (12.2). You may install these applications using <a href=\"https:\/\/gist.github.com\/PhilippSalvisberg\/052b1321b0207bd71f1f1b44eb03a8fc#file-install_demo_apps-sql\">this script<\/a>.<br \/><\/p>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-9d6595d7 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<h3 class=\"wp-block-heading has-text-align-center\">The Good<\/h3>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><a href=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/12\/the_good.png\"><img loading=\"lazy\" decoding=\"async\" width=\"236\" height=\"124\" src=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/12\/the_good.png\" alt=\"\" class=\"wp-image-8043\" srcset=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/12\/the_good.png 236w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/12\/the_good-50x26.png 50w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/12\/the_good-143x75.png 143w\" sizes=\"auto, (max-width:767px) 236px, 236px\" \/><\/a><\/figure>\n<\/div>\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-medium\"><a href=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/12\/the_good_layers.png\"><img loading=\"lazy\" decoding=\"async\" width=\"300\" height=\"300\" src=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/12\/the_good_layers-300x300.png\" alt=\"\" class=\"wp-image-8047\" style=\"object-fit:cover\" srcset=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/12\/the_good_layers-300x300.png 300w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/12\/the_good_layers-150x150.png 150w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/12\/the_good_layers-146x146.png 146w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/12\/the_good_layers-50x50.png 50w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/12\/the_good_layers-75x75.png 75w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/12\/the_good_layers-85x85.png 85w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/12\/the_good_layers-80x80.png 80w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/12\/the_good_layers.png 618w\" sizes=\"auto, (max-width:767px) 300px, 300px\" \/><\/a><\/figure>\n<\/div>\n\n\n<p>The table T is stored in the schema THE_GOOD_DATA and grants SELECT, INSERT, UPDATE and DELETE privileges to the schema&nbsp; THE_GOOD_API. This schema owns the PL\/SQL package PKG, which implements the data access to table T via static SQL to eliminate the risk of SQL injection. The EXECUTE right on PKG is granted to THE_GOOD_USER. This user has the CONNECT role only and can be safely configured in the connection pool of the middle-tier application.<\/p>\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:#D4D4D4;--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:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">The Good Data Access<\/span><span role=\"button\" tabindex=\"0\" data-code=\"CREATE OR REPLACE PACKAGE BODY \n   the_good_api.pkg \nAS\n   FUNCTION f2 (\n      p_c2 IN VARCHAR2\n   ) RETURN CLOB IS\n      l_result CLOB;\n      l_c2 the_good_data.t.c2%TYPE;\n   BEGIN\n      l_c2 := p_c2;\n      SELECT JSON_ARRAYAGG (\n                JSON_OBJECT (\n                   'c1' value c1,\n                   'c2' value c2\n                ) \n                RETURNING CLOB\n             )\n        INTO l_result\n        FROM the_good_data.t\n       WHERE lower(c2) LIKE '%' \n             || lower(l_c2) || '%';\n      RETURN l_result;\n   END f2;\nEND pkg;\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><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 dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #569CD6\">CREATE OR REPLACE<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">PACKAGE<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">BODY<\/span><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   the_good_api.pkg <\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">AS<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #569CD6\">FUNCTION<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">f2<\/span><span style=\"color: #D4D4D4\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      p_c2 <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">VARCHAR2<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   ) <\/span><span style=\"color: #C586C0\">RETURN<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">CLOB<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">IS<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">l_result<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">CLOB<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">l_c2<\/span><span style=\"color: #D4D4D4\"> the_good_data.t.c2%<\/span><span style=\"color: #569CD6\">TYPE<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #569CD6\">BEGIN<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">l_c2<\/span><span style=\"color: #D4D4D4\"> := p_c2;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> JSON_ARRAYAGG (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                JSON_OBJECT (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                   <\/span><span style=\"color: #CE9178\">&#39;c1&#39;<\/span><span style=\"color: #D4D4D4\"> value c1,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                   <\/span><span style=\"color: #CE9178\">&#39;c2&#39;<\/span><span style=\"color: #D4D4D4\"> value c2<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                ) <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #569CD6\">RETURNING<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">CLOB<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">INTO<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">l_result<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> the_good_data.t<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       <\/span><span style=\"color: #569CD6\">WHERE<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">lower<\/span><span style=\"color: #D4D4D4\">(c2) <\/span><span style=\"color: #569CD6\">LIKE<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&#39;%&#39;<\/span><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             || <\/span><span style=\"color: #DCDCAA\">lower<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">l_c2<\/span><span style=\"color: #D4D4D4\">) || <\/span><span style=\"color: #CE9178\">&#39;%&#39;<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #C586C0\">RETURN<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">l_result<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #569CD6\">END<\/span><span style=\"color: #D4D4D4\"> f2;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">END<\/span><span style=\"color: #D4D4D4\"> pkg;<\/span><\/span><\/code><\/pre><\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<h3 class=\"wp-block-heading has-text-align-center\">The Bad<\/h3>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><a href=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/12\/the_bad.png\"><img loading=\"lazy\" decoding=\"async\" width=\"236\" height=\"124\" src=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/12\/the_bad.png\" alt=\"\" class=\"wp-image-8044\" srcset=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/12\/the_bad.png 236w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/12\/the_bad-50x26.png 50w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/12\/the_bad-143x75.png 143w\" sizes=\"auto, (max-width:767px) 236px, 236px\" \/><\/a><\/figure>\n<\/div>\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-medium\"><a href=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/12\/the_bad_layers.png\"><img loading=\"lazy\" decoding=\"async\" width=\"300\" height=\"300\" src=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/12\/the_bad_layers-300x300.png\" alt=\"\" class=\"wp-image-8048\" style=\"object-fit:cover\" srcset=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/12\/the_bad_layers-300x300.png 300w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/12\/the_bad_layers-150x150.png 150w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/12\/the_bad_layers-146x146.png 146w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/12\/the_bad_layers-50x50.png 50w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/12\/the_bad_layers-75x75.png 75w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/12\/the_bad_layers-85x85.png 85w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/12\/the_bad_layers-80x80.png 80w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/12\/the_bad_layers.png 618w\" sizes=\"auto, (max-width:767px) 300px, 300px\" \/><\/a><\/figure>\n<\/div>\n\n\n<p>This application looks very similar to &#8220;The Good&#8221;. One difference is, that the access to table T is implemented through dynamic SQL. There is also a private PL\/SQL package named PKG2 which does a series of bad things with dynamic SQL. The implementation of all dynamic SQL is safe, there is no SQL injection possible. However, it is difficult to come to this conclusion by static code analysis and since the use of dynamic SQL is not necessary, this application is considered bad.<\/p>\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:#D4D4D4;--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:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">The Bad Data Access<\/span><span role=\"button\" tabindex=\"0\" data-code=\"CREATE OR REPLACE PACKAGE BODY \n   the_bad_api.pkg \nAS\n   FUNCTION f2 (\n      p_c2 IN VARCHAR2\n   ) RETURN CLOB IS\n      co_sql_template CONSTANT CLOB\n         := q'[\n   SELECT JSON_ARRAYAGG (\n             JSON_OBJECT (\n                'c1' value c1, \n                'c2' value c2\n             ) \n             RETURNING CLOB\n          )\n     FROM the_bad_data.t\n    WHERE lower(c2) LIKE '%' \n          || lower(:c2_bind) || '%'\n         ]';     \n      l_result CLOB;\n      l_c2 the_bad_data.t.c2%TYPE;\n   BEGIN\n      l_c2 := p_c2;\n      EXECUTE IMMEDIATE \n              co_sql_template \n         INTO l_result USING l_c2;\n      RETURN l_result;\n   END f2;\nEND pkg;\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><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 dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #569CD6\">CREATE OR REPLACE<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">PACKAGE<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">BODY<\/span><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   the_bad_api.pkg <\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">AS<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #569CD6\">FUNCTION<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">f2<\/span><span style=\"color: #D4D4D4\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      p_c2 <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">VARCHAR2<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   ) <\/span><span style=\"color: #C586C0\">RETURN<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">CLOB<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">IS<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      co_sql_template <\/span><span style=\"color: #569CD6\">CONSTANT<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">CLOB<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         := q<\/span><span style=\"color: #CE9178\">&#39;[<\/span><\/span>\n<span class=\"line\"><span style=\"color: #CE9178\">   SELECT JSON_ARRAYAGG (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #CE9178\">             JSON_OBJECT (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #CE9178\">                &#39;<\/span><span style=\"color: #D4D4D4\">c1<\/span><span style=\"color: #CE9178\">&#39; value c1, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #CE9178\">                &#39;<\/span><span style=\"color: #D4D4D4\">c2<\/span><span style=\"color: #CE9178\">&#39; value c2<\/span><\/span>\n<span class=\"line\"><span style=\"color: #CE9178\">             ) <\/span><\/span>\n<span class=\"line\"><span style=\"color: #CE9178\">             RETURNING CLOB<\/span><\/span>\n<span class=\"line\"><span style=\"color: #CE9178\">          )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #CE9178\">     FROM the_bad_data.t<\/span><\/span>\n<span class=\"line\"><span style=\"color: #CE9178\">    WHERE lower(c2) LIKE &#39;<\/span><span style=\"color: #D4D4D4\">%<\/span><span style=\"color: #CE9178\">&#39; <\/span><\/span>\n<span class=\"line\"><span style=\"color: #CE9178\">          || lower(:c2_bind) || &#39;<\/span><span style=\"color: #D4D4D4\">%<\/span><span style=\"color: #CE9178\">&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #CE9178\">         ]&#39;<\/span><span style=\"color: #D4D4D4\">;     <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">l_result<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">CLOB<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">l_c2<\/span><span style=\"color: #D4D4D4\"> the_bad_data.t.c2%<\/span><span style=\"color: #569CD6\">TYPE<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #569CD6\">BEGIN<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">l_c2<\/span><span style=\"color: #D4D4D4\"> := p_c2;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #DCDCAA\">EXECUTE IMMEDIATE<\/span><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">              co_sql_template <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         <\/span><span style=\"color: #569CD6\">INTO<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">l_result<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">USING<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">l_c2<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #C586C0\">RETURN<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">l_result<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #569CD6\">END<\/span><span style=\"color: #D4D4D4\"> f2;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">END<\/span><span style=\"color: #D4D4D4\"> pkg;<\/span><\/span><\/code><\/pre><\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<h3 class=\"wp-block-heading has-text-align-center\">The Ugly<\/h3>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><a href=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/12\/the_ugly.png\"><img loading=\"lazy\" decoding=\"async\" width=\"236\" height=\"124\" src=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/12\/the_ugly.png\" alt=\"\" class=\"wp-image-8045\" srcset=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/12\/the_ugly.png 236w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/12\/the_ugly-50x26.png 50w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/12\/the_ugly-143x75.png 143w\" sizes=\"auto, (max-width:767px) 236px, 236px\" \/><\/a><\/figure>\n<\/div>\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-medium\"><a href=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/12\/the_ugly_layers-1.png\"><img loading=\"lazy\" decoding=\"async\" width=\"300\" height=\"300\" src=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/12\/the_ugly_layers-1-300x300.png\" alt=\"\" class=\"wp-image-8057\" style=\"object-fit:cover\" srcset=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/12\/the_ugly_layers-1-300x300.png 300w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/12\/the_ugly_layers-1-150x150.png 150w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/12\/the_ugly_layers-1-146x146.png 146w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/12\/the_ugly_layers-1-50x50.png 50w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/12\/the_ugly_layers-1-75x75.png 75w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/12\/the_ugly_layers-1-85x85.png 85w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/12\/the_ugly_layers-1-80x80.png 80w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/12\/the_ugly_layers-1.png 618w\" sizes=\"auto, (max-width:767px) 300px, 300px\" \/><\/a><\/figure>\n<\/div>\n\n\n<p>The table T is stored in the schema THE_UGLY_DATA and grants SELECT, INSERT, UPDATE and DELETE privileges to THE_UGLY_USER. This user has the CONNECT role only. This is good and prohibits schema extensions. But without a PL\/SQL API layer, there is no way to prevent SQL injection in the database. This is now becoming a responsibility of the middle-tier application along with other duties such as data consistency and efficient data processing.<\/p>\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:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .75rem);line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">The Ugly Data Access<\/span><span role=\"button\" tabindex=\"0\" data-code=\"\/* not available\n *\n * Query is crafted in \n * the middle tier application\n *\/\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><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 dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #6A9955\">\/* not available<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> *<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * Query is crafted in <\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * the middle tier application<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> *\/<\/span><\/span><\/code><\/pre><\/div>\n<\/div>\n<\/div>\n\n\n\n<div style=\"height:10px\" 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:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">Example result of a PKG.F2(&#8216;SQL&#8217;) call<\/span><span role=\"button\" tabindex=\"0\" data-code=\"[\n   {\n      &quot;c1&quot;: 2,\n      &quot;c2&quot;: &quot;I like SQL.&quot;\n   },\n   {\n      &quot;c1&quot;: 3,\n      &quot;c2&quot;: &quot;And JSON is part of SQL and PL\/SQL.&quot;\n   }\n]\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><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 dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D4D4D4\">[<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">&quot;c1&quot;<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #B5CEA8\">2<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">&quot;c2&quot;<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">&quot;I like SQL.&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   },<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">&quot;c1&quot;<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #B5CEA8\">3<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">&quot;c2&quot;<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">&quot;And JSON is part of SQL and PL\/SQL.&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">]<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Rule 1) Do not expose data via tables nor views<\/h2>\n\n\n\n<p>The idea behind a hard shell PL\/SQL is to expose data through PL\/SQL units only. Direct access to tables or views is unwanted. The Oracle users configured in the connection pool of the middle tier, need the CONNECT role and EXECUTE rights on the PL\/SQL API only. These rights may be granted directly or indirectly via various levels of Oracle roles.<\/p>\n\n\n\n<p>The following query shows if an Oracle database user is ready&nbsp;to be used in the middle-tier application. Oracle users maintained by Oracle itself, such as SYS, SYSTEM, SYSAUX, etc. are excluded along with some other users which grant objects to PUBLIC (see lines 35 to 38). To execute this query you need the SELECT_CATALOG_ROLE.<\/p>\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:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(3 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(234, 191, 191, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">Users ready to be used in the middle tier<\/span><span role=\"button\" tabindex=\"0\" data-code=\"WITH\n   -- roles as recursive structure\n   role_base AS (\n      -- roles without parent (=roots)\n      SELECT r.role, NULL AS parent_role\n        FROM dba_roles r\n       WHERE r.role NOT IN (\n                SELECT p.granted_role\n                  FROM role_role_privs p\n             )\n      UNION ALL\n      -- roles with parent (=children)\n      SELECT granted_role AS role, role AS parent_role\n        FROM role_role_privs\n   ),\n   -- roles tree, calculate role_path for every hierarchy level\n   role_tree AS (\n      SELECT role,\n             parent_role,\n             sys_connect_by_path(ROLE, '\/') AS role_path\n        FROM role_base\n      CONNECT BY PRIOR role = parent_role\n   ),\n   -- roles graph, child added to all ancestors including self\n   -- allows simple join to parent_role to find all descendants\n   role_graph AS (\n      SELECT DISTINCT\n             role,\n             regexp_substr(role_path, '(\/)(\\w+)', 1, 1, 'i', 2) AS parent_role\n        FROM role_tree\n   ),\n   -- application users in scope of the analysis\n   -- other users are treated as if they were not istalled\n   app_user AS (\n      SELECT username\n        FROM dba_users\n       WHERE oracle_maintained = 'N' -- SYS, SYSTEM, SYSAUX, ...\n         AND username NOT IN ('FTLDB', 'PLSCOPE')\n   ),\n   -- user system privileges\n   sys_priv AS (\n      -- system privileges granted directly to users\n      SELECT u.username, p.privilege\n        FROM dba_sys_privs p\n        JOIN app_user u ON u.username = p.grantee\n      UNION\n      -- system privileges granted directly to PUBLIC\n      SELECT u.username, p.privilege\n        FROM dba_sys_privs p\n       CROSS JOIN app_user u\n       WHERE p.grantee = 'PUBLIC'\n         AND p.privilege NOT IN (\n                SELECT r.role\n                  FROM dba_roles r\n             )\n      UNION\n      -- system privileges granted to users via roles\n      SELECT u.username, p.privilege\n        FROM dba_role_privs r\n        JOIN app_user u ON u.username = r.grantee\n        JOIN role_graph g ON g.parent_role = r.granted_role\n        JOIN dba_sys_privs p ON p.grantee = g.role\n      UNION\n      -- system privileges granted to PUBLIC via roles\n      SELECT u.username, p.privilege\n        FROM dba_role_privs r\n        JOIN role_graph g ON g.parent_role = r.granted_role\n        JOIN dba_sys_privs p ON p.grantee = g.role\n        CROSS JOIN app_user u\n       WHERE r.grantee = 'PUBLIC'\n   ),\n   -- user object privileges\n   obj_priv AS (\n      -- objects granted directly to users\n      SELECT u.username, p.owner, p.type AS object_type, p.table_name AS object_name\n        FROM dba_tab_privs p\n        JOIN app_user u ON u.username = p.grantee\n       WHERE p.owner IN (\n                SELECT u2.username\n                  FROM app_user u2\n             )\n      UNION\n      -- objects granted to users via roles\n      SELECT u.username, p.owner, p.type AS object_type, p.table_name AS object_name\n        FROM dba_role_privs r\n        JOIN app_user u ON u.username = r.grantee\n        JOIN role_graph g ON g.parent_role = r.granted_role\n        JOIN dba_tab_privs p ON p.grantee = g.role\n       WHERE p.owner IN (\n                SELECT u2.username\n                  FROM app_user u2\n             )\n      -- objects granted to PUBLIC\n      UNION\n      SELECT u.username, p.owner, p.type AS object_type, p.table_name AS object_name\n        FROM dba_tab_privs p\n       CROSS JOIN app_user u\n       WHERE p.owner IN (\n                SELECT u2.username\n                  FROM app_user u2\n             )\n         AND p.grantee = 'PUBLIC'\n   ),\n   -- issues if user is configured in the connection pool of a middle tier\n   issues AS (\n      -- privileges not part of CONNECT role\n      SELECT username,\n             'SYS' AS owner,\n             'PRIVILEGE' AS object_type,\n             privilege AS object_name,\n             'Privilege is not part of the CONNECT role' AS issue\n        FROM sys_priv\n       WHERE privilege NOT IN ('CREATE SESSION', 'SET CONTAINER')\n      UNION ALL\n      -- access to non PL\/SQL units\n      SELECT username,\n             owner,\n             object_type,\n             object_name,\n             'Access to non-PL\/SQL unit'\n        FROM obj_priv\n       WHERE object_type NOT IN ('PACKAGE', 'TYPE', 'FUNCTION', 'PROCEDURE')\n      -- own objects\n      UNION ALL\n      SELECT u.username,\n             o.owner,\n             o.object_type,\n             o.object_name,\n             'Connect user must not own any object'\n        FROM app_user u\n        JOIN dba_objects o ON o.owner = u.username\n      -- missing CREATE SESSION privilege\n      UNION ALL\n      SELECT u.username,\n             'SYS',\n             'PRIVILEGE',\n             'CREATE SESSION',\n             'Privilege is missing, but required'\n        FROM app_user u\n       WHERE u.username NOT IN (\n                SELECT username\n                  FROM sys_priv\n                 WHERE privilege = 'CREATE SESSION' \n             )\n   ),\n   -- aggregate issues per user\n   issue_aggr AS (\n      SELECT u.username, COUNT(i.username) issue_count\n        FROM app_user u\n        LEFT JOIN issues i ON i.username = u.username\n       GROUP BY u.username\n   ),\n   -- user summary (calculate is_connect_user_ready)\n   summary AS (\n      SELECT username,\n             CASE\n                WHEN issue_count = 0 THEN\n                   'YES'\n                ELSE\n                   'NO'\n             END AS is_connect_user_ready,\n             issue_count\n        FROM issue_aggr\n       ORDER BY is_connect_user_ready DESC, username\n   )\n-- main\nSELECT * \n  FROM summary\n WHERE username LIKE 'THE%';\n \nUSERNAME      IS_CONNECT_USER_READY ISSUE_COUNT\n------------- --------------------- -----------\nTHE_BAD_USER  YES                             0\nTHE_GOOD_USER YES                             0\nTHE_BAD_API   NO                              9\nTHE_BAD_DATA  NO                              3\nTHE_GOOD_API  NO                              4\nTHE_GOOD_DATA NO                              3\nTHE_UGLY_DATA NO                             10\nTHE_UGLY_USER NO                              1\n \n8 rows selected.\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><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 dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #569CD6\">WITH<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #6A9955\">-- roles as recursive structure<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   role_base <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #6A9955\">-- roles without parent (=roots)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> r.role, <\/span><span style=\"color: #569CD6\">NULL<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> parent_role<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> dba_roles r<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       <\/span><span style=\"color: #569CD6\">WHERE<\/span><span style=\"color: #D4D4D4\"> r.role <\/span><span style=\"color: #569CD6\">NOT<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> p.granted_role<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                  <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> role_role_privs p<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">UNION ALL<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #6A9955\">-- roles with parent (=children)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> granted_role <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">role<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #569CD6\">role<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> parent_role<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> role_role_privs<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   ),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #6A9955\">-- roles tree, calculate role_path for every hierarchy level<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   role_tree <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">role<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             parent_role,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             sys_connect_by_path(<\/span><span style=\"color: #569CD6\">ROLE<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;\/&#39;<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> role_path<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> role_base<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">CONNECT<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">BY<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">PRIOR<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">role<\/span><span style=\"color: #D4D4D4\"> = parent_role<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   ),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #6A9955\">-- roles graph, child added to all ancestors including self<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #6A9955\">-- allows simple join to parent_role to find all descendants<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   role_graph <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">SELECT DISTINCT<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             <\/span><span style=\"color: #569CD6\">role<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             regexp_substr(role_path, <\/span><span style=\"color: #CE9178\">&#39;(\/)(\\w+)&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;i&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">2<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> parent_role<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> role_tree<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   ),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #6A9955\">-- application users in scope of the analysis<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #6A9955\">-- other users are treated as if they were not istalled<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   app_user <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> (<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> username<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> dba_users<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">       <\/span><span style=\"color: #569CD6\">WHERE<\/span><span style=\"color: #D4D4D4\"> oracle_maintained = <\/span><span style=\"color: #CE9178\">&#39;N&#39;<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #6A9955\">-- SYS, SYSTEM, SYSAUX, ...<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">         <\/span><span style=\"color: #569CD6\">AND<\/span><span style=\"color: #D4D4D4\"> username <\/span><span style=\"color: #569CD6\">NOT<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #CE9178\">&#39;FTLDB&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;PLSCOPE&#39;<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   ),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #6A9955\">-- user system privileges<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   sys_priv <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #6A9955\">-- system privileges granted directly to users<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> u.username, p.privilege<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> dba_sys_privs p<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">JOIN<\/span><span style=\"color: #D4D4D4\"> app_user u <\/span><span style=\"color: #569CD6\">ON<\/span><span style=\"color: #D4D4D4\"> u.username = p.grantee<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">UNION<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #6A9955\">-- system privileges granted directly to PUBLIC<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> u.username, p.privilege<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> dba_sys_privs p<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       <\/span><span style=\"color: #569CD6\">CROSS JOIN<\/span><span style=\"color: #D4D4D4\"> app_user u<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       <\/span><span style=\"color: #569CD6\">WHERE<\/span><span style=\"color: #D4D4D4\"> p.grantee = <\/span><span style=\"color: #CE9178\">&#39;PUBLIC&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         <\/span><span style=\"color: #569CD6\">AND<\/span><span style=\"color: #D4D4D4\"> p.privilege <\/span><span style=\"color: #569CD6\">NOT<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> r.role<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                  <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> dba_roles r<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">UNION<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #6A9955\">-- system privileges granted to users via roles<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> u.username, p.privilege<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> dba_role_privs r<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">JOIN<\/span><span style=\"color: #D4D4D4\"> app_user u <\/span><span style=\"color: #569CD6\">ON<\/span><span style=\"color: #D4D4D4\"> u.username = r.grantee<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">JOIN<\/span><span style=\"color: #D4D4D4\"> role_graph g <\/span><span style=\"color: #569CD6\">ON<\/span><span style=\"color: #D4D4D4\"> g.parent_role = r.granted_role<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">JOIN<\/span><span style=\"color: #D4D4D4\"> dba_sys_privs p <\/span><span style=\"color: #569CD6\">ON<\/span><span style=\"color: #D4D4D4\"> p.grantee = g.role<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">UNION<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #6A9955\">-- system privileges granted to PUBLIC via roles<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> u.username, p.privilege<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> dba_role_privs r<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">JOIN<\/span><span style=\"color: #D4D4D4\"> role_graph g <\/span><span style=\"color: #569CD6\">ON<\/span><span style=\"color: #D4D4D4\"> g.parent_role = r.granted_role<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">JOIN<\/span><span style=\"color: #D4D4D4\"> dba_sys_privs p <\/span><span style=\"color: #569CD6\">ON<\/span><span style=\"color: #D4D4D4\"> p.grantee = g.role<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">CROSS JOIN<\/span><span style=\"color: #D4D4D4\"> app_user u<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       <\/span><span style=\"color: #569CD6\">WHERE<\/span><span style=\"color: #D4D4D4\"> r.grantee = <\/span><span style=\"color: #CE9178\">&#39;PUBLIC&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   ),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #6A9955\">-- user object privileges<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   obj_priv <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #6A9955\">-- objects granted directly to users<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> u.username, p.owner, p.type <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> object_type, p.table_name <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> object_name<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> dba_tab_privs p<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">JOIN<\/span><span style=\"color: #D4D4D4\"> app_user u <\/span><span style=\"color: #569CD6\">ON<\/span><span style=\"color: #D4D4D4\"> u.username = p.grantee<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       <\/span><span style=\"color: #569CD6\">WHERE<\/span><span style=\"color: #D4D4D4\"> p.owner <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> u2.username<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                  <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> app_user u2<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">UNION<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #6A9955\">-- objects granted to users via roles<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> u.username, p.owner, p.type <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> object_type, p.table_name <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> object_name<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> dba_role_privs r<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">JOIN<\/span><span style=\"color: #D4D4D4\"> app_user u <\/span><span style=\"color: #569CD6\">ON<\/span><span style=\"color: #D4D4D4\"> u.username = r.grantee<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">JOIN<\/span><span style=\"color: #D4D4D4\"> role_graph g <\/span><span style=\"color: #569CD6\">ON<\/span><span style=\"color: #D4D4D4\"> g.parent_role = r.granted_role<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">JOIN<\/span><span style=\"color: #D4D4D4\"> dba_tab_privs p <\/span><span style=\"color: #569CD6\">ON<\/span><span style=\"color: #D4D4D4\"> p.grantee = g.role<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       <\/span><span style=\"color: #569CD6\">WHERE<\/span><span style=\"color: #D4D4D4\"> p.owner <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> u2.username<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                  <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> app_user u2<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #6A9955\">-- objects granted to PUBLIC<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">UNION<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> u.username, p.owner, p.type <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> object_type, p.table_name <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> object_name<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> dba_tab_privs p<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       <\/span><span style=\"color: #569CD6\">CROSS JOIN<\/span><span style=\"color: #D4D4D4\"> app_user u<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       <\/span><span style=\"color: #569CD6\">WHERE<\/span><span style=\"color: #D4D4D4\"> p.owner <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> u2.username<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                  <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> app_user u2<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         <\/span><span style=\"color: #569CD6\">AND<\/span><span style=\"color: #D4D4D4\"> p.grantee = <\/span><span style=\"color: #CE9178\">&#39;PUBLIC&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   ),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #6A9955\">-- issues if user is configured in the connection pool of a middle tier<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   issues <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #6A9955\">-- privileges not part of CONNECT role<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> username,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             <\/span><span style=\"color: #CE9178\">&#39;SYS&#39;<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">owner<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             <\/span><span style=\"color: #CE9178\">&#39;PRIVILEGE&#39;<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> object_type,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             privilege <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> object_name,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             <\/span><span style=\"color: #CE9178\">&#39;Privilege is not part of the CONNECT role&#39;<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> issue<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> sys_priv<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       <\/span><span style=\"color: #569CD6\">WHERE<\/span><span style=\"color: #D4D4D4\"> privilege <\/span><span style=\"color: #569CD6\">NOT<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #CE9178\">&#39;CREATE SESSION&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;SET CONTAINER&#39;<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">UNION ALL<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #6A9955\">-- access to non PL\/SQL units<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> username,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             <\/span><span style=\"color: #569CD6\">owner<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             object_type,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             object_name,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             <\/span><span style=\"color: #CE9178\">&#39;Access to non-PL\/SQL unit&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> obj_priv<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       <\/span><span style=\"color: #569CD6\">WHERE<\/span><span style=\"color: #D4D4D4\"> object_type <\/span><span style=\"color: #569CD6\">NOT<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #CE9178\">&#39;PACKAGE&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;TYPE&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;FUNCTION&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;PROCEDURE&#39;<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #6A9955\">-- own objects<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">UNION ALL<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> u.username,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             o.owner,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             o.object_type,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             o.object_name,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             <\/span><span style=\"color: #CE9178\">&#39;Connect user must not own any object&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> app_user u<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">JOIN<\/span><span style=\"color: #D4D4D4\"> dba_objects o <\/span><span style=\"color: #569CD6\">ON<\/span><span style=\"color: #D4D4D4\"> o.owner = u.username<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #6A9955\">-- missing CREATE SESSION privilege<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">UNION ALL<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> u.username,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             <\/span><span style=\"color: #CE9178\">&#39;SYS&#39;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             <\/span><span style=\"color: #CE9178\">&#39;PRIVILEGE&#39;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             <\/span><span style=\"color: #CE9178\">&#39;CREATE SESSION&#39;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             <\/span><span style=\"color: #CE9178\">&#39;Privilege is missing, but required&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> app_user u<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       <\/span><span style=\"color: #569CD6\">WHERE<\/span><span style=\"color: #D4D4D4\"> u.username <\/span><span style=\"color: #569CD6\">NOT<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> username<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                  <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> sys_priv<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                 <\/span><span style=\"color: #569CD6\">WHERE<\/span><span style=\"color: #D4D4D4\"> privilege = <\/span><span style=\"color: #CE9178\">&#39;CREATE SESSION&#39;<\/span><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   ),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #6A9955\">-- aggregate issues per user<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   issue_aggr <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> u.username, <\/span><span style=\"color: #DCDCAA\">COUNT<\/span><span style=\"color: #D4D4D4\">(i.username) issue_count<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> app_user u<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">LEFT JOIN<\/span><span style=\"color: #D4D4D4\"> issues i <\/span><span style=\"color: #569CD6\">ON<\/span><span style=\"color: #D4D4D4\"> i.username = u.username<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       <\/span><span style=\"color: #569CD6\">GROUP BY<\/span><span style=\"color: #D4D4D4\"> u.username<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   ),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #6A9955\">-- user summary (calculate is_connect_user_ready)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   summary <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> username,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             <\/span><span style=\"color: #569CD6\">CASE<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #569CD6\">WHEN<\/span><span style=\"color: #D4D4D4\"> issue_count = <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">THEN<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                   <\/span><span style=\"color: #CE9178\">&#39;YES&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #569CD6\">ELSE<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                   <\/span><span style=\"color: #CE9178\">&#39;NO&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             <\/span><span style=\"color: #569CD6\">END<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> is_connect_user_ready,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             issue_count<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> issue_aggr<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       <\/span><span style=\"color: #569CD6\">ORDER BY<\/span><span style=\"color: #D4D4D4\"> is_connect_user_ready <\/span><span style=\"color: #569CD6\">DESC<\/span><span style=\"color: #D4D4D4\">, username<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">-- main<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> * <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> summary<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">WHERE<\/span><span style=\"color: #D4D4D4\"> username <\/span><span style=\"color: #569CD6\">LIKE<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&#39;THE%&#39;<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">USERNAME      IS_CONNECT_USER_READY ISSUE_COUNT<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">------------- --------------------- -----------<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">THE_BAD_USER  YES                             <\/span><span style=\"color: #B5CEA8\">0<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">THE_GOOD_USER YES                             <\/span><span style=\"color: #B5CEA8\">0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">THE_BAD_API   <\/span><span style=\"color: #569CD6\">NO<\/span><span style=\"color: #D4D4D4\">                              <\/span><span style=\"color: #B5CEA8\">9<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">THE_BAD_DATA  <\/span><span style=\"color: #569CD6\">NO<\/span><span style=\"color: #D4D4D4\">                              <\/span><span style=\"color: #B5CEA8\">3<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">THE_GOOD_API  <\/span><span style=\"color: #569CD6\">NO<\/span><span style=\"color: #D4D4D4\">                              <\/span><span style=\"color: #B5CEA8\">4<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">THE_GOOD_DATA <\/span><span style=\"color: #569CD6\">NO<\/span><span style=\"color: #D4D4D4\">                              <\/span><span style=\"color: #B5CEA8\">3<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">THE_UGLY_DATA <\/span><span style=\"color: #569CD6\">NO<\/span><span style=\"color: #D4D4D4\">                             <\/span><span style=\"color: #B5CEA8\">10<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">THE_UGLY_USER <\/span><span style=\"color: #569CD6\">NO<\/span><span style=\"color: #D4D4D4\">                              <\/span><span style=\"color: #B5CEA8\">1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #B5CEA8\">8<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">rows<\/span><span style=\"color: #D4D4D4\"> selected.<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Just THE_GOOD_USER and THE_BAD_USER are ready to be used in the middle tier. To see the issues of all other users you may simply change the main part of the query as follows:<\/p>\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:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-start:166;--cbp-line-number-width:calc(3 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(234, 191, 191, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">All rule 1 issues<\/span><span role=\"button\" tabindex=\"0\" data-code=\"-- main\nSELECT * \n  FROM issues\n WHERE username LIKE 'THE%'\n ORDER BY username, owner, object_type, object_name;\n\nUSERNAME      OWNER         OBJECT_TYPE  OBJECT_NAME          ISSUE                                    \n------------- ------------- ------------ -------------------- -----------------------------------------\nTHE_BAD_API   SYS           PRIVILEGE    CREATE DATABASE LINK Privilege is not part of the CONNECT role\nTHE_BAD_API   SYS           PRIVILEGE    CREATE PROCEDURE     Privilege is not part of the CONNECT role\nTHE_BAD_API   THE_BAD_API   JAVA CLASS   C                    Connect user must not own any object     \nTHE_BAD_API   THE_BAD_API   JAVA SOURCE  C                    Connect user must not own any object     \nTHE_BAD_API   THE_BAD_API   PACKAGE      PKG                  Connect user must not own any object     \nTHE_BAD_API   THE_BAD_API   PACKAGE      PKG2                 Connect user must not own any object     \nTHE_BAD_API   THE_BAD_API   PACKAGE BODY PKG                  Connect user must not own any object     \nTHE_BAD_API   THE_BAD_API   PACKAGE BODY PKG2                 Connect user must not own any object     \nTHE_BAD_API   THE_BAD_DATA  TABLE        T                    Access to non-PL\/SQL unit                \nTHE_BAD_DATA  SYS           PRIVILEGE    CREATE TABLE         Privilege is not part of the CONNECT role\nTHE_BAD_DATA  THE_BAD_DATA  INDEX        SYS_C0012875         Connect user must not own any object     \nTHE_BAD_DATA  THE_BAD_DATA  TABLE        T                    Connect user must not own any object     \nTHE_GOOD_API  SYS           PRIVILEGE    CREATE PROCEDURE     Privilege is not part of the CONNECT role\nTHE_GOOD_API  THE_GOOD_API  PACKAGE      PKG                  Connect user must not own any object     \nTHE_GOOD_API  THE_GOOD_API  PACKAGE BODY PKG                  Connect user must not own any object     \nTHE_GOOD_API  THE_GOOD_DATA TABLE        T                    Access to non-PL\/SQL unit                \nTHE_GOOD_DATA SYS           PRIVILEGE    CREATE TABLE         Privilege is not part of the CONNECT role\nTHE_GOOD_DATA THE_GOOD_DATA INDEX        SYS_C0012873         Connect user must not own any object     \nTHE_GOOD_DATA THE_GOOD_DATA TABLE        T                    Connect user must not own any object     \nTHE_UGLY_DATA SYS           PRIVILEGE    CREATE CLUSTER       Privilege is not part of the CONNECT role\nTHE_UGLY_DATA SYS           PRIVILEGE    CREATE INDEXTYPE     Privilege is not part of the CONNECT role\nTHE_UGLY_DATA SYS           PRIVILEGE    CREATE OPERATOR      Privilege is not part of the CONNECT role\nTHE_UGLY_DATA SYS           PRIVILEGE    CREATE PROCEDURE     Privilege is not part of the CONNECT role\nTHE_UGLY_DATA SYS           PRIVILEGE    CREATE SEQUENCE      Privilege is not part of the CONNECT role\nTHE_UGLY_DATA SYS           PRIVILEGE    CREATE TABLE         Privilege is not part of the CONNECT role\nTHE_UGLY_DATA SYS           PRIVILEGE    CREATE TRIGGER       Privilege is not part of the CONNECT role\nTHE_UGLY_DATA SYS           PRIVILEGE    CREATE TYPE          Privilege is not part of the CONNECT role\nTHE_UGLY_DATA THE_UGLY_DATA INDEX        SYS_C0012877         Connect user must not own any object     \nTHE_UGLY_DATA THE_UGLY_DATA TABLE        T                    Connect user must not own any object     \nTHE_UGLY_USER THE_UGLY_DATA TABLE        T                    Access to non-PL\/SQL unit                \n\n30 rows selected.\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><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 dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #6A9955\">-- main<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> * <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> issues<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">WHERE<\/span><span style=\"color: #D4D4D4\"> username <\/span><span style=\"color: #569CD6\">LIKE<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&#39;THE%&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">ORDER BY<\/span><span style=\"color: #D4D4D4\"> username, <\/span><span style=\"color: #569CD6\">owner<\/span><span style=\"color: #D4D4D4\">, object_type, object_name;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">USERNAME      <\/span><span style=\"color: #569CD6\">OWNER<\/span><span style=\"color: #D4D4D4\">         OBJECT_TYPE  OBJECT_NAME          ISSUE                                    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">------------- ------------- ------------ -------------------- -----------------------------------------<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">THE_BAD_API   SYS           PRIVILEGE    <\/span><span style=\"color: #569CD6\">CREATE<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">DATABASE<\/span><span style=\"color: #D4D4D4\"> LINK Privilege <\/span><span style=\"color: #569CD6\">is<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">not<\/span><span style=\"color: #D4D4D4\"> part of the <\/span><span style=\"color: #569CD6\">CONNECT<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">role<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">THE_BAD_API   SYS           PRIVILEGE    <\/span><span style=\"color: #569CD6\">CREATE<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">PROCEDURE<\/span><span style=\"color: #D4D4D4\">     Privilege <\/span><span style=\"color: #569CD6\">is<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">not<\/span><span style=\"color: #D4D4D4\"> part of the <\/span><span style=\"color: #569CD6\">CONNECT<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">role<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">THE_BAD_API   THE_BAD_API   JAVA CLASS   C                    <\/span><span style=\"color: #569CD6\">Connect<\/span><span style=\"color: #D4D4D4\"> user must <\/span><span style=\"color: #569CD6\">not<\/span><span style=\"color: #D4D4D4\"> own any <\/span><span style=\"color: #569CD6\">object<\/span><span style=\"color: #D4D4D4\">     <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">THE_BAD_API   THE_BAD_API   JAVA SOURCE  C                    <\/span><span style=\"color: #569CD6\">Connect<\/span><span style=\"color: #D4D4D4\"> user must <\/span><span style=\"color: #569CD6\">not<\/span><span style=\"color: #D4D4D4\"> own any <\/span><span style=\"color: #569CD6\">object<\/span><span style=\"color: #D4D4D4\">     <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">THE_BAD_API   THE_BAD_API   PACKAGE      PKG                  <\/span><span style=\"color: #569CD6\">Connect<\/span><span style=\"color: #D4D4D4\"> user must <\/span><span style=\"color: #569CD6\">not<\/span><span style=\"color: #D4D4D4\"> own any <\/span><span style=\"color: #569CD6\">object<\/span><span style=\"color: #D4D4D4\">     <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">THE_BAD_API   THE_BAD_API   PACKAGE      PKG2                 <\/span><span style=\"color: #569CD6\">Connect<\/span><span style=\"color: #D4D4D4\"> user must <\/span><span style=\"color: #569CD6\">not<\/span><span style=\"color: #D4D4D4\"> own any <\/span><span style=\"color: #569CD6\">object<\/span><span style=\"color: #D4D4D4\">     <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">THE_BAD_API   THE_BAD_API   PACKAGE BODY PKG                  <\/span><span style=\"color: #569CD6\">Connect<\/span><span style=\"color: #D4D4D4\"> user must <\/span><span style=\"color: #569CD6\">not<\/span><span style=\"color: #D4D4D4\"> own any <\/span><span style=\"color: #569CD6\">object<\/span><span style=\"color: #D4D4D4\">     <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">THE_BAD_API   THE_BAD_API   PACKAGE BODY PKG2                 <\/span><span style=\"color: #569CD6\">Connect<\/span><span style=\"color: #D4D4D4\"> user must <\/span><span style=\"color: #569CD6\">not<\/span><span style=\"color: #D4D4D4\"> own any <\/span><span style=\"color: #569CD6\">object<\/span><span style=\"color: #D4D4D4\">     <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">THE_BAD_API   THE_BAD_DATA  <\/span><span style=\"color: #569CD6\">TABLE<\/span><span style=\"color: #D4D4D4\">        T                    Access <\/span><span style=\"color: #569CD6\">to<\/span><span style=\"color: #D4D4D4\"> non-PL\/<\/span><span style=\"color: #569CD6\">SQL<\/span><span style=\"color: #D4D4D4\"> unit                <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">THE_BAD_DATA  SYS           PRIVILEGE    <\/span><span style=\"color: #569CD6\">CREATE<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">TABLE<\/span><span style=\"color: #D4D4D4\">         Privilege <\/span><span style=\"color: #569CD6\">is<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">not<\/span><span style=\"color: #D4D4D4\"> part of the <\/span><span style=\"color: #569CD6\">CONNECT<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">role<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">THE_BAD_DATA  THE_BAD_DATA  <\/span><span style=\"color: #569CD6\">INDEX<\/span><span style=\"color: #D4D4D4\">        SYS_C0012875         <\/span><span style=\"color: #569CD6\">Connect<\/span><span style=\"color: #D4D4D4\"> user must <\/span><span style=\"color: #569CD6\">not<\/span><span style=\"color: #D4D4D4\"> own any <\/span><span style=\"color: #569CD6\">object<\/span><span style=\"color: #D4D4D4\">     <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">THE_BAD_DATA  THE_BAD_DATA  <\/span><span style=\"color: #569CD6\">TABLE<\/span><span style=\"color: #D4D4D4\">        T                    <\/span><span style=\"color: #569CD6\">Connect<\/span><span style=\"color: #D4D4D4\"> user must <\/span><span style=\"color: #569CD6\">not<\/span><span style=\"color: #D4D4D4\"> own any <\/span><span style=\"color: #569CD6\">object<\/span><span style=\"color: #D4D4D4\">     <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">THE_GOOD_API  SYS           PRIVILEGE    <\/span><span style=\"color: #569CD6\">CREATE<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">PROCEDURE<\/span><span style=\"color: #D4D4D4\">     Privilege <\/span><span style=\"color: #569CD6\">is<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">not<\/span><span style=\"color: #D4D4D4\"> part of the <\/span><span style=\"color: #569CD6\">CONNECT<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">role<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">THE_GOOD_API  THE_GOOD_API  PACKAGE      PKG                  <\/span><span style=\"color: #569CD6\">Connect<\/span><span style=\"color: #D4D4D4\"> user must <\/span><span style=\"color: #569CD6\">not<\/span><span style=\"color: #D4D4D4\"> own any <\/span><span style=\"color: #569CD6\">object<\/span><span style=\"color: #D4D4D4\">     <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">THE_GOOD_API  THE_GOOD_API  PACKAGE BODY PKG                  <\/span><span style=\"color: #569CD6\">Connect<\/span><span style=\"color: #D4D4D4\"> user must <\/span><span style=\"color: #569CD6\">not<\/span><span style=\"color: #D4D4D4\"> own any <\/span><span style=\"color: #569CD6\">object<\/span><span style=\"color: #D4D4D4\">     <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">THE_GOOD_API  THE_GOOD_DATA <\/span><span style=\"color: #569CD6\">TABLE<\/span><span style=\"color: #D4D4D4\">        T                    Access <\/span><span style=\"color: #569CD6\">to<\/span><span style=\"color: #D4D4D4\"> non-PL\/<\/span><span style=\"color: #569CD6\">SQL<\/span><span style=\"color: #D4D4D4\"> unit                <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">THE_GOOD_DATA SYS           PRIVILEGE    <\/span><span style=\"color: #569CD6\">CREATE<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">TABLE<\/span><span style=\"color: #D4D4D4\">         Privilege <\/span><span style=\"color: #569CD6\">is<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">not<\/span><span style=\"color: #D4D4D4\"> part of the <\/span><span style=\"color: #569CD6\">CONNECT<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">role<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">THE_GOOD_DATA THE_GOOD_DATA <\/span><span style=\"color: #569CD6\">INDEX<\/span><span style=\"color: #D4D4D4\">        SYS_C0012873         <\/span><span style=\"color: #569CD6\">Connect<\/span><span style=\"color: #D4D4D4\"> user must <\/span><span style=\"color: #569CD6\">not<\/span><span style=\"color: #D4D4D4\"> own any <\/span><span style=\"color: #569CD6\">object<\/span><span style=\"color: #D4D4D4\">     <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">THE_GOOD_DATA THE_GOOD_DATA <\/span><span style=\"color: #569CD6\">TABLE<\/span><span style=\"color: #D4D4D4\">        T                    <\/span><span style=\"color: #569CD6\">Connect<\/span><span style=\"color: #D4D4D4\"> user must <\/span><span style=\"color: #569CD6\">not<\/span><span style=\"color: #D4D4D4\"> own any <\/span><span style=\"color: #569CD6\">object<\/span><span style=\"color: #D4D4D4\">     <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">THE_UGLY_DATA SYS           PRIVILEGE    <\/span><span style=\"color: #569CD6\">CREATE<\/span><span style=\"color: #D4D4D4\"> CLUSTER       Privilege <\/span><span style=\"color: #569CD6\">is<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">not<\/span><span style=\"color: #D4D4D4\"> part of the <\/span><span style=\"color: #569CD6\">CONNECT<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">role<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">THE_UGLY_DATA SYS           PRIVILEGE    <\/span><span style=\"color: #569CD6\">CREATE<\/span><span style=\"color: #D4D4D4\"> INDEXTYPE     Privilege <\/span><span style=\"color: #569CD6\">is<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">not<\/span><span style=\"color: #D4D4D4\"> part of the <\/span><span style=\"color: #569CD6\">CONNECT<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">role<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">THE_UGLY_DATA SYS           PRIVILEGE    <\/span><span style=\"color: #569CD6\">CREATE<\/span><span style=\"color: #D4D4D4\"> OPERATOR      Privilege <\/span><span style=\"color: #569CD6\">is<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">not<\/span><span style=\"color: #D4D4D4\"> part of the <\/span><span style=\"color: #569CD6\">CONNECT<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">role<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">THE_UGLY_DATA SYS           PRIVILEGE    <\/span><span style=\"color: #569CD6\">CREATE<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">PROCEDURE<\/span><span style=\"color: #D4D4D4\">     Privilege <\/span><span style=\"color: #569CD6\">is<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">not<\/span><span style=\"color: #D4D4D4\"> part of the <\/span><span style=\"color: #569CD6\">CONNECT<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">role<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">THE_UGLY_DATA SYS           PRIVILEGE    <\/span><span style=\"color: #569CD6\">CREATE<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">SEQUENCE<\/span><span style=\"color: #D4D4D4\">      Privilege <\/span><span style=\"color: #569CD6\">is<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">not<\/span><span style=\"color: #D4D4D4\"> part of the <\/span><span style=\"color: #569CD6\">CONNECT<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">role<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">THE_UGLY_DATA SYS           PRIVILEGE    <\/span><span style=\"color: #569CD6\">CREATE<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">TABLE<\/span><span style=\"color: #D4D4D4\">         Privilege <\/span><span style=\"color: #569CD6\">is<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">not<\/span><span style=\"color: #D4D4D4\"> part of the <\/span><span style=\"color: #569CD6\">CONNECT<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">role<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">THE_UGLY_DATA SYS           PRIVILEGE    <\/span><span style=\"color: #569CD6\">CREATE<\/span><span style=\"color: #D4D4D4\"> TRIGGER       Privilege <\/span><span style=\"color: #569CD6\">is<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">not<\/span><span style=\"color: #D4D4D4\"> part of the <\/span><span style=\"color: #569CD6\">CONNECT<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">role<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">THE_UGLY_DATA SYS           PRIVILEGE    <\/span><span style=\"color: #569CD6\">CREATE<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">TYPE<\/span><span style=\"color: #D4D4D4\">          Privilege <\/span><span style=\"color: #569CD6\">is<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">not<\/span><span style=\"color: #D4D4D4\"> part of the <\/span><span style=\"color: #569CD6\">CONNECT<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">role<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">THE_UGLY_DATA THE_UGLY_DATA <\/span><span style=\"color: #569CD6\">INDEX<\/span><span style=\"color: #D4D4D4\">        SYS_C0012877         <\/span><span style=\"color: #569CD6\">Connect<\/span><span style=\"color: #D4D4D4\"> user must <\/span><span style=\"color: #569CD6\">not<\/span><span style=\"color: #D4D4D4\"> own any <\/span><span style=\"color: #569CD6\">object<\/span><span style=\"color: #D4D4D4\">     <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">THE_UGLY_DATA THE_UGLY_DATA <\/span><span style=\"color: #569CD6\">TABLE<\/span><span style=\"color: #D4D4D4\">        T                    <\/span><span style=\"color: #569CD6\">Connect<\/span><span style=\"color: #D4D4D4\"> user must <\/span><span style=\"color: #569CD6\">not<\/span><span style=\"color: #D4D4D4\"> own any <\/span><span style=\"color: #569CD6\">object<\/span><span style=\"color: #D4D4D4\">     <\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">THE_UGLY_USER THE_UGLY_DATA <\/span><span style=\"color: #569CD6\">TABLE<\/span><span style=\"color: #D4D4D4\">        T                    Access <\/span><span style=\"color: #569CD6\">to<\/span><span style=\"color: #D4D4D4\"> non-PL\/<\/span><span style=\"color: #569CD6\">SQL<\/span><span style=\"color: #D4D4D4\"> unit                <\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #B5CEA8\">30<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">rows<\/span><span style=\"color: #D4D4D4\"> selected.<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>THE_UGLY_USER has access to table T owned by THE_UGLY_DATA. This violates rule 1.<\/p>\n\n\n\n<p>However, it is important to note, that we have excluded all Oracle maintained users from the analysis. So let&#8217;s have a look at all the tables and views granted to PUBLIC by the Oracle-maintained users.<\/p>\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:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">Privileges on tables and views granted to PUBLIC<\/span><span role=\"button\" tabindex=\"0\" data-code=\"WITH\n   public_privs AS (\n      SELECT p.owner, \n             p.type       AS object_type, \n             p.privilege, \n             count(*)     AS priv_count\n        FROM dba_tab_privs p\n       WHERE p.grantee = 'PUBLIC'\n         AND p.type IN ('VIEW', 'TABLE')\n         AND p.owner IN (\n                SELECT u2.username \n                  FROM dba_users u2 \n                 WHERE u2.oracle_maintained = 'Y'\n             )\n       GROUP BY p.owner, p.type, p.privilege  \n   ),\n   public_privs_pivot AS (\n      SELECT owner,\n             object_type,\n             insert_priv,\n             update_priv,\n             delete_priv,\n             select_priv, -- allows SELECT ... FOR UPDATE ...\n             read_priv,   -- does not allow SELECT ... FOR UPDATE ...\n             flashback_priv,\n             nvl(insert_priv,0) + nvl(update_priv,0) + nvl(delete_priv,0) \n             + nvl(select_priv,0) + nvl(read_priv,0) \n             + nvl(flashback_priv,0) AS total_priv\n        FROM public_privs\n       PIVOT (\n                sum(priv_count) FOR privilege IN (\n                   'INSERT'    AS insert_priv, \n                   'UPDATE'    AS update_priv, \n                   'DELETE'    AS delete_priv, \n                   'SELECT'    AS select_priv, \n                   'READ'      AS read_priv, \n                   'FLASHBACK' AS flashback_priv\n                )\n             )\n       ORDER BY owner\n   ),\n   public_privs_report AS (\n      SELECT owner,\n             object_type,\n             sum(insert_priv)    AS &quot;INSERT&quot;,\n             sum(update_priv)    AS &quot;UPDATE&quot;,\n             sum(delete_priv)    AS &quot;DELETE&quot;,\n             sum(select_priv)    AS &quot;SELECT&quot;,\n             sum(read_priv)      AS &quot;READ&quot;,\n             sum(flashback_priv) AS &quot;FLASHBACK&quot;,\n             sum(total_priv)     AS &quot;TOTAL&quot;\n        FROM public_privs_pivot\n       GROUP BY ROLLUP(owner, object_type)\n      HAVING (GROUPING(owner), GROUPING(object_type)) IN ((0,0), (1,1))\n       ORDER BY owner, object_type\n   )\n-- main\nSELECT * FROM public_privs_report;\n\nOWNER             OBJECT_TYPE     INSERT     UPDATE     DELETE     SELECT       READ  FLASHBACK      TOTAL\n----------------- ----------- ---------- ---------- ---------- ---------- ---------- ---------- ----------\nAPEX_050100       VIEW                 1          1          4          5        192                   203\nCTXSYS            TABLE                                                 1          4                     5\nCTXSYS            VIEW                11          5          8         12         51                    87\nGSMADMIN_INTERNAL VIEW                                                             3                     3\nLBACSYS           VIEW                                                            18                    18\nMDSYS             TABLE               21         14         19         21         36                   111\nMDSYS             VIEW                27         26         26         26         68                   173\nOLAPSYS           VIEW                                                            18                    18\nORDDATA           VIEW                                       1                     5                     6\nORDSYS            VIEW                                                             5                     5\nORDS_METADATA     VIEW                                                 20                               20\nSYS               TABLE               21         10         16         30         12                    89\nSYS               VIEW                                                  1       1717          2       1720\nSYSTEM            TABLE                3          3          3          4                               13\nSYSTEM            VIEW                                                  1                                1\nWMSYS             VIEW                                                            40                    40\nXDB               TABLE                8          6          8          8         14                    44\nXDB               VIEW                 2          2          2          2          3                    11\n                                      94         67         87        131       2186          2       2567\n\n19 rows selected.\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><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 dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #569CD6\">WITH<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   public_privs <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> p.owner, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             p.type       <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> object_type, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             p.privilege, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             <\/span><span style=\"color: #DCDCAA\">count<\/span><span style=\"color: #D4D4D4\">(*)     <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> priv_count<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> dba_tab_privs p<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       <\/span><span style=\"color: #569CD6\">WHERE<\/span><span style=\"color: #D4D4D4\"> p.grantee = <\/span><span style=\"color: #CE9178\">&#39;PUBLIC&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         <\/span><span style=\"color: #569CD6\">AND<\/span><span style=\"color: #D4D4D4\"> p.type <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #CE9178\">&#39;VIEW&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;TABLE&#39;<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         <\/span><span style=\"color: #569CD6\">AND<\/span><span style=\"color: #D4D4D4\"> p.owner <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> u2.username <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                  <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> dba_users u2 <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                 <\/span><span style=\"color: #569CD6\">WHERE<\/span><span style=\"color: #D4D4D4\"> u2.oracle_maintained = <\/span><span style=\"color: #CE9178\">&#39;Y&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       <\/span><span style=\"color: #569CD6\">GROUP BY<\/span><span style=\"color: #D4D4D4\"> p.owner, p.type, p.privilege  <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   ),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   public_privs_pivot <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">owner<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             object_type,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             insert_priv,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             update_priv,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             delete_priv,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             select_priv, <\/span><span style=\"color: #6A9955\">-- allows SELECT ... FOR UPDATE ...<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             read_priv,   <\/span><span style=\"color: #6A9955\">-- does not allow SELECT ... FOR UPDATE ...<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             flashback_priv,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             nvl(insert_priv,<\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">) + nvl(update_priv,<\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">) + nvl(delete_priv,<\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">) <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             + nvl(select_priv,<\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">) + nvl(read_priv,<\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">) <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             + nvl(flashback_priv,<\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> total_priv<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> public_privs<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       PIVOT (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #DCDCAA\">sum<\/span><span style=\"color: #D4D4D4\">(priv_count) <\/span><span style=\"color: #569CD6\">FOR<\/span><span style=\"color: #D4D4D4\"> privilege <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                   <\/span><span style=\"color: #CE9178\">&#39;INSERT&#39;<\/span><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> insert_priv, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                   <\/span><span style=\"color: #CE9178\">&#39;UPDATE&#39;<\/span><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> update_priv, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                   <\/span><span style=\"color: #CE9178\">&#39;DELETE&#39;<\/span><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> delete_priv, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                   <\/span><span style=\"color: #CE9178\">&#39;SELECT&#39;<\/span><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> select_priv, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                   <\/span><span style=\"color: #CE9178\">&#39;READ&#39;<\/span><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> read_priv, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                   <\/span><span style=\"color: #CE9178\">&#39;FLASHBACK&#39;<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> flashback_priv<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       <\/span><span style=\"color: #569CD6\">ORDER BY<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">owner<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   ),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   public_privs_report <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">owner<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             object_type,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             <\/span><span style=\"color: #DCDCAA\">sum<\/span><span style=\"color: #D4D4D4\">(insert_priv)    <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&quot;INSERT&quot;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             <\/span><span style=\"color: #DCDCAA\">sum<\/span><span style=\"color: #D4D4D4\">(update_priv)    <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&quot;UPDATE&quot;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             <\/span><span style=\"color: #DCDCAA\">sum<\/span><span style=\"color: #D4D4D4\">(delete_priv)    <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&quot;DELETE&quot;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             <\/span><span style=\"color: #DCDCAA\">sum<\/span><span style=\"color: #D4D4D4\">(select_priv)    <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&quot;SELECT&quot;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             <\/span><span style=\"color: #DCDCAA\">sum<\/span><span style=\"color: #D4D4D4\">(read_priv)      <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&quot;READ&quot;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             <\/span><span style=\"color: #DCDCAA\">sum<\/span><span style=\"color: #D4D4D4\">(flashback_priv) <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&quot;FLASHBACK&quot;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             <\/span><span style=\"color: #DCDCAA\">sum<\/span><span style=\"color: #D4D4D4\">(total_priv)     <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&quot;TOTAL&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> public_privs_pivot<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       <\/span><span style=\"color: #569CD6\">GROUP BY<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">ROLLUP<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #569CD6\">owner<\/span><span style=\"color: #D4D4D4\">, object_type)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">HAVING<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #DCDCAA\">GROUPING<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #569CD6\">owner<\/span><span style=\"color: #D4D4D4\">), <\/span><span style=\"color: #DCDCAA\">GROUPING<\/span><span style=\"color: #D4D4D4\">(object_type)) <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> ((<\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">,<\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">), (<\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">,<\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       <\/span><span style=\"color: #569CD6\">ORDER BY<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">owner<\/span><span style=\"color: #D4D4D4\">, object_type<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">-- main<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> * <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> public_privs_report;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">OWNER<\/span><span style=\"color: #D4D4D4\">             OBJECT_TYPE     <\/span><span style=\"color: #569CD6\">INSERT<\/span><span style=\"color: #D4D4D4\">     <\/span><span style=\"color: #569CD6\">UPDATE<\/span><span style=\"color: #D4D4D4\">     <\/span><span style=\"color: #569CD6\">DELETE<\/span><span style=\"color: #D4D4D4\">     <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\">       <\/span><span style=\"color: #569CD6\">READ<\/span><span style=\"color: #D4D4D4\">  FLASHBACK      TOTAL<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">----------------- ----------- ---------- ---------- ---------- ---------- ---------- ---------- ----------<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">APEX_050100       VIEW                 <\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #B5CEA8\">4<\/span><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #B5CEA8\">5<\/span><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #B5CEA8\">192<\/span><span style=\"color: #D4D4D4\">                   <\/span><span style=\"color: #B5CEA8\">203<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">CTXSYS            <\/span><span style=\"color: #569CD6\">TABLE<\/span><span style=\"color: #D4D4D4\">                                                 <\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #B5CEA8\">4<\/span><span style=\"color: #D4D4D4\">                     <\/span><span style=\"color: #B5CEA8\">5<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">CTXSYS            VIEW                <\/span><span style=\"color: #B5CEA8\">11<\/span><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #B5CEA8\">5<\/span><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #B5CEA8\">8<\/span><span style=\"color: #D4D4D4\">         <\/span><span style=\"color: #B5CEA8\">12<\/span><span style=\"color: #D4D4D4\">         <\/span><span style=\"color: #B5CEA8\">51<\/span><span style=\"color: #D4D4D4\">                    <\/span><span style=\"color: #B5CEA8\">87<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">GSMADMIN_INTERNAL VIEW                                                             <\/span><span style=\"color: #B5CEA8\">3<\/span><span style=\"color: #D4D4D4\">                     <\/span><span style=\"color: #B5CEA8\">3<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">LBACSYS           VIEW                                                            <\/span><span style=\"color: #B5CEA8\">18<\/span><span style=\"color: #D4D4D4\">                    <\/span><span style=\"color: #B5CEA8\">18<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">MDSYS             <\/span><span style=\"color: #569CD6\">TABLE<\/span><span style=\"color: #D4D4D4\">               <\/span><span style=\"color: #B5CEA8\">21<\/span><span style=\"color: #D4D4D4\">         <\/span><span style=\"color: #B5CEA8\">14<\/span><span style=\"color: #D4D4D4\">         <\/span><span style=\"color: #B5CEA8\">19<\/span><span style=\"color: #D4D4D4\">         <\/span><span style=\"color: #B5CEA8\">21<\/span><span style=\"color: #D4D4D4\">         <\/span><span style=\"color: #B5CEA8\">36<\/span><span style=\"color: #D4D4D4\">                   <\/span><span style=\"color: #B5CEA8\">111<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">MDSYS             VIEW                <\/span><span style=\"color: #B5CEA8\">27<\/span><span style=\"color: #D4D4D4\">         <\/span><span style=\"color: #B5CEA8\">26<\/span><span style=\"color: #D4D4D4\">         <\/span><span style=\"color: #B5CEA8\">26<\/span><span style=\"color: #D4D4D4\">         <\/span><span style=\"color: #B5CEA8\">26<\/span><span style=\"color: #D4D4D4\">         <\/span><span style=\"color: #B5CEA8\">68<\/span><span style=\"color: #D4D4D4\">                   <\/span><span style=\"color: #B5CEA8\">173<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">OLAPSYS           VIEW                                                            <\/span><span style=\"color: #B5CEA8\">18<\/span><span style=\"color: #D4D4D4\">                    <\/span><span style=\"color: #B5CEA8\">18<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">ORDDATA           VIEW                                       <\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">                     <\/span><span style=\"color: #B5CEA8\">5<\/span><span style=\"color: #D4D4D4\">                     <\/span><span style=\"color: #B5CEA8\">6<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">ORDSYS            VIEW                                                             <\/span><span style=\"color: #B5CEA8\">5<\/span><span style=\"color: #D4D4D4\">                     <\/span><span style=\"color: #B5CEA8\">5<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">ORDS_METADATA     VIEW                                                 <\/span><span style=\"color: #B5CEA8\">20<\/span><span style=\"color: #D4D4D4\">                               <\/span><span style=\"color: #B5CEA8\">20<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">SYS               <\/span><span style=\"color: #569CD6\">TABLE<\/span><span style=\"color: #D4D4D4\">               <\/span><span style=\"color: #B5CEA8\">21<\/span><span style=\"color: #D4D4D4\">         <\/span><span style=\"color: #B5CEA8\">10<\/span><span style=\"color: #D4D4D4\">         <\/span><span style=\"color: #B5CEA8\">16<\/span><span style=\"color: #D4D4D4\">         <\/span><span style=\"color: #B5CEA8\">30<\/span><span style=\"color: #D4D4D4\">         <\/span><span style=\"color: #B5CEA8\">12<\/span><span style=\"color: #D4D4D4\">                    <\/span><span style=\"color: #B5CEA8\">89<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">SYS               VIEW                                                  <\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">       <\/span><span style=\"color: #B5CEA8\">1717<\/span><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #B5CEA8\">2<\/span><span style=\"color: #D4D4D4\">       <\/span><span style=\"color: #B5CEA8\">1720<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">SYSTEM<\/span><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #569CD6\">TABLE<\/span><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #B5CEA8\">3<\/span><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #B5CEA8\">3<\/span><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #B5CEA8\">3<\/span><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #B5CEA8\">4<\/span><span style=\"color: #D4D4D4\">                               <\/span><span style=\"color: #B5CEA8\">13<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">SYSTEM<\/span><span style=\"color: #D4D4D4\">            VIEW                                                  <\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">                                <\/span><span style=\"color: #B5CEA8\">1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">WMSYS             VIEW                                                            <\/span><span style=\"color: #B5CEA8\">40<\/span><span style=\"color: #D4D4D4\">                    <\/span><span style=\"color: #B5CEA8\">40<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">XDB               <\/span><span style=\"color: #569CD6\">TABLE<\/span><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #B5CEA8\">8<\/span><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #B5CEA8\">6<\/span><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #B5CEA8\">8<\/span><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #B5CEA8\">8<\/span><span style=\"color: #D4D4D4\">         <\/span><span style=\"color: #B5CEA8\">14<\/span><span style=\"color: #D4D4D4\">                    <\/span><span style=\"color: #B5CEA8\">44<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">XDB               VIEW                 <\/span><span style=\"color: #B5CEA8\">2<\/span><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #B5CEA8\">2<\/span><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #B5CEA8\">2<\/span><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #B5CEA8\">2<\/span><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #B5CEA8\">3<\/span><span style=\"color: #D4D4D4\">                    <\/span><span style=\"color: #B5CEA8\">11<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                                      <\/span><span style=\"color: #B5CEA8\">94<\/span><span style=\"color: #D4D4D4\">         <\/span><span style=\"color: #B5CEA8\">67<\/span><span style=\"color: #D4D4D4\">         <\/span><span style=\"color: #B5CEA8\">87<\/span><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #B5CEA8\">131<\/span><span style=\"color: #D4D4D4\">       <\/span><span style=\"color: #B5CEA8\">2186<\/span><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #B5CEA8\">2<\/span><span style=\"color: #D4D4D4\">       <\/span><span style=\"color: #B5CEA8\">2567<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #B5CEA8\">19<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">rows<\/span><span style=\"color: #D4D4D4\"> selected.<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Even THE_GOOD_USER has access to 2317 views and tables. To reduce this number we have to uninstall some components, but that&#8217;s just a drop in the ocean. There is currently no way to create an Oracle user without access to views and tables. Hence we just have to focus on our application and our data.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Rule 2) Use only static SQL within PL\/SQL<\/h2>\n\n\n\n<p>If you use just static SQL in your PL\/SQL units, then no SQL injection is possible. The absence of dynamic SQL proves that your application is secured against SQL injection attacks. Of course, there are good reasons for dynamic SQL. However, proving that a dynamic SQL is not injectable is difficult. Checking for the absence of dynamic SQL is the simpler approach, even if it is not as easy as I initially thought.<\/p>\n\n\n\n<p>In&nbsp;<a href=\"http:\/\/www.oracle.com\/technetwork\/database\/features\/plsql\/overview\/how-to-write-injection-proof-plsql-1-129572.pdf\">How to write SQL injection proof PL\/SQL<\/a>&nbsp;the following ways are mentioned to implement dynamic SQL:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>native dynamic SQL (EXECUTE IMMEDIATE)<\/li>\n\n\n\n<li>DBMS_SQL.EXECUTE<\/li>\n\n\n\n<li>DBMS_SQL.PARSE<\/li>\n\n\n\n<li>DBMS_UTILITY.EXEC_DDL_STATEMENT<\/li>\n\n\n\n<li>DBMS_DDL.CREATE_WRAPPED<\/li>\n\n\n\n<li>DBMS_HS_PASSTHROUGH.EXECUTE_IMMEDIATE<\/li>\n\n\n\n<li>DBMS_HS_PASSTHROUGH.PARSE<\/li>\n\n\n\n<li>OWA_UTIL.BIND_VARIABLES<\/li>\n\n\n\n<li>OWA_UTIL.LISTPRINT<\/li>\n\n\n\n<li>OWA_UTIL.TABLEPRINT<\/li>\n<\/ul>\n\n\n\n<p>But there are more ways to execute dynamic SQL, such as:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Open-For Statement<\/li>\n\n\n\n<li>Java Stored Procedure<\/li>\n\n\n\n<li>DBMS_SYS_SQL.EXECUTE<\/li>\n\n\n\n<li>DBMS_SYS_SQL.PARSE<\/li>\n\n\n\n<li>DBMS_SYS_SQL.PARSE_AS_USER<\/li>\n<\/ul>\n\n\n\n<p>It&#8217;s difficult to get a complete list because the Oracle-supplied subprograms are wrapped and often the SQL statement is hidden behind a C API. That leaves us with two options<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Use a list of Oracle-supplied packages and\/or subprograms to identify dynamic SQL, even if the list might be incomplete<\/li>\n\n\n\n<li>Suspect that any Oracle-supplied subprogram may contain dynamic SQL, except some trusted packages such as &#8220;DBMS_STANDARD&#8221; and &#8220;STANDARD&#8221;<\/li>\n<\/ol>\n\n\n\n<p>Both options are not very appealing. But I&#8217;m in favour of option 1. At a certain point, I have to focus on my application code and assume\/trust, that the Oracle-supplied packages are doing their part to reduce the risk of SQL injection.<\/p>\n\n\n\n<p>The following object types may contain PL\/SQL and have to be checked for dynamic SQL:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>FUNCTION<\/li>\n\n\n\n<li>PROCEDURE<\/li>\n\n\n\n<li>PACKAGE BODY<\/li>\n\n\n\n<li>TYPE BODY<\/li>\n\n\n\n<li>TRIGGER<\/li>\n<\/ul>\n\n\n\n<p>What if we call services outside of the database via REST calls or AQ messages? I think we may ignore these cases. They are not part of this application any more and even if the services call this database, they have to go through the hard shell, and these are PL\/SQL units already covered.<\/p>\n\n\n\n<p>We need PL\/Scope metadata for some checks. The following anonymous PL\/SQL block produces these data. Be aware that the application code and some SYS objects are compiled. Invalid, dependent objects will be recompiled at the end. Nonetheless, you should not run this code in your production environment.<\/p>\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:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(3 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(234, 191, 191, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">Compile missing PL\/Scope metadata<\/span><span role=\"button\" tabindex=\"0\" data-code=\"DECLARE\n   PROCEDURE enable_plscope IS\n   BEGIN\n      EXECUTE IMMEDIATE q'[ALTER SESSION SET plscope_settings='IDENTIFIERS:ALL, STATEMENTS:ALL']';\n   END enable_plscope;\n   --\n   PROCEDURE compile_defs_without_plscope IS\n   BEGIN\n      &lt;&lt;compile_definition&gt;&gt;\n      FOR r IN (\n         WITH\n            -- application users in scope of the analysis\n            -- other users are treated as if they were not istalled\n            app_user AS (\n               SELECT username\n                 FROM dba_users\n                WHERE oracle_maintained = 'N'\n            ),\n            -- objects for which PL\/Scope metadata is required\n            obj AS (\n                SELECT o.owner, o.object_type, o.object_name\n                  FROM dba_objects o\n                 WHERE object_name IN ('DBMS_UTILITY', 'OWA_UTIL')\n                   AND object_type IN ('PACKAGE', 'SYNONYM')\n               UNION ALL\n               SELECT o.owner, o.object_type, o.object_name\n                 FROM dba_objects o\n                 JOIN app_user u ON u.username = o.owner\n                WHERE object_type IN ('PACKAGE BODY', 'TYPE BODY', 'FUNCTION', \n                         'PROCEDURE', 'TRIGGER')\n            ),\n            -- objects without PL\/Scope metadata\n            missing_plscope_obj AS (\n               SELECT o.owner, o.object_type, o.object_name\n                 FROM obj o\n                 LEFT JOIN dba_identifiers i \n                   ON i.owner = o.owner \n                      AND i.object_type = o.object_type\n                      AND i.object_name = o.object_name\n                      AND i.usage_context_id = 0\n                WHERE i.usage_context_id IS NULL\n            ),\n            -- all objects to recompile and (re)gather PL\/Scope metadata\n            compile_scope AS (\n               SELECT o.owner, o.object_type, o.object_name\n                 FROM obj o\n                WHERE EXISTS (\n                         SELECT 1\n                           FROM missing_plscope_obj o2 \n                          WHERE o2.owner = 'SYS' \n                      )\n               UNION ALL\n               SELECT owner, object_type, object_name\n                 FROM missing_plscope_obj\n                WHERE NOT EXISTS (\n                         SELECT 1\n                           FROM missing_plscope_obj o2 \n                          WHERE o2.owner = 'SYS' \n                      )\n            ),\n            -- compile statement required to produce PL\/Scope metadata\n            compile_stmt AS (\n               SELECT 'ALTER ' || replace(object_type, ' BODY') \n                      || ' &quot;' || owner || '&quot;.&quot;' || object_name || '&quot; COMPILE' \n                      || CASE\n                            WHEN object_type LIKE '%BODY' THEN\n                               ' BODY'\n                         END AS stmt\n                 FROM compile_scope\n            )\n         -- main\n         SELECT stmt\n           FROM compile_stmt\n      ) LOOP\n         EXECUTE IMMEDIATE r.stmt;\n      END LOOP compile_definition;\n   END compile_defs_without_plscope;\n   --\n   PROCEDURE recompile_invalids IS\n   BEGIN\n      &lt;&lt;schemas_with_invalids&gt;&gt;\n      FOR r IN (\n         SELECT DISTINCT owner\n           FROM dba_objects\n          WHERE status != 'VALID'\n          ORDER BY CASE owner\n                      WHEN 'SYS' THEN\n                         1\n                      WHEN 'SYSTEM' THEN\n                         2\n                      ELSE\n                         3\n                   END,\n                owner\n      ) LOOP\n         utl_recomp.recomp_serial(r.owner);\n      END LOOP schemas_with_invalids;\n   END recompile_invalids;\nBEGIN\n   enable_plscope;\n   compile_defs_without_plscope;\n   recompile_invalids;\nEND;\n\/\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><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 dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #569CD6\">DECLARE<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #569CD6\">PROCEDURE<\/span><span style=\"color: #D4D4D4\"> enable_plscope <\/span><span style=\"color: #569CD6\">IS<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #569CD6\">BEGIN<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">EXECUTE<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">IMMEDIATE<\/span><span style=\"color: #D4D4D4\"> q<\/span><span style=\"color: #CE9178\">&#39;[ALTER SESSION SET plscope_settings=&#39;<\/span><span style=\"color: #D4D4D4\">IDENTIFIERS:ALL, STATEMENTS:ALL<\/span><span style=\"color: #CE9178\">&#39;]&#39;<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #569CD6\">END<\/span><span style=\"color: #D4D4D4\"> enable_plscope;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #6A9955\">--<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #569CD6\">PROCEDURE<\/span><span style=\"color: #D4D4D4\"> compile_defs_without_plscope <\/span><span style=\"color: #569CD6\">IS<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #569CD6\">BEGIN<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &lt;&lt;compile_definition&gt;&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">FOR<\/span><span style=\"color: #D4D4D4\"> r <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         <\/span><span style=\"color: #569CD6\">WITH<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #6A9955\">-- application users in scope of the analysis<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #6A9955\">-- other users are treated as if they were not istalled<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            app_user <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">               <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> username<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                 <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> dba_users<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #569CD6\">WHERE<\/span><span style=\"color: #D4D4D4\"> oracle_maintained = <\/span><span style=\"color: #CE9178\">&#39;N&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            ),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #6A9955\">-- objects for which PL\/Scope metadata is required<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            obj <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> (<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> o.owner, o.object_type, o.object_name<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">                  <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> dba_objects o<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">                 <\/span><span style=\"color: #569CD6\">WHERE<\/span><span style=\"color: #D4D4D4\"> object_name <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #CE9178\">&#39;DBMS_UTILITY&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;OWA_UTIL&#39;<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">                   <\/span><span style=\"color: #569CD6\">AND<\/span><span style=\"color: #D4D4D4\"> object_type <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #CE9178\">&#39;PACKAGE&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;SYNONYM&#39;<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">               <\/span><span style=\"color: #569CD6\">UNION ALL<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">               <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> o.owner, o.object_type, o.object_name<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                 <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> dba_objects o<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                 <\/span><span style=\"color: #569CD6\">JOIN<\/span><span style=\"color: #D4D4D4\"> app_user u <\/span><span style=\"color: #569CD6\">ON<\/span><span style=\"color: #D4D4D4\"> u.username = o.owner<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #569CD6\">WHERE<\/span><span style=\"color: #D4D4D4\"> object_type <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #CE9178\">&#39;PACKAGE BODY&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;TYPE BODY&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;FUNCTION&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                         <\/span><span style=\"color: #CE9178\">&#39;PROCEDURE&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;TRIGGER&#39;<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            ),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #6A9955\">-- objects without PL\/Scope metadata<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            missing_plscope_obj <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">               <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> o.owner, o.object_type, o.object_name<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                 <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> obj o<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                 <\/span><span style=\"color: #569CD6\">LEFT JOIN<\/span><span style=\"color: #D4D4D4\"> dba_identifiers i <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                   <\/span><span style=\"color: #569CD6\">ON<\/span><span style=\"color: #D4D4D4\"> i.owner = o.owner <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                      <\/span><span style=\"color: #569CD6\">AND<\/span><span style=\"color: #D4D4D4\"> i.object_type = o.object_type<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                      <\/span><span style=\"color: #569CD6\">AND<\/span><span style=\"color: #D4D4D4\"> i.object_name = o.object_name<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                      <\/span><span style=\"color: #569CD6\">AND<\/span><span style=\"color: #D4D4D4\"> i.usage_context_id = <\/span><span style=\"color: #B5CEA8\">0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #569CD6\">WHERE<\/span><span style=\"color: #D4D4D4\"> i.usage_context_id <\/span><span style=\"color: #569CD6\">IS<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">NULL<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            ),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #6A9955\">-- all objects to recompile and (re)gather PL\/Scope metadata<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            compile_scope <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">               <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> o.owner, o.object_type, o.object_name<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                 <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> obj o<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #569CD6\">WHERE<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">EXISTS<\/span><span style=\"color: #D4D4D4\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                         <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #B5CEA8\">1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                           <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> missing_plscope_obj o2 <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                          <\/span><span style=\"color: #569CD6\">WHERE<\/span><span style=\"color: #D4D4D4\"> o2.owner = <\/span><span style=\"color: #CE9178\">&#39;SYS&#39;<\/span><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                      )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">               <\/span><span style=\"color: #569CD6\">UNION ALL<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">               <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">owner<\/span><span style=\"color: #D4D4D4\">, object_type, object_name<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                 <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> missing_plscope_obj<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #569CD6\">WHERE<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">NOT<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">EXISTS<\/span><span style=\"color: #D4D4D4\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                         <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #B5CEA8\">1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                           <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> missing_plscope_obj o2 <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                          <\/span><span style=\"color: #569CD6\">WHERE<\/span><span style=\"color: #D4D4D4\"> o2.owner = <\/span><span style=\"color: #CE9178\">&#39;SYS&#39;<\/span><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                      )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            ),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #6A9955\">-- compile statement required to produce PL\/Scope metadata<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            compile_stmt <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">               <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&#39;ALTER &#39;<\/span><span style=\"color: #D4D4D4\"> || <\/span><span style=\"color: #DCDCAA\">replace<\/span><span style=\"color: #D4D4D4\">(object_type, <\/span><span style=\"color: #CE9178\">&#39; BODY&#39;<\/span><span style=\"color: #D4D4D4\">) <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                      || <\/span><span style=\"color: #CE9178\">&#39; &quot;&#39;<\/span><span style=\"color: #D4D4D4\"> || <\/span><span style=\"color: #569CD6\">owner<\/span><span style=\"color: #D4D4D4\"> || <\/span><span style=\"color: #CE9178\">&#39;&quot;.&quot;&#39;<\/span><span style=\"color: #D4D4D4\"> || object_name || <\/span><span style=\"color: #CE9178\">&#39;&quot; COMPILE&#39;<\/span><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                      || <\/span><span style=\"color: #569CD6\">CASE<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                            <\/span><span style=\"color: #569CD6\">WHEN<\/span><span style=\"color: #D4D4D4\"> object_type <\/span><span style=\"color: #569CD6\">LIKE<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&#39;%BODY&#39;<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">THEN<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                               <\/span><span style=\"color: #CE9178\">&#39; BODY&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                         <\/span><span style=\"color: #569CD6\">END<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> stmt<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                 <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> compile_scope<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         <\/span><span style=\"color: #6A9955\">-- main<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> stmt<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">           <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> compile_stmt<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      ) <\/span><span style=\"color: #569CD6\">LOOP<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         <\/span><span style=\"color: #569CD6\">EXECUTE<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">IMMEDIATE<\/span><span style=\"color: #D4D4D4\"> r.stmt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">END<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">LOOP<\/span><span style=\"color: #D4D4D4\"> compile_definition;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #569CD6\">END<\/span><span style=\"color: #D4D4D4\"> compile_defs_without_plscope;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #6A9955\">--<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #569CD6\">PROCEDURE<\/span><span style=\"color: #D4D4D4\"> recompile_invalids <\/span><span style=\"color: #569CD6\">IS<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #569CD6\">BEGIN<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &lt;&lt;schemas_with_invalids&gt;&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">FOR<\/span><span style=\"color: #D4D4D4\"> r <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         <\/span><span style=\"color: #569CD6\">SELECT DISTINCT<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">owner<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">           <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> dba_objects<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #569CD6\">WHERE<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">status<\/span><span style=\"color: #D4D4D4\"> != <\/span><span style=\"color: #CE9178\">&#39;VALID&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #569CD6\">ORDER BY<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">CASE<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">owner<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                      <\/span><span style=\"color: #569CD6\">WHEN<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&#39;SYS&#39;<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">THEN<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                         <\/span><span style=\"color: #B5CEA8\">1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                      <\/span><span style=\"color: #569CD6\">WHEN<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&#39;SYSTEM&#39;<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">THEN<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                         <\/span><span style=\"color: #B5CEA8\">2<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                      <\/span><span style=\"color: #569CD6\">ELSE<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                         <\/span><span style=\"color: #B5CEA8\">3<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                   <\/span><span style=\"color: #569CD6\">END<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #569CD6\">owner<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      ) <\/span><span style=\"color: #569CD6\">LOOP<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         utl_recomp.recomp_serial(r.owner);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">END<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">LOOP<\/span><span style=\"color: #D4D4D4\"> schemas_with_invalids;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #569CD6\">END<\/span><span style=\"color: #D4D4D4\"> recompile_invalids;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">BEGIN<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   enable_plscope;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   compile_defs_without_plscope;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   recompile_invalids;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">END<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\/<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Here&#8217;s the query to check application users.<\/p>\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:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(3 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">Users secured against SQL injection attacks<\/span><span role=\"button\" tabindex=\"0\" data-code=\"WITH\n   app_user AS (\n      SELECT username\n        FROM dba_users\n       WHERE oracle_maintained = 'N'\n   ),\n   obj AS (\n      SELECT o.owner, o.object_type, o.object_name\n        FROM dba_objects o\n        JOIN app_user u ON u.username = o.owner\n       WHERE object_type IN ('PACKAGE BODY', 'TYPE BODY', 'FUNCTION', 'PROCEDURE', 'TRIGGER')\n   ),\n   missing_plscope_obj AS (\n      SELECT o.owner, o.object_type, o.object_name\n        FROM obj o\n        LEFT JOIN dba_identifiers i\n          ON i.owner = o.owner\n             AND i.object_type = o.object_type\n             AND i.object_name = o.object_name\n             AND i.usage_context_id = 0\n       WHERE i.usage_context_id IS NULL\n   ),\n   stmt AS (\n      SELECT s.owner, s.object_type, s.object_name, s.type, s.line, s.col\n        FROM dba_statements s\n        JOIN app_user u ON u.username = s.owner\n       WHERE s.type IN ('EXECUTE IMMEDIATE', 'OPEN')\n   ),\n   dep AS (\n      SELECT d.owner, d.name as object_name, d.type as object_type, d.referenced_name\n        FROM dba_dependencies d\n        JOIN app_user u ON u.username = d.owner\n       WHERE d.referenced_name IN (\n                'DBMS_SQL', 'DBMS_DDL', 'DBMS_HS_PASSTHROUGH', 'DBMS_SYS_SQL'\n             )\n   ),\n   issues AS (\n      SELECT owner, \n             object_type, \n             object_name, \n             type AS potential_sqli_risk\n        FROM stmt\n       WHERE type = 'EXECUTE IMMEDIATE'\n      UNION\n      SELECT stmt.owner, \n             stmt.object_type, \n             stmt.object_name, \n             'OPEN-FOR WITH DYNAMIC SQL'\n        FROM stmt\n        JOIN dba_source src\n          ON src.owner = stmt.owner\n             AND src.type = stmt.object_type\n             AND src.name = stmt.object_name\n             AND src.line = stmt.line\n       WHERE stmt.type = 'OPEN'\n         AND regexp_substr(substr(src.text, stmt.col), '^open\\s+', 1, 1, 'i') IS NULL\n         AND regexp_substr(substr(src.text, stmt.col), '^(&quot;?\\w+&quot;?|q?'')', 1, 1, 'i') IS NOT NULL\n      UNION\n      SELECT owner, \n             object_type, \n             object_name, \n             referenced_name\n        FROM dep\n      UNION\n      SELECT i.owner, \n             i.object_type, \n             i.object_name, \n             r.object_name || '.' || r.name \n        FROM dba_identifiers i\n        JOIN app_user u ON u.username = i.owner\n        JOIN dba_identifiers r\n          ON r.signature = i.signature\n             AND r.usage = 'DECLARATION'\n       WHERE i.usage = 'CALL'\n         AND r.owner = 'SYS'\n         AND r.object_type = 'PACKAGE'\n         AND (r.object_name, r.name) IN (\n                ('DBMS_UTILITY', 'EXEC_DDL_STATEMENT'),\n                ('OWA_UTIL', 'BIND_VARIABLES'),\n                ('OWA_UTIL', 'LISTPRINT'),\n                ('OWA_UTIL', 'TABLEPRINT')\n             )\n      UNION\n      SELECT o.owner, \n             o.object_type, \n             o.object_name, \n             'SQL FROM JAVA SUSPECTED'\n        FROM dba_objects o\n        JOIN app_user u ON u.username = o.owner\n       WHERE o.object_type = 'JAVA CLASS'\n      UNION\n      SELECT owner, \n             object_type, \n             object_name, \n             'PL\/SCOPE METADATA MISSING'\n        FROM missing_plscope_obj\n   ),\n   issue_aggr AS (\n      SELECT u.username AS owner, COUNT(i.owner) issue_count\n        FROM app_user u\n        LEFT JOIN issues i ON i.owner = u.username\n       GROUP BY u.username\n   ),\n   summary AS (\n      SELECT owner,\n             CASE\n                WHEN issue_count = 0 THEN\n                   'YES'\n                ELSE\n                   'NO'\n             END AS is_user_sql_injection_free,\n             issue_count\n        FROM issue_aggr\n       ORDER BY is_user_sql_injection_free DESC, owner\n   )\n-- main\nSELECT * \n  FROM summary\n WHERE owner LIKE 'THE%';\n \nOWNER         IS_USER_SQL_INJECTION_FREE ISSUE_COUNT\n------------- -------------------------- -----------\nTHE_BAD_DATA  YES                                  0\nTHE_BAD_USER  YES                                  0\nTHE_GOOD_API  YES                                  0\nTHE_GOOD_DATA YES                                  0\nTHE_GOOD_USER YES                                  0\nTHE_UGLY_DATA YES                                  0\nTHE_UGLY_USER YES                                  0\nTHE_BAD_API   NO                                   9\n \n8 rows selected.\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><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 dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #569CD6\">WITH<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   app_user <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> username<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> dba_users<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       <\/span><span style=\"color: #569CD6\">WHERE<\/span><span style=\"color: #D4D4D4\"> oracle_maintained = <\/span><span style=\"color: #CE9178\">&#39;N&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   ),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   obj <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> o.owner, o.object_type, o.object_name<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> dba_objects o<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">JOIN<\/span><span style=\"color: #D4D4D4\"> app_user u <\/span><span style=\"color: #569CD6\">ON<\/span><span style=\"color: #D4D4D4\"> u.username = o.owner<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       <\/span><span style=\"color: #569CD6\">WHERE<\/span><span style=\"color: #D4D4D4\"> object_type <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #CE9178\">&#39;PACKAGE BODY&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;TYPE BODY&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;FUNCTION&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;PROCEDURE&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;TRIGGER&#39;<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   ),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   missing_plscope_obj <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> o.owner, o.object_type, o.object_name<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> obj o<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">LEFT JOIN<\/span><span style=\"color: #D4D4D4\"> dba_identifiers i<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #569CD6\">ON<\/span><span style=\"color: #D4D4D4\"> i.owner = o.owner<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             <\/span><span style=\"color: #569CD6\">AND<\/span><span style=\"color: #D4D4D4\"> i.object_type = o.object_type<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             <\/span><span style=\"color: #569CD6\">AND<\/span><span style=\"color: #D4D4D4\"> i.object_name = o.object_name<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             <\/span><span style=\"color: #569CD6\">AND<\/span><span style=\"color: #D4D4D4\"> i.usage_context_id = <\/span><span style=\"color: #B5CEA8\">0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       <\/span><span style=\"color: #569CD6\">WHERE<\/span><span style=\"color: #D4D4D4\"> i.usage_context_id <\/span><span style=\"color: #569CD6\">IS<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">NULL<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   ),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   stmt <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> s.owner, s.object_type, s.object_name, s.type, s.line, s.col<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> dba_statements s<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">JOIN<\/span><span style=\"color: #D4D4D4\"> app_user u <\/span><span style=\"color: #569CD6\">ON<\/span><span style=\"color: #D4D4D4\"> u.username = s.owner<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       <\/span><span style=\"color: #569CD6\">WHERE<\/span><span style=\"color: #D4D4D4\"> s.type <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #CE9178\">&#39;EXECUTE IMMEDIATE&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;OPEN&#39;<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   ),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   dep <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> d.owner, d.name <\/span><span style=\"color: #569CD6\">as<\/span><span style=\"color: #D4D4D4\"> object_name, d.type <\/span><span style=\"color: #569CD6\">as<\/span><span style=\"color: #D4D4D4\"> object_type, d.referenced_name<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> dba_dependencies d<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">JOIN<\/span><span style=\"color: #D4D4D4\"> app_user u <\/span><span style=\"color: #569CD6\">ON<\/span><span style=\"color: #D4D4D4\"> u.username = d.owner<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       <\/span><span style=\"color: #569CD6\">WHERE<\/span><span style=\"color: #D4D4D4\"> d.referenced_name <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #CE9178\">&#39;DBMS_SQL&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;DBMS_DDL&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;DBMS_HS_PASSTHROUGH&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;DBMS_SYS_SQL&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   ),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   issues <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">owner<\/span><span style=\"color: #D4D4D4\">, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             object_type, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             object_name, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             <\/span><span style=\"color: #569CD6\">type<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> potential_sqli_risk<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> stmt<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       <\/span><span style=\"color: #569CD6\">WHERE<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">type<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #CE9178\">&#39;EXECUTE IMMEDIATE&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">UNION<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> stmt.owner, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             stmt.object_type, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             stmt.object_name, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             <\/span><span style=\"color: #CE9178\">&#39;OPEN-FOR WITH DYNAMIC SQL&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> stmt<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">JOIN<\/span><span style=\"color: #D4D4D4\"> dba_source src<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #569CD6\">ON<\/span><span style=\"color: #D4D4D4\"> src.owner = stmt.owner<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             <\/span><span style=\"color: #569CD6\">AND<\/span><span style=\"color: #D4D4D4\"> src.type = stmt.object_type<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             <\/span><span style=\"color: #569CD6\">AND<\/span><span style=\"color: #D4D4D4\"> src.name = stmt.object_name<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             <\/span><span style=\"color: #569CD6\">AND<\/span><span style=\"color: #D4D4D4\"> src.line = stmt.line<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       <\/span><span style=\"color: #569CD6\">WHERE<\/span><span style=\"color: #D4D4D4\"> stmt.type = <\/span><span style=\"color: #CE9178\">&#39;OPEN&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         <\/span><span style=\"color: #569CD6\">AND<\/span><span style=\"color: #D4D4D4\"> regexp_substr(substr(src.text, stmt.col), <\/span><span style=\"color: #CE9178\">&#39;^open\\s+&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;i&#39;<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #569CD6\">IS<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">NULL<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         <\/span><span style=\"color: #569CD6\">AND<\/span><span style=\"color: #D4D4D4\"> regexp_substr(substr(src.text, stmt.col), <\/span><span style=\"color: #CE9178\">&#39;^(&quot;?\\w+&quot;?|q?&#39;&#39;)&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;i&#39;<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #569CD6\">IS NOT NULL<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">UNION<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">owner<\/span><span style=\"color: #D4D4D4\">, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             object_type, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             object_name, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             referenced_name<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> dep<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">UNION<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> i.owner, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             i.object_type, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             i.object_name, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             r.object_name || <\/span><span style=\"color: #CE9178\">&#39;.&#39;<\/span><span style=\"color: #D4D4D4\"> || r.name <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> dba_identifiers i<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">JOIN<\/span><span style=\"color: #D4D4D4\"> app_user u <\/span><span style=\"color: #569CD6\">ON<\/span><span style=\"color: #D4D4D4\"> u.username = i.owner<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">JOIN<\/span><span style=\"color: #D4D4D4\"> dba_identifiers r<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #569CD6\">ON<\/span><span style=\"color: #D4D4D4\"> r.signature = i.signature<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             <\/span><span style=\"color: #569CD6\">AND<\/span><span style=\"color: #D4D4D4\"> r.usage = <\/span><span style=\"color: #CE9178\">&#39;DECLARATION&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       <\/span><span style=\"color: #569CD6\">WHERE<\/span><span style=\"color: #D4D4D4\"> i.usage = <\/span><span style=\"color: #CE9178\">&#39;CALL&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         <\/span><span style=\"color: #569CD6\">AND<\/span><span style=\"color: #D4D4D4\"> r.owner = <\/span><span style=\"color: #CE9178\">&#39;SYS&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         <\/span><span style=\"color: #569CD6\">AND<\/span><span style=\"color: #D4D4D4\"> r.object_type = <\/span><span style=\"color: #CE9178\">&#39;PACKAGE&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         <\/span><span style=\"color: #569CD6\">AND<\/span><span style=\"color: #D4D4D4\"> (r.object_name, r.name) <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                (<\/span><span style=\"color: #CE9178\">&#39;DBMS_UTILITY&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;EXEC_DDL_STATEMENT&#39;<\/span><span style=\"color: #D4D4D4\">),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                (<\/span><span style=\"color: #CE9178\">&#39;OWA_UTIL&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;BIND_VARIABLES&#39;<\/span><span style=\"color: #D4D4D4\">),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                (<\/span><span style=\"color: #CE9178\">&#39;OWA_UTIL&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;LISTPRINT&#39;<\/span><span style=\"color: #D4D4D4\">),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                (<\/span><span style=\"color: #CE9178\">&#39;OWA_UTIL&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;TABLEPRINT&#39;<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">UNION<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> o.owner, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             o.object_type, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             o.object_name, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             <\/span><span style=\"color: #CE9178\">&#39;SQL FROM JAVA SUSPECTED&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> dba_objects o<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">JOIN<\/span><span style=\"color: #D4D4D4\"> app_user u <\/span><span style=\"color: #569CD6\">ON<\/span><span style=\"color: #D4D4D4\"> u.username = o.owner<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       <\/span><span style=\"color: #569CD6\">WHERE<\/span><span style=\"color: #D4D4D4\"> o.object_type = <\/span><span style=\"color: #CE9178\">&#39;JAVA CLASS&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">UNION<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">owner<\/span><span style=\"color: #D4D4D4\">, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             object_type, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             object_name, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             <\/span><span style=\"color: #CE9178\">&#39;PL\/SCOPE METADATA MISSING&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> missing_plscope_obj<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   ),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   issue_aggr <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> u.username <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">owner<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #DCDCAA\">COUNT<\/span><span style=\"color: #D4D4D4\">(i.owner) issue_count<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> app_user u<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">LEFT JOIN<\/span><span style=\"color: #D4D4D4\"> issues i <\/span><span style=\"color: #569CD6\">ON<\/span><span style=\"color: #D4D4D4\"> i.owner = u.username<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       <\/span><span style=\"color: #569CD6\">GROUP BY<\/span><span style=\"color: #D4D4D4\"> u.username<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   ),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   summary <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">owner<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             <\/span><span style=\"color: #569CD6\">CASE<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #569CD6\">WHEN<\/span><span style=\"color: #D4D4D4\"> issue_count = <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">THEN<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                   <\/span><span style=\"color: #CE9178\">&#39;YES&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #569CD6\">ELSE<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                   <\/span><span style=\"color: #CE9178\">&#39;NO&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             <\/span><span style=\"color: #569CD6\">END<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> is_user_sql_injection_free,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             issue_count<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> issue_aggr<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       <\/span><span style=\"color: #569CD6\">ORDER BY<\/span><span style=\"color: #D4D4D4\"> is_user_sql_injection_free <\/span><span style=\"color: #569CD6\">DESC<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #569CD6\">owner<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">-- main<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> * <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> summary<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">WHERE<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">owner<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">LIKE<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&#39;THE%&#39;<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">OWNER<\/span><span style=\"color: #D4D4D4\">         IS_USER_SQL_INJECTION_FREE ISSUE_COUNT<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">------------- -------------------------- -----------<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">THE_BAD_DATA  YES                                  <\/span><span style=\"color: #B5CEA8\">0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">THE_BAD_USER  YES                                  <\/span><span style=\"color: #B5CEA8\">0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">THE_GOOD_API  YES                                  <\/span><span style=\"color: #B5CEA8\">0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">THE_GOOD_DATA YES                                  <\/span><span style=\"color: #B5CEA8\">0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">THE_GOOD_USER YES                                  <\/span><span style=\"color: #B5CEA8\">0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">THE_UGLY_DATA YES                                  <\/span><span style=\"color: #B5CEA8\">0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">THE_UGLY_USER YES                                  <\/span><span style=\"color: #B5CEA8\">0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">THE_BAD_API   <\/span><span style=\"color: #569CD6\">NO<\/span><span style=\"color: #D4D4D4\">                                   <\/span><span style=\"color: #B5CEA8\">9<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #B5CEA8\">8<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">rows<\/span><span style=\"color: #D4D4D4\"> selected.<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>To see the issues of THE_BAD_API you may simply change the main part of the query as follows:<\/p>\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:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-start:116;--cbp-line-number-width:calc(3 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">All rule 2 issues<\/span><span role=\"button\" tabindex=\"0\" data-code=\"-- main\nSELECT * \n  FROM issues\n WHERE owner LIKE 'THE%';\n \nOWNER         OBJECT_TYPE   OBJECT_NAME POTENTIAL_SQLI_RISK                     \n------------- ------------- ----------- ----------------------------------------\nTHE_BAD_API   JAVA CLASS    C           SQL FROM JAVA SUSPECTED                 \nTHE_BAD_API   PACKAGE BODY  PKG         EXECUTE IMMEDIATE                       \nTHE_BAD_API   PACKAGE BODY  PKG2        DBMS_DDL                                \nTHE_BAD_API   PACKAGE BODY  PKG2        DBMS_SQL                                \nTHE_BAD_API   PACKAGE BODY  PKG2        DBMS_SYS_SQL                            \nTHE_BAD_API   PACKAGE BODY  PKG2        DBMS_UTILITY.EXEC_DDL_STATEMENT         \nTHE_BAD_API   PACKAGE BODY  PKG2        EXECUTE IMMEDIATE                       \nTHE_BAD_API   PACKAGE BODY  PKG2        OPEN-FOR WITH DYNAMIC SQL               \nTHE_BAD_API   PACKAGE BODY  PKG2        OWA_UTIL.LISTPRINT                      \n \n9 rows selected.\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><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 dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #6A9955\">-- main<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> * <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> issues<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">WHERE<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">owner<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">LIKE<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&#39;THE%&#39;<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">OWNER<\/span><span style=\"color: #D4D4D4\">         OBJECT_TYPE   OBJECT_NAME POTENTIAL_SQLI_RISK                     <\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">------------- ------------- ----------- ----------------------------------------<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">THE_BAD_API   JAVA CLASS    C           <\/span><span style=\"color: #569CD6\">SQL<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> JAVA SUSPECTED                 <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">THE_BAD_API   PACKAGE BODY  PKG         <\/span><span style=\"color: #569CD6\">EXECUTE<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">IMMEDIATE<\/span><span style=\"color: #D4D4D4\">                       <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">THE_BAD_API   PACKAGE BODY  PKG2        DBMS_DDL                                <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">THE_BAD_API   PACKAGE BODY  PKG2        DBMS_SQL                                <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">THE_BAD_API   PACKAGE BODY  PKG2        DBMS_SYS_SQL                            <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">THE_BAD_API   PACKAGE BODY  PKG2        DBMS_UTILITY.EXEC_DDL_STATEMENT         <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">THE_BAD_API   PACKAGE BODY  PKG2        <\/span><span style=\"color: #569CD6\">EXECUTE<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">IMMEDIATE<\/span><span style=\"color: #D4D4D4\">                       <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">THE_BAD_API   PACKAGE BODY  PKG2        <\/span><span style=\"color: #569CD6\">OPEN<\/span><span style=\"color: #D4D4D4\">-<\/span><span style=\"color: #569CD6\">FOR<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">WITH<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">DYNAMIC<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">SQL<\/span><span style=\"color: #D4D4D4\">               <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">THE_BAD_API   PACKAGE BODY  PKG2        OWA_UTIL.LISTPRINT                      <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #B5CEA8\">9<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">rows<\/span><span style=\"color: #D4D4D4\"> selected.<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>To suspect that every JAVA CLASS uses SQL is not a very&nbsp;differentiated analysis result. Further Java-specific code analysis is necessary. However, the other results are reasonable.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusion<\/h2>\n\n\n\n<p>In this blog post, I showed&nbsp;how to prove, that a PL\/SQL application does not use dynamic SQL and therefore is secured against SQL injection attacks.<\/p>\n\n\n\n<p>The use of dynamic SQL is automatically reduced in PL\/SQL because it is easier and more efficient for a developer to deal with compile errors than runtime errors. But there are cases when static SQL is not possible or not efficient enough. In those cases, proper input validation is a necessity to mitigate the SQL injection risk (see also &#8220;Ensuring the safety of a SQL literal&#8221; in&nbsp;<a href=\"http:\/\/www.oracle.com\/technetwork\/database\/features\/plsql\/overview\/how-to-write-injection-proof-plsql-1-129572.pdf\">How to write SQL injection proof PL\/SQL<\/a>).<\/p>\n\n\n\n<p>Views are often part of the API in applications I&#8217;m involved in. I like the power and the flexibility of these views. In fact, I&#8217;m very grateful that the Oracle database provides a view API for its data dictionary, which simplified the analysis for this blog post. But views come with a SQL injection risk.&nbsp;Moreover, the risk and responsibility are delegated to a certain extent to the developers using the database API. Hence, in the future, I will think twice before making views part of the API, but I will for sure not rule them out per se.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>If you are guarding your data behind a hard shell PL\/SQL API&nbsp;as Bryn Llewellyn, Toon Koppelaars and others recommend, then it should be quite easy to prove, that your PL\/SQL application is secured against SQL injection attacks. The basic idea is 1) that you do not expose data via tables nor views<span class=\"excerpt-hellip\"> [\u2026]<\/span><\/p>\n","protected":false},"author":1,"featured_media":8048,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5],"tags":[86,109,97,13,103,104],"class_list":["post-8010","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-oracle","tag-code-analysis","tag-pinkdb","tag-plscope","tag-plsql","tag-smartdb","tag-sql-injection"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>How to Prove That Your SmartDB App Is Secure - Philipp Salvisberg&#039;s 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:\/\/www.salvis.com\/blog\/2017\/12\/17\/how-to-prove-that-your-smartdb-app-is-secured-against-sql-injection-attacks\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"How to Prove That Your SmartDB App Is Secure - Philipp Salvisberg&#039;s Blog\" \/>\n<meta property=\"og:description\" content=\"If you are guarding your data behind a hard shell PL\/SQL API&nbsp;as Bryn Llewellyn, Toon Koppelaars and others recommend, then it should be quite easy to prove, that your PL\/SQL application is secured against SQL injection attacks. The basic idea is 1) that you do not expose data via tables nor views [\u2026]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.salvis.com\/blog\/2017\/12\/17\/how-to-prove-that-your-smartdb-app-is-secured-against-sql-injection-attacks\/\" \/>\n<meta property=\"og:site_name\" content=\"Philipp Salvisberg&#039;s Blog\" \/>\n<meta property=\"article:published_time\" content=\"2017-12-16T23:46:08+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-11-08T19:38:06+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/12\/the_bad_layers.png\" \/>\n\t<meta property=\"og:image:width\" content=\"618\" \/>\n\t<meta property=\"og:image:height\" content=\"618\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Philipp Salvisberg\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@phsalvisberg\" \/>\n<meta name=\"twitter:site\" content=\"@phsalvisberg\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Philipp Salvisberg\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"9 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2017\\\/12\\\/17\\\/how-to-prove-that-your-smartdb-app-is-secured-against-sql-injection-attacks\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2017\\\/12\\\/17\\\/how-to-prove-that-your-smartdb-app-is-secured-against-sql-injection-attacks\\\/\"},\"author\":{\"name\":\"Philipp Salvisberg\",\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/#\\\/schema\\\/person\\\/34352245c48678b1a5a05d4bc1339515\"},\"headline\":\"How to Prove That Your SmartDB App Is Secure\",\"datePublished\":\"2017-12-16T23:46:08+00:00\",\"dateModified\":\"2023-11-08T19:38:06+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2017\\\/12\\\/17\\\/how-to-prove-that-your-smartdb-app-is-secured-against-sql-injection-attacks\\\/\"},\"wordCount\":1431,\"commentCount\":5,\"publisher\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/#\\\/schema\\\/person\\\/34352245c48678b1a5a05d4bc1339515\"},\"image\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2017\\\/12\\\/17\\\/how-to-prove-that-your-smartdb-app-is-secured-against-sql-injection-attacks\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/wp-content\\\/uploads\\\/2017\\\/12\\\/the_bad_layers.png\",\"keywords\":[\"Code Analysis\",\"PinkDB\",\"PL\\\/Scope\",\"PL\\\/SQL\",\"SmartDB\",\"SQL Injection\"],\"articleSection\":[\"Oracle\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2017\\\/12\\\/17\\\/how-to-prove-that-your-smartdb-app-is-secured-against-sql-injection-attacks\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2017\\\/12\\\/17\\\/how-to-prove-that-your-smartdb-app-is-secured-against-sql-injection-attacks\\\/\",\"url\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2017\\\/12\\\/17\\\/how-to-prove-that-your-smartdb-app-is-secured-against-sql-injection-attacks\\\/\",\"name\":\"How to Prove That Your SmartDB App Is Secure - Philipp Salvisberg&#039;s Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2017\\\/12\\\/17\\\/how-to-prove-that-your-smartdb-app-is-secured-against-sql-injection-attacks\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2017\\\/12\\\/17\\\/how-to-prove-that-your-smartdb-app-is-secured-against-sql-injection-attacks\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/wp-content\\\/uploads\\\/2017\\\/12\\\/the_bad_layers.png\",\"datePublished\":\"2017-12-16T23:46:08+00:00\",\"dateModified\":\"2023-11-08T19:38:06+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2017\\\/12\\\/17\\\/how-to-prove-that-your-smartdb-app-is-secured-against-sql-injection-attacks\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2017\\\/12\\\/17\\\/how-to-prove-that-your-smartdb-app-is-secured-against-sql-injection-attacks\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2017\\\/12\\\/17\\\/how-to-prove-that-your-smartdb-app-is-secured-against-sql-injection-attacks\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/wp-content\\\/uploads\\\/2017\\\/12\\\/the_bad_layers.png\",\"contentUrl\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/wp-content\\\/uploads\\\/2017\\\/12\\\/the_bad_layers.png\",\"width\":618,\"height\":618},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2017\\\/12\\\/17\\\/how-to-prove-that-your-smartdb-app-is-secured-against-sql-injection-attacks\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"How to Prove That Your SmartDB App Is Secure\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/\",\"name\":\"Philipp Salvisberg&#039;s Blog\",\"description\":\"Database-centric development\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/#\\\/schema\\\/person\\\/34352245c48678b1a5a05d4bc1339515\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/#\\\/schema\\\/person\\\/34352245c48678b1a5a05d4bc1339515\",\"name\":\"Philipp Salvisberg\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/wp-content\\\/uploads\\\/2010\\\/11\\\/phs_trivadis4.jpg\",\"url\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/wp-content\\\/uploads\\\/2010\\\/11\\\/phs_trivadis4.jpg\",\"contentUrl\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/wp-content\\\/uploads\\\/2010\\\/11\\\/phs_trivadis4.jpg\",\"width\":400,\"height\":400,\"caption\":\"Philipp Salvisberg\"},\"logo\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/wp-content\\\/uploads\\\/2010\\\/11\\\/phs_trivadis4.jpg\"},\"sameAs\":[\"http:\\\/\\\/www.salvis.com\\\/\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"How to Prove That Your SmartDB App Is Secure - Philipp Salvisberg&#039;s 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:\/\/www.salvis.com\/blog\/2017\/12\/17\/how-to-prove-that-your-smartdb-app-is-secured-against-sql-injection-attacks\/","og_locale":"en_US","og_type":"article","og_title":"How to Prove That Your SmartDB App Is Secure - Philipp Salvisberg&#039;s Blog","og_description":"If you are guarding your data behind a hard shell PL\/SQL API&nbsp;as Bryn Llewellyn, Toon Koppelaars and others recommend, then it should be quite easy to prove, that your PL\/SQL application is secured against SQL injection attacks. The basic idea is 1) that you do not expose data via tables nor views [\u2026]","og_url":"https:\/\/www.salvis.com\/blog\/2017\/12\/17\/how-to-prove-that-your-smartdb-app-is-secured-against-sql-injection-attacks\/","og_site_name":"Philipp Salvisberg&#039;s Blog","article_published_time":"2017-12-16T23:46:08+00:00","article_modified_time":"2023-11-08T19:38:06+00:00","og_image":[{"width":618,"height":618,"url":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/12\/the_bad_layers.png","type":"image\/png"}],"author":"Philipp Salvisberg","twitter_card":"summary_large_image","twitter_creator":"@phsalvisberg","twitter_site":"@phsalvisberg","twitter_misc":{"Written by":"Philipp Salvisberg","Est. reading time":"9 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.salvis.com\/blog\/2017\/12\/17\/how-to-prove-that-your-smartdb-app-is-secured-against-sql-injection-attacks\/#article","isPartOf":{"@id":"https:\/\/www.salvis.com\/blog\/2017\/12\/17\/how-to-prove-that-your-smartdb-app-is-secured-against-sql-injection-attacks\/"},"author":{"name":"Philipp Salvisberg","@id":"https:\/\/www.salvis.com\/blog\/#\/schema\/person\/34352245c48678b1a5a05d4bc1339515"},"headline":"How to Prove That Your SmartDB App Is Secure","datePublished":"2017-12-16T23:46:08+00:00","dateModified":"2023-11-08T19:38:06+00:00","mainEntityOfPage":{"@id":"https:\/\/www.salvis.com\/blog\/2017\/12\/17\/how-to-prove-that-your-smartdb-app-is-secured-against-sql-injection-attacks\/"},"wordCount":1431,"commentCount":5,"publisher":{"@id":"https:\/\/www.salvis.com\/blog\/#\/schema\/person\/34352245c48678b1a5a05d4bc1339515"},"image":{"@id":"https:\/\/www.salvis.com\/blog\/2017\/12\/17\/how-to-prove-that-your-smartdb-app-is-secured-against-sql-injection-attacks\/#primaryimage"},"thumbnailUrl":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/12\/the_bad_layers.png","keywords":["Code Analysis","PinkDB","PL\/Scope","PL\/SQL","SmartDB","SQL Injection"],"articleSection":["Oracle"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.salvis.com\/blog\/2017\/12\/17\/how-to-prove-that-your-smartdb-app-is-secured-against-sql-injection-attacks\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.salvis.com\/blog\/2017\/12\/17\/how-to-prove-that-your-smartdb-app-is-secured-against-sql-injection-attacks\/","url":"https:\/\/www.salvis.com\/blog\/2017\/12\/17\/how-to-prove-that-your-smartdb-app-is-secured-against-sql-injection-attacks\/","name":"How to Prove That Your SmartDB App Is Secure - Philipp Salvisberg&#039;s Blog","isPartOf":{"@id":"https:\/\/www.salvis.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.salvis.com\/blog\/2017\/12\/17\/how-to-prove-that-your-smartdb-app-is-secured-against-sql-injection-attacks\/#primaryimage"},"image":{"@id":"https:\/\/www.salvis.com\/blog\/2017\/12\/17\/how-to-prove-that-your-smartdb-app-is-secured-against-sql-injection-attacks\/#primaryimage"},"thumbnailUrl":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/12\/the_bad_layers.png","datePublished":"2017-12-16T23:46:08+00:00","dateModified":"2023-11-08T19:38:06+00:00","breadcrumb":{"@id":"https:\/\/www.salvis.com\/blog\/2017\/12\/17\/how-to-prove-that-your-smartdb-app-is-secured-against-sql-injection-attacks\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.salvis.com\/blog\/2017\/12\/17\/how-to-prove-that-your-smartdb-app-is-secured-against-sql-injection-attacks\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.salvis.com\/blog\/2017\/12\/17\/how-to-prove-that-your-smartdb-app-is-secured-against-sql-injection-attacks\/#primaryimage","url":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/12\/the_bad_layers.png","contentUrl":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/12\/the_bad_layers.png","width":618,"height":618},{"@type":"BreadcrumbList","@id":"https:\/\/www.salvis.com\/blog\/2017\/12\/17\/how-to-prove-that-your-smartdb-app-is-secured-against-sql-injection-attacks\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.salvis.com\/blog\/"},{"@type":"ListItem","position":2,"name":"How to Prove That Your SmartDB App Is Secure"}]},{"@type":"WebSite","@id":"https:\/\/www.salvis.com\/blog\/#website","url":"https:\/\/www.salvis.com\/blog\/","name":"Philipp Salvisberg&#039;s Blog","description":"Database-centric development","publisher":{"@id":"https:\/\/www.salvis.com\/blog\/#\/schema\/person\/34352245c48678b1a5a05d4bc1339515"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.salvis.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.salvis.com\/blog\/#\/schema\/person\/34352245c48678b1a5a05d4bc1339515","name":"Philipp Salvisberg","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2010\/11\/phs_trivadis4.jpg","url":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2010\/11\/phs_trivadis4.jpg","contentUrl":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2010\/11\/phs_trivadis4.jpg","width":400,"height":400,"caption":"Philipp Salvisberg"},"logo":{"@id":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2010\/11\/phs_trivadis4.jpg"},"sameAs":["http:\/\/www.salvis.com\/"]}]}},"_links":{"self":[{"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/posts\/8010","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/comments?post=8010"}],"version-history":[{"count":132,"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/posts\/8010\/revisions"}],"predecessor-version":[{"id":12755,"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/posts\/8010\/revisions\/12755"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/media\/8048"}],"wp:attachment":[{"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/media?parent=8010"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/categories?post=8010"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/tags?post=8010"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}