`

DBMS_SESSION.SET_CONTEXT的使用及无效权限问题的解决

阅读更多
ORA-01031: insufficient privileges
ORA-06512: at "SYS.DBMS_SESSION", line 90
ORA-06512: at "UNIFLOW.SET_MY_APP_CTX", line 5
ORA-06512: at line 1

应用程序环境

使用客户端标识符有它的优点,但也存在严重的安全威胁:这种设置假定用户将值设为真正的用户 id,但这一点无法得到保证。恶意攻击的用户可以连接然后将该值设为不同的用户 id,严重地破坏审计跟踪的真实性。在 web 应用程序中,使用 cookie 存储客户端标识符使得破坏更困难(如果不是不可能);但是在普通的应用程序中,仅仅使用客户端标识符,安全性可能不尽人意。我们需要一种更安全的方法来捕获审计跟踪中的应用程序用户。

进入解决方案:应用程序环境.应用程序环境类似于会话变量;一旦设置了,任何时候都可以在会话中访问它们。可以在另一个会话中设置一个不同的值,而在整个会话中都看不到这个值。环境具有的属性类似于表的列;但与表不同的是,环境不是片段对象,属性可以在运行时而不是设计时定义。

可以使用下列 SQL 创建应用程序环境:

create context my_app_ctx using set_my_app_ctx;

注意,子句 using set_my_app_ctx 意味着环境中的属性只能通过名为 set_my_app_ctx 的过程来操作,该过程定义如下:


create or replace procedure set_my_app_ctx
(
   p_app_user in varchar2 := USER
)
is
begin
   dbms_session.set_context('MY_APP_CTX','APP_USERID', p_app_user);
end;

此过程通过调用 dbms_session.set_context API,简单地将属性 APP_USERID 设置为输入参数传递的值。因此,如果用户直接调用此 API,其结果会如何呢?


SQL> exec dbms_session.set_context('MY_APP_CTX','APP_USERID', 'JUNE')
BEGIN dbms_session.set_context('MY_APP_CTX','APP_USERID', 'JUNE'); END;
*
ERROR at line 1:
ORA-01031: insufficient privileges
ORA-06512: at "SYS.DBMS_SESSION", line 78
ORA-06512: at line 1

注意错误 ORA-01031:insufficient privileges 有点令人误解。用户的确对 SYS.DBMS_SESSION 有执行权限,但是通过调用它来设置环境属性是违法的,因此出现了错误。但是,当用户调用受信任的过程来设置环境属性:

SQL> execute set_my_app_ctx ('AAAA')

PL/SQL procedure successfully completed.

设置成功了。因为环境属性只能通过它的过程(正确叫法是 受信任的过程)来设置。这是应用程序环境一个非常重要的属性,将在 FGA 中得到使用。

一旦设置了环境属性,可以通过调用函数 SYS_CONTEXT 来检索它。在上述代码中设置完环境后,可以通过下列语句来查看环境:
select sys_context('MY_APP_CTX','APP_USERID') from dual;

该语句返回属性值。如果可以通过安全的方式设置环境,则可以利用环境来设置客户端标识符。

基于我们现有的知识,以下是可能的解决方案:

应用程序执行过程代码,该代码自动地将应用程序环境设置为正确的值。在上述示例中,使用了用户 id 的环境属性,但另一个属性—如用户的角色—可能已经被使用了。可以在一个环境中定义多个属性。可以将属性作为启用的角色使用。受信任的过程可以包括各种类型的安全检查,从而使得它安全且真实可信。如果安全检查失败了,则不能设置所需的角色。因此,即使用户可以使用 APPUSER 帐号成功地登录,他也不能够操作数据,因为没有启用适当的角色。注意,角色必须经过过程认证,而不能是普通的角色。这种角色由命令 CREATE ROLE USING 创建;用户通过调用 而不是 SET ROLE 命令启用角色。


此过程也设置客户端标识符,因此没有必要授予公众对 dbms_session 的执行权限,即使对此用户也没有必要。由于用户没有权限调用 API,他们不能直接设置客户端标识符—客户端标识符将被自动设置,并且传递到细粒度的审计跟踪。
分享到:
评论

相关推荐

    如何收集Oracle进程中SQL跟踪信息

    5. 最后,当需要停止跟踪时,使用`ALTER SESSION SET EVENTS '10046 trace name context off';`关闭跟踪。 若无法修改源代码,可以使用DBMS系统包在其他会话中打开对特定会话的跟踪: 1. `sys.dbms_system.set_...

    ORACLE学习笔记之调节性能优化篇

    对于跟踪特定会话,可以使用`ALTER SESSION SET SQL_TRACE`或`DBMS_SESSION.SET_SQL_TRACE`过程。对于其他用户的会话,可以使用`DBMS_SYSTEM.SET_SQL_TRACE_IN_SESSION`来实现。跟踪信息会被保存在`USER_DUMP_DEST`...

    10046事件跟踪详细指南

    在Oracle数据库管理中,10046事件跟踪是一项重要的诊断工具,它允许管理员深入分析SQL语句的执行过程,从而定位并解决问题。本文将详细介绍如何启用和使用SQL_TRACE以及10046事件跟踪。 **SQL_TRACE的使用** SQL_...

    在Oracle中使用登录触发器初始化用户会话

    这个数据包负责查询必要的数据,并使用DBMS_SESSION.SET_CONTEXT过程将这些数据设置到应用程序上下文中。这样的设计带来了以下几点好处: 1. **性能增强**:应用程序上下文的数据存储在系统全局区(SGA)中,这意味...

    oracle sql 跟踪

    此外,还可以使用`ALTER SESSION`命令来开启跟踪,但这通常需要DBA权限: ```sql ALTER SESSION SET SQL_TRACE = TRUE; ``` 开启跟踪后,Oracle将在数据库的PGA(进程全局区域)或TRACE文件中记录SQL语句和绑定...

    oracle_v$session_v$session_wait用途详解

    DBMS_APPLICATION_INFO.SET_CLIENT_INFO(SYS_CONTEXT('USERENV', 'IP_ADDRESS')); END; ``` - 查询客户端的 IP 地址: ```sql SELECT client_info FROM v$session; ``` #### V$SESSION_WAIT 视图详解 `V$...

    oracle92学习笔记[归类].pdf

    - 使用 `event` 参数激活特定的跟踪事件,如 `alter session set event '10013 trace name context forever, level 1'`。 6. **数据库创建**: - DBCA (Database Configuration Assistant) 可以帮助创建数据库,...

    dba常用sql多年长期总结

    ALTER SESSION SET events '10046 trace name context forever, level n'; ``` #### 四、LogMiner(日志挖掘) LogMiner是Oracle提供的一种用于捕获数据库变更信息的工具。下面的步骤展示了如何使用LogMiner追踪...

    oracle开发学习笔记

    3. **指定用户跟踪**:通过`DBMS_SYSTEM.SET_EV`过程可以对特定用户(如'sid/serial/event/level/username'格式)开启或关闭跟踪,使用`tkprof`工具可以解析生成的跟踪文件,便于分析性能问题。 4. **计时工具**:`...

    Oracletrace

    本文将详细介绍Oracle中的追踪机制,包括追踪文件的位置、不同版本之间的差异,以及如何使用追踪功能来解决问题。 #### 二、追踪文件的位置 ##### 2.1 Oracle 10g追踪文件位置 在Oracle 10g版本中,追踪文件通常...

    sql面试题\oracle面试题目

    - 使用`ALTER SESSION SET EVENTS '10046 TRACE NAME CONTEXT FOREVER, LEVEL 12'`命令。 #### 49. IMPORT与SQL*LOADER的区别 - **IMPORT**:用于导入整个数据库或模式。 - **SQL*LOADER**:用于加载数据到现有的表...

    oracle诊断事件及深入解析10053事件

    ### Oracle诊断事件及深入解析10053事件 #### 一、Event的通常格式及分类 ##### 1、通常格式: ``` EVENT="<事件名称><动作><跟踪...通过合理使用这些事件,可以有效地监控和优化数据库性能,解决复杂的技术问题。

    oracle笔记二--plsql 编程.txt

    EXEC DBMS_SESSION.SET_SQL_TRACE(TRUE); ``` - **特定会话跟踪**:如果想要针对某个特定会话开启SQL跟踪,则需要使用以下命令: ```sql EXEC DBMS_SYSTEM.SET_SQL_TRACE_IN_SESSION(SID, SERIAL#, TRUE | ...

    ORACLE之FAQ -- 性能调整

    有时候,仅仅从数据库层面收集的信息可能不足以解决问题,还需要了解操作系统层面的信息。可以通过编写 shell 脚本来实现这一点。例如,下面是一个简单的脚本,用于根据进程 ID 获取当前用户的详细信息: ```bash #...

    深入解析10053事件

    ALTER SESSION SET EVENTS '10053 trace name context forever, level {1|2}'; ``` 关闭10053事件则执行: ```sql ALTER SESSION SET EVENTS '10053 trace name context off'; ``` 其中,`level`参数可选1或2,...

    Oracle9.2_SYS_CONTEXT函数的用法

    ### Oracle9.2_SYS_CONTEXT函数详解 在Oracle数据库系统中,`SYS_CONTEXT`函数...在Oracle9.2及后续版本中,熟练掌握`SYS_CONTEXT`函数的使用方法对于任何希望充分利用Oracle数据库强大功能的用户来说都是至关重要的。

    对于oracle对session进行跟踪的分析

    DBA(数据库管理员)通过跟踪 session 的活动,能够深入理解数据库的工作模式,找出潜在的性能瓶颈,并解决问题。Oracle 提供了多种工具和技术来实现这一目标,主要包括 SQL Trace、Event、DBMS_SYSTEM 包以及 ...

    XXXX1012-Oracle数据库诊断事件详解(如何获取所有内部事件号).docx

    3. 使用DBMS_SYSTEM.SET_EV存储过程在其他会话中设置,需要提供SID和SERIAL#,这些可以从V$SESSION视图获取。 4. 使用ORACLE DEBUG工具(ORADEBUG)在不同会话或进程中设置和禁用诊断事件。在不同版本的Oracle中,...

Global site tag (gtag.js) - Google Analytics