当前位置:  数据库>oracle

限制Oracle普通用户能且只能kill自己的会话

    来源: 互联网  发布时间:2017-05-05

    本文导语: 声明: 仅用于测试环境方便调试,不可能应用于生产环境;故请勿加入到程序源代码来实现自动杀进程。 只需一个参数,就能kill用户自己的会话,请小心操作,以免误kill进程。 使用方法: 新开一个session后,执行 EXEC SYS.P_KIL...

声明:

仅用于测试环境方便调试,不可能应用于生产环境;故请勿加入到程序源代码来实现自动杀进程。

只需一个参数,就能kill用户自己的会话,请小心操作,以免误kill进程。

使用方法:

新开一个session后,执行

EXEC SYS.P_KILL_USER_SESSION(要杀的会话的sid);

就能实现sys用户才能操作的 alter system kill session(sid,serial#);

例子:04:14:46 sql1>exec sys.p_kill_user_session(2525);

目的:

一般用户在不具备执行alter system权限的前提下,对于自己的所有session,能达到alter system kill session 功能。

原理:

普通用户先根据(自己的)username和要kill的session的sid查找到这个session的(sid,serial#);再把这两个变量传到另一个存储过程P_KILL_SESSION,该存储过程中sys用户会亲自执行alter system kill session (sid,serial#);从而杀掉session。

背景知识:

sid是唯一的,不会重复;假设登录了A用户,意图要kill user A的会话,结果输入了user B的sid,则在查找(sid,serial#)时,因为限制了username=A and sid=输入的sid,则会返回0条记录。从而限制了只能kill当前操作用户的session。

实施步骤:

1.sys用户先建立procedure

存储过程P_KILL_SESSION

CREATE OR REPLACE PROCEDURE P_KILL_SESSION(P_USER IN VARCHAR2,

                                           P_SID  IN VARCHAR2) AS

  V_SQL VARCHAR2(32767);

BEGIN

  SELECT 'ALTER SYSTEM KILL SESSION ''' || SID || ',' || SERIAL# || ''''

    INTO V_SQL

    FROM V$SESSION

   WHERE USERNAME = P_USER

     AND SID = P_SID;

  EXECUTE IMMEDIATE V_SQL;

EXCEPTION

  WHEN NO_DATA_FOUND THEN

    RAISE_APPLICATION_ERROR(-20001,

                            'SID: ' || P_SID ||

                            ' DOES NOT EXISTS, OR THE SESSION USER IS NOT ' ||

                            P_USER);

END;

存储过程P_KILL_USER_SESSION

CREATE OR REPLACE PROCEDURE P_KILL_USER_SESSION(P_SID IN NUMBER) AUTHID CURRENT_USER AS

  V_USERNAME VARCHAR2(30);

  V_SID      NUMBER;

BEGIN

  SELECT SYS_CONTEXT('USERENV', 'SESSION_USER'),

         SYS_CONTEXT('USERENV', 'SID')

    INTO V_USERNAME, V_SID

    FROM DUAL;

  IF P_SID != V_SID THEN

    P_KILL_SESSION(V_USERNAME, P_SID);

  ELSE

    RAISE_APPLICATION_ERROR(-20000, 'CAN NOT KILL CURRENT SESSION!');

  END IF;

END;

2.sys再grant执行存储过程的权限给用户

GRANT EXECUTE ON P_KILL_USER_SESSION TO  JF_ISU;

3.获得授权的用户根据会话的sid就可以杀自己的任何session了;

exec sys.p_kill_user_session(sid);

验证

在服务器srcbdc建立3个会话;2个JF_ISU用户sql1=(3012,751),sql2=(1070,469)1个system用户(其它用户)

会话1

04:14:22 192.168.210.65:1521/SRCBFIN@JF_ISU> set sqlp 'sql1>'

04:14:30 sql1>col sys_context('userenv','session_user') for a50;

04:14:46 sql1>col sys_context('userenv','sid') for a50;

04:14:46 sql1>select sys_context('userenv','session_user') ,sys_context('userenv','sid') from dual;

SYS_CONTEXT('USERENV','SESSION_USER')              SYS_CONTEXT('USERENV','SID')

-------------------------------------------------- --------------------------------------------------

JF_ISU                                             3012

会话2

04:14:52 192.168.210.65:1521/SRCBFIN@JF_ISU> set sqlp 'sql2>'

04:14:59 sql2>col sys_context('userenv','session_user') for a50;

04:15:01 sql2>col sys_context('userenv','sid') for a50;

04:15:01 sql2>select sys_context('userenv','session_user') ,sys_context('userenv','sid') from dual;

SYS_CONTEXT('USERENV','SESSION_USER')              SYS_CONTEXT('USERENV','SID')

-------------------------------------------------- --------------------------------------------------

JF_ISU                                             1070

会话3

04:15:05 192.168.210.65:1521/SRCBFIN@SYSTEM> set sqlp 'system3>';

04:15:23 system3>col sys_context('userenv','session_user') for a50;

04:15:30 system3>col sys_context('userenv','sid') for a50;

04:15:30 system3>select sys_context('userenv','session_user') ,sys_context('userenv','sid') from dual;

SYS_CONTEXT('USERENV','SESSION_USER')              SYS_CONTEXT('USERENV','SID')

-------------------------------------------------- --------------------------------------------------

SYSTEM                                             2525

04:15:30 system3>

04:15:32 system3>select sid,serial#,username,type,program,machine from v$session where machine like '%srcbdc%';

       SID    SERIAL# USERNAME                       TYPE       PROGRAM                                          MACHINE

---------- ---------- ------------------------------ ---------- ------------------------------------------------ --------

      1070        469 JF_ISU                         USER       sqlplus@srcbdc (TNS V1-V3)                       srcbdc

      2525        511 SYSTEM                         USER       sqlplus@srcbdc (TNS V1-V3)                       srcbdc

      3012        751 JF_ISU                         USER       sqlplus@srcbdc (TNS V1-V3)                       srcbdc

安全限制测试:

u JF_ISU不能kill其它用户的会话;(JF_ISU无法kill system用户的)

04:14:46 sql1>exec sys.p_kill_user_session(2525);

BEGIN sys.p_kill_user_session(2525); END;

*

ERROR at line 1:

ORA-20001: SID? 2525 DOES NOT EXISTS, OR THE SESSION USER IS NOT JF_ISU

ORA-06512: at "SYS.P_KILL_SESSION", line 12

ORA-06512: at "SYS.P_KILL_USER_SESSION", line 10

ORA-06512: at line 1

u JF_ISU不能kill当前session;

04:16:29 sql1>exec sys.p_kill_user_session(3012);

BEGIN sys.p_kill_user_session(3012); END;

*

ERROR at line 1:

ORA-20000: CAN NOT KILL CURRENT SESSION!

ORA-06512: at "SYS.P_KILL_USER_SESSION", line 12

ORA-06512: at line 1

u 未获得存储过程执行权限的用户不能调用该存储过程。

04:15:41 system3>exec sys.p_kill_user_session(3012);

BEGIN sys.p_kill_user_session(3012); END;

      *

ERROR at line 1:

ORA-06550: line 1, column 7:

PLS-00201: identifier 'SYS.P_KILL_USER_SESSION' must be declared

ORA-06550: line 1, column 7:

PL/SQL: Statement ignored

基本测试:

JF_ISU能kill除当前session之外的自己的所有会话(且该用户不具备alter system权限);

04:16:38 sql1>exec sys.p_kill_user_session(1070);

PL/SQL procedure successfully completed.

04:17:16 sql1>

04:17:18 sql1>select * from session_privs; (实际上只需要有create session并获得exec on procedure p_kill_user_session即可完成)

PRIVILEGE

----------------------------------------

CREATE SESSION

UNLIMITED TABLESPACE

CREATE TABLE

SELECT ANY TABLE

CREATE CLUSTER

CREATE SYNONYM

CREATE VIEW

CREATE SEQUENCE

SELECT ANY SEQUENCE

CREATE DATABASE LINK

CREATE PROCEDURE

CREATE TRIGGER

CREATE TYPE

CREATE OPERATOR

CREATE INDEXTYPE

SELECT ANY DICTIONARY

DEBUG CONNECT SESSION

DEBUG ANY PROCEDURE

18 rows selected.

04:17:44 sql1>

04:15:01 sql2>select sys_context('userenv','session_user') ,sys_context('userenv','sid') from dual;

select sys_context('userenv','session_user') ,sys_context('userenv','sid') from dual

*

ERROR at line 1:

ORA-00028: your session has been killed

附录:

查看当前session信息,要对视图v$session有select权限才能获得serial#,

col username for A10;

sql1>select sid,serial#,username from v$session where sid=(select sys_context('userenv','sid') from dual);

       SID    SERIAL# USERNAME

---------- ---------- ----------

      1457          3 JF_ISU

04:43:18 sql1>select * from user_role_privs;

USERNAME                       GRANTED_ROLE                   ADM DEF OS_

------------------------------ ------------------------------ --- --- ---

JF_ISU                         CONNECT                        NO  YES NO

JF_ISU                         RESOURCE                       NO  YES NO

04:43:24 sql1>

04:43:25 sql1>select * from role_sys_privs;

ROLE                           PRIVILEGE                                ADM

------------------------------ ---------------------------------------- ---

CONNECT                        CREATE SESSION                           NO

RESOURCE                       CREATE CLUSTER                           NO

RESOURCE                       CREATE SEQUENCE                          NO

RESOURCE                       CREATE TRIGGER                           NO

RESOURCE                       CREATE TABLE                             NO

RESOURCE                       CREATE PROCEDURE                         NO

RESOURCE                       CREATE TYPE                              NO

RESOURCE                       CREATE OPERATOR                          NO

RESOURCE                       CREATE INDEXTYPE                         NO

9 rows selected.

04:43:34 sql1>

04:43:35 sql1>select * from user_sys_privs;

USERNAME                       PRIVILEGE                                ADM

------------------------------ ---------------------------------------- ---

JF_ISU                         SELECT ANY DICTIONARY                    NO

JF_ISU                         CREATE SEQUENCE                          NO

JF_ISU                         DEBUG CONNECT SESSION                    NO

JF_ISU                         CREATE TYPE                              NO

JF_ISU                         CREATE VIEW                              NO

JF_ISU                         SELECT ANY TABLE                         NO

JF_ISU                         CREATE DATABASE LINK                     NO

JF_ISU                         CREATE TABLE                             NO

JF_ISU                         UNLIMITED TABLESPACE                     NO

JF_ISU                         CREATE TRIGGER                           NO

JF_ISU                         CREATE SYNONYM                           NO

JF_ISU                         DEBUG ANY PROCEDURE                      NO

JF_ISU                         SELECT ANY SEQUENCE                      NO

13 rows selected.

04:43:43 sql1>


    
 
 

您可能感兴趣的文章:

  • zf框架的session会话周期及次数限制使用示例
  • zf框架session会话周期与次数限制
  • 如何限制某用户只能访问(读、写、执行)某一个目录
  • 关于限制程序只能运行一次
  • 新建一个用户,然后用ssh登陆,我能否限制该用户只能访问默认目录,其他目录都没有权限进入?
  • SQL Server限制只能看到自已是owner的数据库
  • 用useradd添加一个SSH用户,如何限制该用户只能访问操作自已的目录?
  • 限制文本框中只能输入实数或整数,其它字符无效,有劳大家了!
  • 请问如何将com.inet.tds.TdsDriver的限制去掉?它好像只能接受3个连接。高分相送!
  • jquery限制文本框只能输入数字与小数点
  • jquery教程限制文本框只能输入数字和小数点示例分享
  • samba我想做3个目录,其中两个分别是不同的帐号和密码,第三个除只能是只读外无任何限制,
  • Linux 如何限制普通用户只能使用一部分SHELL
  • jQuery限制只能输入数字与失去焦点获取焦点
  • linux下能否限制某一用户只能运行某个(或某几个)特定的程序(如shutdown),我用的是rh9
  • jquery 限制文本框只能输入数字简单例子
  • PHP如何限制页面只能在微信自带浏览器访问?
  • jquery限制文本框只能输入数字
  • jquery怎么限制文本框只能输入数字?
  • jquery限制用户只能输入数字
  • LINUX下如何限制只能从本机或者内部网络地址访问这两个端口
  • PHP限制页面只能在微信自带浏览器访问的代码
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • ulimit -s设置堆栈是限制当前用户的? 还是限制当前shell的?
  • 如何修改一个新建用户登陆时的自动显示的字符串?以及如何限制这个用户可以执行的命令?
  • linux ftp用户组下的用户限制指定目录
  • 有关限制用户进程数的问题
  • 请问ubuntu10.4如何限制用户运行命令
  • SCO UNIX中如何telnet可以不受系统用户数目限制?
  • 如何限制linux服务器用户cpu和mem的使用率
  • 如何限制单个用户的存储文件大小?
  • 请问linux系统能不能限制用户的cpu使用上限
  • Linux上能创建限制使用磁盘空间的用户吗?
  • 请问在linux中如何限制用户的硬盘使用空间?
  • 如何限制SSH登录用户的目录跳转
  • freebsd下装的pureftpd,怎么开匿名用户?怎么限制它的ip地址?
  • 怎样配置apache服务器来限制用户个人主页空间大小!
  • 为何我的vsftpd就是无法限制ftp用户登录服务器?
  • 在vsftp中如何把ftp用户限制在用户主目录中?
  • 一个登录问题,tomcat4.0.3,当用户登录时如何限制用户输入用户名和密码的错误次数?
  • 急,限制用户登录的问题,请高手指教!
  • vsftp中如何限制用户上传某些类型的文件?如*.mp3,*.rm等等
  • 关于ftp限制用户目录的问题
  • 修改配置真正解决php文件上传大小限制问题(nginx+php)
  • 软限制和硬限制有什么区别?
  • 修改配置真正解决php文件上传大小限制问题(apache+php)
  • linux 子目录个数的限制及文件个数的限制
  • 如何给一个软件加上时间限制(30天),并通过注册取消时间限制?
  • 用SmartUpload类上传文件有大小限制吗??或者ENCTYPE='multipart/form-data'的form对于上传文件大小有限制??为什么大于1M的文件一上传就显示找不到页面啊!!
  • 打印当前资源限制,怎么我的资源都没限制值啊?
  • 调用系统函数有限制吗?
  • 请问UNIX有无文件最大数限制?
  • 下载的lINUX是有版本更新次数限制?
  • LINUX代理下如何限制邮件附件最大为1M ?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,