当前位置: 首页 > news >正文

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 <role_name>USING <procedure_name></procedure_name></role_name>创建;用户通过调用 <procedure_name></procedure_name>而不是 SET ROLE 命令启用角色。

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

相关文章:

  • numpy 中的 axis 怎么用
  • sql2005中一个xml聚合的例子
  • python 画图颜色不够用?
  • 上海IBM RSDC大会—中国企业开发者交流的平台
  • pandas 骚操作 —— 分组箱线图
  • SQL Server获取重复数据的方法
  • SQL2005 Anerlysis Service的处理维度中一个BUG的分析
  • 秩一矩阵的分解
  • 在线病毒软件查杀网站 virscan.org
  • Windows Workflow Activity 学习系列
  • 毕业离校事项
  • 网络攻击
  • 渲染Double Cusp
  • Python 凯撒密码
  • C++中的function object
  • #Java异常处理
  • 【108天】Java——《Head First Java》笔记(第1-4章)
  • 5、React组件事件详解
  • HTTP那些事
  • iOS 颜色设置看我就够了
  • Java新版本的开发已正式进入轨道,版本号18.3
  • Just for fun——迅速写完快速排序
  • Mysql数据库的条件查询语句
  • MySQL主从复制读写分离及奇怪的问题
  • NLPIR语义挖掘平台推动行业大数据应用服务
  • TCP拥塞控制
  • vagrant 添加本地 box 安装 laravel homestead
  • Vue2.0 实现互斥
  • 飞驰在Mesos的涡轮引擎上
  • 开源地图数据可视化库——mapnik
  • 那些年我们用过的显示性能指标
  • 前端js -- this指向总结。
  • 软件开发学习的5大技巧,你知道吗?
  • 我的zsh配置, 2019最新方案
  • 详解移动APP与web APP的区别
  • 项目实战-Api的解决方案
  • 优秀架构师必须掌握的架构思维
  • #免费 苹果M系芯片Macbook电脑MacOS使用Bash脚本写入(读写)NTFS硬盘教程
  • #图像处理
  • #我与Java虚拟机的故事#连载05:Java虚拟机的修炼之道
  • (1)SpringCloud 整合Python
  • (6)设计一个TimeMap
  • (html转换)StringEscapeUtils类的转义与反转义方法
  • (javascript)再说document.body.scrollTop的使用问题
  • (第二周)效能测试
  • (附源码)springboot工单管理系统 毕业设计 964158
  • (牛客腾讯思维编程题)编码编码分组打印下标(java 版本+ C版本)
  • (原創) 如何刪除Windows Live Writer留在本機的文章? (Web) (Windows Live Writer)
  • (终章)[图像识别]13.OpenCV案例 自定义训练集分类器物体检测
  • (总结)Linux下的暴力密码在线破解工具Hydra详解
  • (最完美)小米手机6X的Usb调试模式在哪里打开的流程
  • *(长期更新)软考网络工程师学习笔记——Section 22 无线局域网
  • .bat批处理(三):变量声明、设置、拼接、截取
  • .NET 中创建支持集合初始化器的类型
  • .Net8 Blazor 尝鲜