程序被拒绝

时间:2016-11-09 12:45:15

标签: oracle stored-procedures oracle-apex

我已关注this post并在数据库中创建了一个过程。然后我在页面中创建了一个我要查看PDF的新区域。在源头我把它:

<embed src="#OWNER#.download_my_file?p_file=21" width="500" height="375">

21是我在程序中指定的表中的一个ID。这只是暂时的固定值。

当我查看该页面时,我遇到了一个错误:

enter image description here

  

(拒绝访问名为:INGTOCBADB.download_my_file的程序)

我该如何解决这个问题?

3 个答案:

答案 0 :(得分:3)

您需要将您的程序添加到&#34;白名单&#34;在APEX_xxxxxx模式中的函数WWV_FLOW_EPG_INCLUDE_MOD_LOCAL中调用允许的过程:

create or replace Function wwv_flow_epg_include_mod_local(procedure_name IN VARCHAR2)
return boolean
is
BEGIN
   IF upper(procedure_name) IN (
   'DOWNLOAD_MY_FILE',
   ... other procedures already listed
   )
   THEN
      return TRUE;
   ELSE
      return FALSE;
   END IF;
end wwv_flow_epg_include_mod_local;

答案 1 :(得分:0)

另一种方法是使用申请流程。我更喜欢这种方式,而不是启用对db过程的公共访问。

您可以在下面的博客中找到如何链接和部分复制的内容。该博客由Oracle软件开发总监兼Apex经理Joel Kallman撰写。这个人值得一听。

http://joelkallman.blogspot.be/2014/03/yet-another-post-how-to-link-to.html

我复制了大部分博客并更新了指向工作文档链接的链接。

  

首先,的方式是通过调用的PL / SQL过程   直接来自URL。我看到这个“解决方案”通常记录在   互联网,一般来说,不应该遵循。默认   Oracle Application Express的配置有一个白名单条目   点,可从URL调用。出于安全考虑,你绝对是   想要保留这个限制而不是放松它。这是   指定为PlsqlRequestValidationFunction for mod_plsql和   {REST}数据服务security.disableDefaultExclusionList   (nee APEX听众)有了这个默认的安全措施,您就可以了   将无法从URL调用架构中的过程。   好!

     

从APEX应用程序中的URL返回图像的最简单方法   可以通过RESTful服务或按需流程进行。这个   博客文章将涵盖按需流程。这肯定更容易   通过RESTful服务实现,如果你可以通过RESTful来实现   打电话,这将永远快得多 - 克里斯有一个great example如何   去做这个。但是,通过按需实现这一点的一个好处   过程是它也会受到任何条件或约束   适用于您的APEX申请的授权方案   (即,如果您的应用程序需要身份验证和   授权,除非他们是,否则某人将无法访问该URL   同样通过APEX申请认证并获得完全授权。

  1. 导航到Application Builder - &gt;共享组件 - &gt;申请项目
  2. 单击“创建”
    • 姓名:FILE_ID
    • 范围:申请
    • 会话状态保护:不受限制
  3. 导航到Application Builder - &gt;共享组件 - &gt;申请流程
  4. 单击“创建”
    • 姓名:GETIMAGE
    • 点:按需:在页面流程请求时运行此应用程序进程。
  5. 点击下一步
  6. 对于Process Text,请输入以下代码:

    begin
      for c1 in (select *
                 from my_image_table
                where id = :FILE_ID) loop
        --
        sys.htp.init;
        sys.owa_util.mime_header( c1.mime_type, FALSE );
        sys.htp.p('Content-length: ' || sys.dbms_lob.getlength( c1.blob_content));
        sys.htp.p('Content-Disposition: attachment; filename="' || c1.filename || '"' );
        sys.htp.p('Cache-Control: max-age=3600');  -- tell the browser to cache for one hour, adjust as necessary
        sys.owa_util.http_header_close;
        sys.wpg_docload.download_file( c1.blob_content );
    
        apex_application.stop_apex_engine;
      end loop;
    end;
    
  7. 然后,您需要做的就是在应用程序中构建一个调用此应用程序进程的URL,如Application Express Application Builder Users' Guide中所述。您可以使用APEX_UTIL.PREPARE_URL手动构建URL,或在报告列的声明属性中指定链接。请务必指定APPLICATION_PROCESS=GETIMAGE的请求(或您的申请流程名称)。该URL看起来像:

    f?p=&APP_ID.:0:&APP_SESSION.:APPLICATION_PROCESS=GETIMAGE:::FILE_ID:<some_valid_id>
    

    这就是它的全部内容。

    一些结束评论:

    1. 请注意为申请流程指定的授权方案。默认情况下,授权方案将是“不能是公共用户”,这对于需要身份验证的应用程序通常是可接受的。但请记住,您也可以根据其他授权方案限制这些链接。
    2. 如果您想以内嵌方式显示图片而不是通过浏览器下载,只需将内容配置从“附件”更改为“内联”。
    3. 对此代码进行合理的扩展和优化将是为您的基础表添加版本号,每次文件更改时都将其递增,然后在URL中引用此文件版本号。这样做,结合MIME头中的Cache-Control指令,可以让客户端浏览器长时间缓存它,而无需再次运行On Demand Process(从而节省宝贵的数据库周期)。
    4. 应用程序进程也可以在页面级别定义,因此如果您希望下载链接受特定页面上的授权方案约束,您也可以这样做。
    5. 小心如何使用它。如果您没有实现某种形式的浏览器缓存,那么在页面上内联显示500个图像的报告将导致每个用户每页视图向APEX引擎和数据库发出500个请求!哎哟!然后,DBA开始寻找砰击他们数据库并报告“APEX正在杀死我们的数据库”的人是一个时间问题。有一个excellent explanation of cache headers here
    6. 再一次 - 学分归Joel Kallman所有。

答案 2 :(得分:0)

对我来说有用的是在default.xml文件中添加条目,以便ORDS知道白名单是什么

EG

<entry key="security.inclusionList">wwv_flow*,f,n,p,q,cust,apex,ADMIN.*</entry>