Oracle11gR2下PL/SQL访问网络的错误ORA24247

原有系统运行在10g下面,有很多程序是使用utl_smtp, utl_http等包进行网络访问。最近升级到11gR2之后,wait4friend 遇到ORA-24247错误。错误信息如下

ORA-24247: network access denied by access control list (ACL)

这是Oracle11g的一个安全特性,所有使用网络访问的用户都需要特殊的赋权。解决办法也挺简单,只需要建立一个ACL控制,并且设置相应的权限即可。

-------------------------------------------------------------------
--drop
declare
  v_acl varchar2(100):= 'fxkz_alert.xml';
begin
   dbms_network_acl_admin.drop_acl (acl => v_acl);
   commit;
end;
/

-------------------------------------------------------------------
-- 新建ACL并且设置地址
declare
  v_user_name varchar2(30) := upper('test');
  v_acl       varchar2(100) := 'fxkz_alert.xml';
  v_privilege varchar2(30) := lower('connect');
begin
  -- 新建acl
  dbms_network_acl_admin.create_acl(acl         => v_acl,
                                    description => '风险控制警报acl',
                                    principal   => v_user_name,
                                    is_grant    => true,
                                    privilege   => v_privilege,
                                    start_date  => null,
                                    end_date    => null);
  -- 赋予指定地址和端口的权限          
  -- 这里使用通配符代替如下地址和端口
  -- smtp.exmail.qq.com:25
  -- 221.236.20.139:8100                       
  dbms_network_acl_admin.assign_acl(acl        => v_acl,
                                    host       => '*',
                                    lower_port => 1,
                                    upper_port => 10000);
  commit;
end;
/

设置之后可以通过视图检查设置的结果

-------------------------------------------------------------------
-- 检查配置情况
select r.any_path from resource_view r where r.any_path like '/sys/acls/%.xml' order by 1;
select a.host, a.lower_port, a.upper_port,a.acl, a.aclid from dba_network_acls  a where a.ACL='/sys/acls/fxkz_alert.xml';
select p.* from dba_network_acl_privileges p;

使用简单的代码也可以直接验证设置的用户权限是否生效

-----------------------------------------------------------------
-- 测试代码,必须使用被测试的用户执行
declare
  v_conn utl_smtp.connection;
begin
  v_conn := utl_smtp.open_connection('smtp.exmail.qq.com', 25);
end;
/

declare
  v_http_url varchar2(300); --短信平台地址
  v_http_req utl_http.req; --http请求对象
begin
  v_http_url := 'http://221.236.20.139:8100/sendsms/sms.do';
  v_http_req := utl_http.begin_request(v_http_url,
                                       'post',
                                       utl_http.http_version_1_1);
end;
/

如果设置之后,还需要加入其他的用户,也很简单

------------------------------------------------------------------
-- 加入额外的用户
begin
  dbms_network_acl_admin.add_privilege(acl        => 'fxkz_alert.xml',
                                       principal  => upper('bill_src'),
                                       is_grant   => true,
                                       privilege  => 'connect',
                                       start_date => null,
                                       end_date   => null);
  commit;
end;
/

本文参考了下列资料

oracle11g新特性-安全性 发送邮件 报错ora-24247 解决方法
作者:wait4friend
Weibo:@wait4friend
Twitter:@wait4friend
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
原文地址:https://www.cnblogs.com/wait4friend/p/2800870.html