Oracle11gR2下PL/SQL访问网络的错误ORA-24247

原有系统运行在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' orderby 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 解决方法