Oracle 实现客户端IP限制

在很多时候我们需要对客户端访问的IP做出限制

如果要在网络上做一些IP地址的限制,一般情况下我们首先想到的是用网络层的防火墙软件。要找网管来设置。 但是如果网管不在,或者仅仅想在数据库层来实现IP地址的限制,DBA们只要修改Server端的一个网络配置文件sqlnet.ora文件就可以了。

Oracle9i以上版本,在目录$ORACLE_HOME/network/admin 或者 %ORACLE_HOME%/network/admin 下)增加如下内容:

tcp.validnode_checking=yes

tcp.invited_nodes =(ip1,ip2,……) #允许访问的ip

tcp.excluded_nodes=(ip1,ip2,……) #不允许访问的ip

修改sqlnet.ora后,重新启动listener服务,改动就可以生效了


方法二:


为了数据库安全,有时候需要限制某些数据库用户只有特定的IP才能登陆,使用触发器,获取登录用户的IP就可以实现上述功能。

SQL语句如下:


CREATE OR REPLACE TRIGGER system.check_ip_addresses
AFTER logon ON DATABASE
BEGIN
IF USER IN ('USER1',
'USER2') THEN
IF sys_context('USERENV',
'IP_ADDRESS') NOT IN ('192.168.0.101',
'192.168.0.102') THEN
raise_application_error(-20000,
'Can not log in from this IP address (' ||
sys_context('USERENV',
'IP_ADDRESS') || ')');
END IF;
END IF;
END;





代码优化,只允许特定数据库用户远程登录

SQL代码如下:

CREATE OR REPLACE TRIGGER system.check_ip_addresses
AFTER logon ON DATABASE
BEGIN
DECLARE
l_count NUMBER;
BEGIN
SELECT COUNT(1)
INTO l_count
FROM cux_local_ip lip
WHERE lip.ip = sys_context('USERENV',
'IP_ADDRESS');
IF l_count = 0 THEN
SELECT COUNT(1)
INTO l_count
FROM cux_acess_remoteip_user ru
WHERE ru.user_name = USER
AND (ru.access_ip = 'ALL' OR sys_context('USERENV',
'IP_ADDRESS') = ru.access_ip);
IF l_count = 0 AND USER !='SYSTEM' THEN
raise_application_error(-20000,
'Login error,Permission denied!');
END IF;
END IF;
END;
END;


其中,
表cux_local_ip,代表本地IP,允许登录所有用户
cux_acess_remoteip_user,字段user_name代表哪些可以在对应的IP登录,access_ip为登录IP(ALL代表所有IP都能登录)


(笔者原创文章,转载请注明出处:https://blog.csdn.net/LFCuiYs)谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值