- 浏览: 1359994 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (453)
- Struts2 (4)
- Struts1 (16)
- Spring (9)
- Hibernate (5)
- AJAX (16)
- MS Server (9)
- Oracle (35)
- 测试技术 (5)
- 其他 (37)
- JSF (1)
- EJB (5)
- ASP.NET (9)
- iBATIS (5)
- Struts Spring Hibernate (2)
- HTML (12)
- Eclipse使用 (5)
- 设计模式 (5)
- JSP (32)
- 正则表达式 (2)
- 服务器 (12)
- Java基础 (48)
- MySQL (4)
- 面试 (22)
- UML (1)
- 数据结构 (3)
- Ant (2)
- 规范 (4)
- JavaScript (29)
- 软件使用及技巧 (25)
- PHP (1)
- DWR (3)
- FreeMarker (1)
- ExtJs (17)
- JFreeChart (9)
- Reports (2)
- JavaException (1)
- Java Mail (1)
- Flex (9)
- 异常 (12)
- Log4j (2)
- WebService (1)
- jQuery (1)
- Sybase (2)
- myeclipse_plugin (2)
- Linux (5)
- jbpm (2)
- SCM (1)
- mongoDB (1)
最新评论
-
lihua2008love:
<typeAlias alias="User& ...
IBATIS简单操作 -
lihua2008love:
...
关于项目框架设计的一点学习 -
c_jinglin:
我使用<OBJECT CLASSID="cls ...
这就是个静态页面通过js控制mscomm对某com设备进行访问的例子. -
zlbjava:
赞,用了还不错
java获取请求的ip地址,并解析ip所属地区 -
完美天龙:
cs842813290 写道楼主,我明白的地方:在链表已有N个 ...
JAVA实现双向链表
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,他们不能直接设置客户端标识符—客户端标识符将被自动设置,并且传递到细粒度的审计跟踪。
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,他们不能直接设置客户端标识符—客户端标识符将被自动设置,并且传递到细粒度的审计跟踪。
发表评论
-
exp和imp,oracle9i导出导入数据,数据库备份,创建用户,删除用户
2009-04-16 21:57 3647执行下面这句,是创建用户 create user testkk ... -
Oracle批量创建用户和导入导出的脚本
2008-12-26 10:36 2560-- 在cmd下执行 SELECT 'exp ' || ... -
sys用户使用@连接符提示无效权限的错误ORA-01031:
2008-12-26 10:30 2845问题:有同事反映,新安装的数据库使用 conn sys/ora ... -
Oracle创建主键时处理重复数据的程序
2008-12-26 10:29 2271/**************************** ... -
Oracle10g安装过程中"无法确定主机的IP地址时产生该异常错误" :解决办法
2008-08-23 08:40 45781. Oracle10g安装过程中出现“无 ... -
Oracle to_date用法
2008-06-26 15:29 3537Oracle to_date用法 日期格式参数 含义说明 D ... -
Java学习常用网站收集
2008-05-14 17:22 3309有网友说Java学习需要官方网站,想一下,发现有些框架的官方网 ... -
ORACLE数据库命名编码规范
2008-05-13 22:37 2263我在“管理”的论坛找到了答案,谁还有更多的,请指教!!! * ... -
ADO&ADO.NET 读取 Oracle 数据集
2008-05-13 22:22 2312使用 ADO.NET 访问 Oracle 9i 存储过程 ht ... -
通过批处理文件启动Oracle服务
2008-05-13 22:16 2187自己家里的机子配置不高,所有Oracle服务都是手动启动、关闭 ... -
Oracle常用及非常用函数
2008-05-12 17:11 5861感于总有些网友提出一 ... -
Oracle 9i的闪回查询概述
2008-05-11 23:59 2553Oracle 9i的闪回查询概述 ... -
使用分析单
2008-05-11 23:41 1105分析函数计算基于行组的值,并可以用来实现rownum伪列表述的 ... -
使用伪列Rownum
2008-05-11 23:31 1629对员工表进行排序,之后显示工资最多的前3名。 这么简单的问题想 ... -
oracle-merge用法详解
2008-05-11 22:28 2254Oracle9i引入了MERGE命令,你能够在一个SQL语句中 ... -
Oracle 数据字典(2)
2008-05-11 19:21 1535创建表的SQL语句如下-- 创建数据表create table ... -
Oracle 数据字典(1)
2008-05-11 19:14 1983Oracle数据库字典介绍 Oracle数据字典是有表和 ... -
AFTER DELETE Trigger
2008-05-11 07:33 3416An AFTER DELETE Trigger means t ... -
Oracle中常见数据类型转换
2008-05-11 07:28 1695To | From | CH ... -
PL/SQL学习笔记一
2008-05-11 07:22 17031、 PL/SQL的塊結構 Declare ...
相关推荐
5. 最后,当需要停止跟踪时,使用`ALTER SESSION SET EVENTS '10046 trace name context off';`关闭跟踪。 若无法修改源代码,可以使用DBMS系统包在其他会话中打开对特定会话的跟踪: 1. `sys.dbms_system.set_...
对于跟踪特定会话,可以使用`ALTER SESSION SET SQL_TRACE`或`DBMS_SESSION.SET_SQL_TRACE`过程。对于其他用户的会话,可以使用`DBMS_SYSTEM.SET_SQL_TRACE_IN_SESSION`来实现。跟踪信息会被保存在`USER_DUMP_DEST`...
在Oracle数据库管理中,10046事件跟踪是一项重要的诊断工具,它允许管理员深入分析SQL语句的执行过程,从而定位并解决问题。本文将详细介绍如何启用和使用SQL_TRACE以及10046事件跟踪。 **SQL_TRACE的使用** SQL_...
这个数据包负责查询必要的数据,并使用DBMS_SESSION.SET_CONTEXT过程将这些数据设置到应用程序上下文中。这样的设计带来了以下几点好处: 1. **性能增强**:应用程序上下文的数据存储在系统全局区(SGA)中,这意味...
此外,还可以使用`ALTER SESSION`命令来开启跟踪,但这通常需要DBA权限: ```sql ALTER SESSION SET SQL_TRACE = TRUE; ``` 开启跟踪后,Oracle将在数据库的PGA(进程全局区域)或TRACE文件中记录SQL语句和绑定...
DBMS_APPLICATION_INFO.SET_CLIENT_INFO(SYS_CONTEXT('USERENV', 'IP_ADDRESS')); END; ``` - 查询客户端的 IP 地址: ```sql SELECT client_info FROM v$session; ``` #### V$SESSION_WAIT 视图详解 `V$...
- 使用 `event` 参数激活特定的跟踪事件,如 `alter session set event '10013 trace name context forever, level 1'`。 6. **数据库创建**: - DBCA (Database Configuration Assistant) 可以帮助创建数据库,...
ALTER SESSION SET events '10046 trace name context forever, level n'; ``` #### 四、LogMiner(日志挖掘) LogMiner是Oracle提供的一种用于捕获数据库变更信息的工具。下面的步骤展示了如何使用LogMiner追踪...
3. **指定用户跟踪**:通过`DBMS_SYSTEM.SET_EV`过程可以对特定用户(如'sid/serial/event/level/username'格式)开启或关闭跟踪,使用`tkprof`工具可以解析生成的跟踪文件,便于分析性能问题。 4. **计时工具**:`...
本文将详细介绍Oracle中的追踪机制,包括追踪文件的位置、不同版本之间的差异,以及如何使用追踪功能来解决问题。 #### 二、追踪文件的位置 ##### 2.1 Oracle 10g追踪文件位置 在Oracle 10g版本中,追踪文件通常...
- 使用`ALTER SESSION SET EVENTS '10046 TRACE NAME CONTEXT FOREVER, LEVEL 12'`命令。 #### 49. IMPORT与SQL*LOADER的区别 - **IMPORT**:用于导入整个数据库或模式。 - **SQL*LOADER**:用于加载数据到现有的表...
### Oracle诊断事件及深入解析10053事件 #### 一、Event的通常格式及分类 ##### 1、通常格式: ``` EVENT="<事件名称><动作><跟踪...通过合理使用这些事件,可以有效地监控和优化数据库性能,解决复杂的技术问题。
EXEC DBMS_SESSION.SET_SQL_TRACE(TRUE); ``` - **特定会话跟踪**:如果想要针对某个特定会话开启SQL跟踪,则需要使用以下命令: ```sql EXEC DBMS_SYSTEM.SET_SQL_TRACE_IN_SESSION(SID, SERIAL#, TRUE | ...
有时候,仅仅从数据库层面收集的信息可能不足以解决问题,还需要了解操作系统层面的信息。可以通过编写 shell 脚本来实现这一点。例如,下面是一个简单的脚本,用于根据进程 ID 获取当前用户的详细信息: ```bash #...
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函数详解 在Oracle数据库系统中,`SYS_CONTEXT`函数...在Oracle9.2及后续版本中,熟练掌握`SYS_CONTEXT`函数的使用方法对于任何希望充分利用Oracle数据库强大功能的用户来说都是至关重要的。
DBA(数据库管理员)通过跟踪 session 的活动,能够深入理解数据库的工作模式,找出潜在的性能瓶颈,并解决问题。Oracle 提供了多种工具和技术来实现这一目标,主要包括 SQL Trace、Event、DBMS_SYSTEM 包以及 ...
3. 使用DBMS_SYSTEM.SET_EV存储过程在其他会话中设置,需要提供SID和SERIAL#,这些可以从V$SESSION视图获取。 4. 使用ORACLE DEBUG工具(ORADEBUG)在不同会话或进程中设置和禁用诊断事件。在不同版本的Oracle中,...