Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >PLSQL Developer几个可能的隐患

PLSQL Developer几个可能的隐患

作者头像
bisal
发布于 2020-04-30 08:08:25
发布于 2020-04-30 08:08:25
2.2K00
代码可运行
举报
运行总次数:0
代码可运行

PL/SQL Developer是一个集成开发环境,由Allround Automations公司开发,专门面向Oracle数据库。作为一款第三方工具,早就被广大Oracle开发和运维人员所熟知。相比纯O系的SQL Developer,以及一些其他的第三方软件,在图形操作这块,确实更加友好。

PLSQL Developer,为开发人员提供了丰富的工具,封装了查看执行计划、美化SQL写法、设置日期格式等,很容易地通过点击操作完成,不用记住sqlplus中复杂的命令,

虽然工具方便了,但是屏蔽了细节,一旦不了解,进入盲区,就可能适得其反,产生其他影响。

在这我介绍几个和工具相关的隐患,既然是隐患,就可能碰到,可能不会碰到,但是你知道了这些问题,至少能做出一些提前的应对,或者出现问题时,能快速定位解决问题。

1. 语句自动提交

我们知道,常用的SQL语句,分为DDL和DML两种,DDL是数据定义语言(Data Definition Language),例如create、alter、drop操作,都是DDL语句,官方定义如下,

Data definition language (DDL) statements define, structurally change, and drop schema objects. For example, DDL statements enable you to: 1.Create, alter, and drop schema objects and other database structures, including the database itself and database users. Most DDL statements start with the keywords CREATE, ALTER, or DROP. 2.Delete all the data in schema objects without removing the structure of these objects (TRUNCATE). 3.Grant and revoke privileges and roles (GRANT, REVOKE). 4.Turn auditing options on and off (AUDIT, NOAUDIT). 5.Add a comment to the data dictionary (COMMENT).

DML是数据控制语言(Data Manipulation Language),例如insert、delete、update操作,都是DML语句,官方定义如下,

Data manipulation language (DML) statements query or manipulate data in existing schema objects. Whereas DDL statements enable you to change the structure of the database, DML statements enable you to query or change the contents. For example, ALTER TABLE changes the structure of a table, whereas INSERT adds one or more rows to the table. DML statements are the most frequently used SQL statements and enable you to: 1.Retrieve or fetch data from one or more tables or views (SELECT). 2.Add new rows of data into a table or view (INSERT) by specifying a list of column values or using a subquery to select and manipulate existing data. 3.Change column values in existing rows of a table or view (UPDATE). 4.Update or insert rows conditionally into a table or view (MERGE). 5.Remove rows from tables or views (DELETE). 6.View the execution plan for a SQL statement (EXPLAIN PLAN). See "How Oracle Database Processes DML". 7.Lock a table or view, temporarily limiting access by other users (LOCK TABLE).

两者最大区别,就在于提交(commit)操作。DML语句执行完成,需要手动执行commit,或者rollback,才可以结束当前事务,但是,DDL语句执行完成,都会自动执行隐式提交(implicit commit),在Oracle中,这个行为是不能改变的。

这个问题其实会产生一些困扰,假设我要执行如下操作,其中4的执行会进行一些逻辑判断,可能commit,可能rollback回滚1、2和4,针对rollback场景,执行结果不会和你想象的一样,因为1、2、4是DML操作,3是DDL操作,这些语句在同一个事务中执行,3的DDL会隐式提交,此时会将1和2的insert和delete连带提交,当4需要rollback时,只可以回滚4的操作,1和2已经提交,无法再执行回滚,

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1. insert into a values (...);
2. delete from a where ...
3. alter table a add ...;
4. update a set ... where ...;

其实这个问题,更多还是程序设计或者工具执行上的问题,你要保证程序中,或者在工具中执行的SQL顺序上,DML和DDL不要有交叉相互影响。

但是在PLSQL Developer中,是可以设置DML语句自动提交的,在"Tools-Preferences-SQL Windows",有个AutoCommit SQL,默认是空,如果勾选,则执行的DML,会自动提交,

我猜测之所以有这个功能,可能还是和工具定位有关,就像官网(https://www.allroundautomations.com/)上的广告所说,PLSQL Developer是“real solutions for oracle developers”,这个工具是为了提升Oracle开发人员的工作效率,不是提升Oracle数据库的保障机制,

例如开发人员在PLSQL Developer会话中增删改数据,但是忘了或者其他原因没做commit/rollback,再操作其他会话,会看到这个变更未生效,产生混淆。正是为了方便开发人员,PLSQL Developer支持了自动提交,执行这些DML的同时,自动commit,避免了开发人员忘记提交的可能。

但是从运维角度,AutoCommit这种操作是非常危险的。之所以DML语句需要显示提交,从原理层讲,DML会记录redo和undo信息,undo中存储的是修改数据的前镜像,当执行rollback时,可以利用undo数据进行恢复,当执行commit时,Oracle会标记undo,确认持久生效。另一方面,从影响上看,DML需要显示提交,让你有个缓冲,校验所做操作是否和你的预期相同,相当于check,结果正确,执行commit,结果错误,执行rollback。如果设置了AutoCommit,相当于直接提交,此时要回滚,就得手工执行该操作的逆向操作,并不是所有场景都可以很快执行的。

因此从开发角度,AutoCommit会提供些方便,但从运维角度,不建议打开AutoCommit,弊大于利。

2. 退出自动提交

PLSQL Developer另外一个很隐蔽,但确实在某些场景下相当“危险”的功能,就是正常退出时的事务状态,在"Tools-Preferences-Connection",有个Logoff with open transaction,默认是Commit,还支持Rollback、Ask,

他的意思是说,当你正常退出PLSQL Developer,如果窗口中,存在尚未提交的事务,Logoff with open transaction=Commit,PLSQL Developer就会帮你自动提交了,从开发者角度,确实提供了方便,我不用记住是不是执行commit,PLSQL Developer帮我做了。但是你想想,某些场景下,这个操作是不是很危险?例如PLSQL Developer连接生产库,你的窗口中,包含一条delete from xxx语句,然后你执行了select想看下这个会话删除的效果,但是因为什么其他的事情,中断了思路,等你回过头来,误认为回滚了,直接关闭软件,PLSQL Developer就会替你执行commit,持久化了delete的操作,此时你可能还未意识到这个。

因此,这个选项Logoff with open transaction强烈建议设置为Rollback,正常关闭软件,就让他自动回滚(其实这正是Oracle默认的行为,退出session,自动回滚),由执行者自行决定事务的提交/回滚状态,不是让工具代替你决定。至少应该设置为Ask,关闭软件时,如果窗口存在未提交事务,弹出窗口,由执行者选择,

3. 盗版带来的风险

关于Oracle比特币勒索的事情,已经出了很多了,最主要的原因就是用户下载了来源不明的数据库管理工具,指的就是PLSQL Developer。

黑客在PLSQL Developer的AfterConnect.sql文件中加入了勒索代码,然而此文件在官方的软件中为空文件,该勒索病毒就是利用了这个文件注入病毒代 码,在用户连接数据库后立即执行,并在告警日志出现自动任务执行错误,勒索你5个比特币,

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ORA-00604: error occurred at recursive SQL level 1
ORA-20315: 你的数据库已被SQL RUSH Team锁死  发送5个比特币到这个地址 166xk1FXMB2g8JxBVF5T4Aw1Z5aZ6vSE (大小写一致)  之后把你的Oracle SID邮寄地址 sqlrush@mail.com我们将让你知道如何解锁你的数据库
Hi buddy, your database was hacked by SQL RUSH Team, send 5 bitcoin to address 166xk1FXMB2g8JxBVF5T4Aw1Z5aZ6vSE (case sensitive),  after that send your Oracle SID to mail address sqlrush@mail.com, we will let you know how to unlock your database.
ORA-06512: at “XXX.DBMS_CORE_INTERNAL         ", line 27
ORA-06512: at line 2

在客户端,可能得到这种,

5个比特币,是多少钱?我不是很懂,于是乎,搜了一下,自行脑补,

其实这个问题,和Oracle本身没什么直接关系,就是因为使用了各种绿色版、破解版的盗版PLSQL Developer。

借助PLSQL Developer的AfterConnect.sql脚本,在Oracle中执行了一些特定的JOB、存储过程和触发器,实现勒索机制。而AfterConnect.sql脚本伪装成了login.sql,含有清晰的注释,

但是执行的内容,进行了加密,

可以借助unwrap解密,看到其核心代码,

大致的逻辑是,

1.判断数据库建库时间是否大于1200天。

2.隐藏了1200天,就会将sys.tab$的数据导入名为"ORACHK||SYS_GUID前10位"的表中。

3.删除sys.tab$,执行提交。

4.执行检查点事件,强制将脏块,写入数据文件。

5.$ORACLE_HOME/rdbms/admin/dbmsbkrs.sql定义了dbms_backup_restore,存储过程resetCfileSection负责清空控制文件指定记录,

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
PROCEDURE resetCfileSection(record_type  IN  binary_integer );
  -- This procedure attempts to reset the circular controlfile p.
  --
  -- Input parameters:
  --   record_type
  --     The circular record type whose controlfile p is to be reset.

通过v$controlfile_record_p视图,可以知道14号是备份的数据文件,做的很彻底,

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SQL> select rownum-1, type from v$controlfile_record_p;
  ROWNUM-1 TYPE
---------- ----------------------------
     0 DATABASE
     1 CKPT PROGRESS
     2 REDO THREAD
     3 REDO LOG
     4 DATAFILE
     5 FILENAME
     6 TABLESPACE
     7 TEMPORARY FILENAME
     8 RMAN CONFIGURATION
     9 LOG HISTORY
    10 OFFLINE RANGE
    11 ARCHIVED LOG
    12 BACKUP SET
    13 BACKUP PIECE
    14 BACKUP DATAFILE
    15 BACKUP REDOLOG
    16 DATAFILE COPY
    17 BACKUP CORRUPTION
    18 COPY CORRUPTION
    19 DELETED OBJECT
    20 PROXY COPY
    21 BACKUP SPFILE
    22 DATABASE INCARNATION
    23 FLASHBACK LOG
    24 RECOVERY DESTINATION
    25 INSTANCE SPACE RESERVATION
    26 REMOVABLE RECOVERY FILES
    27 RMAN STATUS
    28 THREAD INSTANCE NAME MAPPING
    29 MTTR
    30 DATAFILE HISTORY
    31 STANDBY DATABASE MATRIX
    32 GUARANTEED RESTORE POINT
    33 RESTORE POINT
    34 DATABASE BLOCK CORRUPTION
    35 ACM OPERATION
    36 FOREIGN ARCHIVED LOG

6.dbms_system.ksdwrt会向跟踪日志中写入勒索信息,

1 - Write to trace file. 2 - Write to alertlog. 3 - Write to both.

从以上的信息,至少说明黑客对Oracle还是比较懂的,所谓“流氓会武术”,但“还是能挡住”,最重要的一点,就是避免使用来历不明的软件,除此之外,我们还可以做的,包括不仅限于,

1.使用最小权限的原则,分配用户合适的账号权限,用多少给多少。

2.关注管理工具的登录脚本,存在异常,立即报警,

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SQL*Plus: glogin.sql / login.sql
TOAD : toad.ini
PLSQLdeveloper: login.sql / afterconnect.sql

3.开启一定的审计,数据库级的,应用级的,都可以起到一定的告警和监管作用。

4. 异常退出的影响(未确认)

记得很久以前看到某位大佬提到过,大概意思是PLSQL Developer在异常退出的情况下,如果窗口中存在未提交的事务,一般来讲,应该做的是回滚,但是,存在小概率事件会做事务的提交而不是回滚。

实在没找到出处,而且没实验支撑,所以算作未确认,倘若如此,真是很坑的。但归根结底,这个问题,还是对个人行为提出了要求,尤其是对生产系统的操作,通过PLSQL Developer这种工具,执行内容、顺序、时间,其实都是靠个人控制的,因此要对所操作内容谨慎、谨慎、再谨慎。做任何操作前,考虑下这个操作,究竟应该不应该,这就和开车是一样的,开的慢点,就可以避免一些不必要的风险。

To Be Continued ..

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
PLSQL Developer中控制结果集表格自动提交
PLSQL Developer可以说是个让人又爱又憎的工具,“爱”是他的确提供了操作Oracle数据库非常丰富、方便的功能,“憎”是他的一些隐藏配置很可能是个“坑”,就像《PLSQL Developer几个可能的隐患》介绍了几个场景。
bisal
2020/07/03
9330
【DB笔试面试448】Oracle中有哪几类触发器?
Oracle数据库有4种触发器,分别是DML、替代触发器(INSTEAD OF触发器)、DDL和系统触发器,一般的应用系统中都使用到DML、替代触发器,而DDL和系统触发器是DBA管理数据库用得比较多。下图是Oracle触发器的分类图:
AiDBA宝典
2019/09/30
2.1K0
【DB笔试面试448】Oracle中有哪几类触发器?
DDL、DML和DCL的区别与理解
它们是SELECT、UPDATE、INSERT、DELETE,就象它的名字一样,这4条命令是用来对数据库里的数据进行操作的语言 DDL(data definition language): DDL比DML要多,主要的命令有CREATE、ALTER、DROP等,DDL主要是用在定义或改变表 (TABLE)的结构,数据类型,表之间的链接和约束等初始化工作上,他们大多在建立表时使用 DCL(Data Control Language): 是数据库控制功能。是用来设置或更改数据库用户或角色权限的语句,包括 (grant,deny,revoke等)语句。在默认状态下,只有sysadmin,dbcreator,db_owner或db_securityadmin等人员才有权力执行DCL
终有救赎
2023/12/14
4510
DDL、DML和DCL的区别与理解
Oracle 回滚(ROLLBACK)和撤销(UNDO)
Oracle使用数据库中的回滚段来实现未提交数据或因系统故障导致实例崩溃时进行回滚操作
Leshami
2018/08/07
2.5K0
从SQL语言的分类谈COMMIT和ROLLBACK的用法
从功能上划分,SQL语言可以分为DDL,DML和DCL三大类。 1. DDL(Data Definition Language) 数据定义语言,用于定义和管理 SQL 数据库中的所有对象的语言 ; CREATE---创建表 ALTER---修改表 DROP---删除表 2. DML(Data Manipulation Language) 数据操纵语言,SQL中处理数据等操作统称为数据操纵语言 ; INSERT---数据的插入 DELETE---数据的删除 UPDATE---数据的修改 SELECT---数据的查询 DCL(Data Control Language) 数据控制语言,用来授予或回收访问数据库的某种特权,并控制数据库操纵事务发生的时间及效果,对数据库实行监视等; GRANT---授权。 ROLLBACK---回滚 COMMIT---提交。 提交数据有三种类型:显式提交、隐式提交及自动提交。下面分别说明这三种类型。 (1) 显式提交 用COMMIT命令直接完成的提交为显式提交。 (2) 隐式提交 用SQL命令间接完成的提交为隐式提交。这些命令是: ALTER,AUDIT,COMMENT,CONNECT,CREATE,DISCONNECT,DROP, EXIT,GRANT,NOAUDIT,QUIT,REVOKE,RENAME。 (3) 自动提交 若把AUTOCOMMIT设置为ON,则在插入、修改、删除语句执行后, 系统将自动进行提交,这就是自动提交。其格式为: SQL>SET AUTOCOMMIT ON; COMMIT / ROLLBACK这两个命令用的时候要小心。 COMMIT / ROLLBACK 都是用在执行 DML语句(INSERT / DELETE / UPDATE / SELECT )之后的。DML 语句,执行完之后,处理的数据,都会放在回滚段中(除了 SELECT 语句),等待用户进行提交(COMMIT)或者回滚 (ROLLBACK),当用户执行 COMMIT / ROLLBACK后,放在回滚段中的数据就会被删除。 (SELECT 语句执行后,数据都存在共享池。提供给其他人查询相同的数据时,直接在共享池中提取,不用再去数据库中提取,提高了数据查询的速度。) 所有的 DML 语句都是要显式提交的,也就是说要在执行完DML语句之后,执行 COMMIT 。而其他的诸如 DDL 语句的,都是隐式提交的。也就是说,在运行那些非 DML 语句后,数据库已经进行了隐式提交,例如 CREATE TABLE,在运行脚本后,表已经建好了,并不在需要你再进行显式提交。
matinal
2020/11/26
1.3K0
数据库事务理解
事物 本章讲述了三种常见的数据操作语句Insert /Update / Delete的基本语法,也提到了Oracle9i新的数据操作语句 – Merge的作用和用法,通过一些例子描述了这些DML语言的使用方法。另外,在本章也讲解了事物控制语句的基本概念和语句,对使用事务管理成组的数据操作进行了详细讲解。 一、什么是事务?事物概念 1、事务是由一串修改数据库的操作组成的。 Oracle中有三种事务: DML(数据操作)事务、DDL(数据定义)事务、DCL(权限控制)事务。 DML事务
程序源代码
2018/03/30
8930
SQL操作二
文章目录 1. Day02 1.1. 乱码问题 1.2. eclipse 下写sql 1.2.1. 配置 1.2.2. 自定义代码块 1.3. 约束 1.3.1. 主键(primary key) 1.3.2. 自增(auto_increment) 1.3.3. 非空(not null) 1.3.4. 注释 1.4. 事务 1.4.1. 关闭自动提交 1.4.2. 验证 1.4.3. 回滚(rollback) 1.4.4. 回滚点(savepoint) 1.4.5. 总结 1.5. SQL分类 1.5.1
爱撒谎的男孩
2019/12/31
6980
SYSAUX表空间管理及恢复
SYSAUX表空间是在10g之后引入的一个新的表空间,主要用于减轻对SYSTEM表空间的压力而作为SYSTEM表空间的辅助表空间。
Leshami
2018/08/07
9880
OTL技术应用
什么是OTL:OTL 是 Oracle, Odbc and DB2-CLI TemplateLibrary 的缩写,是一个操控关系数据库的C++模板库,它目前几乎支持所有的当前各种主流数据库,如下表所示: 数据库 访问接口 支持版本 Oracle OCI OCI7、OCI8、OCI8i、OCI9i、OCI10g DB2 CLI DB2 CLI MS SQL Server 、Sybase、Informix 、MySQL、 I
cloudskyme
2018/03/19
2.1K0
DQL、DML、DDL、DCL的概念与区别
SQL(Structure Query Language)语言是数据库的核心语言。
java干货
2021/02/19
6910
Oracle 表空间时点恢复(TSPITR)
表空间时点恢复,是Oracle在基于冷备,热备恢复以外的一种以表空间为粒度的,不完全恢复的形式来将表空间恢复到过去某个特定的时间点的一种恢复方式。它整合了RMAN以及DataPump这2个备份恢复工具来实现时点恢复。那它具体的过程和逻辑是怎样的?下文是其具体的描述。
Leshami
2018/08/13
1.7K0
Oracle 表空间时点恢复(TSPITR)
数据查询语言DQL,数据操纵语言DML,数据定义语言DDL,数据控制语言DCL。
SQL语言共分为四大类:数据查询语言DQL,数据操纵语言DML,数据定义语言DDL,数据控制语言DCL。 1. 数据查询语言DQL 数据查询语言DQL基本结构是由SELECT子句,FROM子句,WHERE 子句组成的查询块: SELECT <字段名表> FROM <表或视图名> WHERE <查询条件> 2 .数据操纵语言DML 数据操纵语言DML主要有三种形式: 1) 插入:INSERT 2) 更新:UPDATE 3) 删除:DELETE 3. 数据定义语言DDL 数据定义语言DDL用来创建数据库中
学到老
2018/03/16
9260
【史上最详解】Oracle数据库各种"锁" - 看完这篇就够了!
数据库是一个多用户使用的共享资源。当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性。
IT技术小咖
2019/06/26
19.4K0
【史上最详解】Oracle数据库各种"锁" - 看完这篇就够了!
一些SQL的基本概念和用法
2 如何改善关系型数据库的性能。(《MySQL必知必会》P227)备份数据库和清除垃圾数据。
用户10175992
2022/11/21
4860
【愚公系列】软考高级-架构设计师 061-SQL语言
SQL,全称为Structured Query Language(结构化查询语言),是一种专门用来管理和操作关系型数据库系统的语言。SQL的主要功能是执行对数据库的查询和更新操作,包括数据的插入、修改、删除以及查询。
愚公搬代码
2024/07/06
1740
oracle补充
索引是若干数据行的关键字的列表,查询数据时,通过索引中的关键字可以快速定位到要访问的记录所在的数据块,从而大大减少读取数据的I/O次数,因此可以显著的提高性能
HUC思梦
2020/09/03
3.2K0
oracle补充
SQL基础-->数据库事务(TRANSACTION)
数据库事务是指作为单个逻辑工作单元执行的一系列操作,可以认为事务就是一组不可分割的SQL语句
Leshami
2018/08/07
6490
OGG(11G)单实例-->单实例 搭建--同构同版本
查看目标端的SCN号,记录该SCN号(得到该SCN号之后,启动复制进程时,使⽤该SCN号)
Lucifer三思而后行
2021/08/17
7330
进阶数据库系列(十四):PostgreSQL 事务与并发控制
当多个事务并发执行时, 即使每个单独的事务都正确执行, 数据库的一致性也可能被破坏.。
民工哥
2023/08/22
2.1K0
进阶数据库系列(十四):PostgreSQL 事务与并发控制
只读表空间的备份与恢复
--====================== --  只读表空间的备份与恢复 --====================== 一、只读表空间的特性     使用只读表空间避免对静态数据的频繁备份     当使用alter tablespace tbs read only时,数据文件会执行检查点进程(将所有脏缓冲区的内容写至磁盘),         当前的SCN号会被标注,同时存储了SCN的数据文件头部被冻结.控制文件内也会记录该数据文件的冻结信息。     可以清除只读表空间的对象 二、只读表空间的备份     一般情况下,只读表空间只需要进行一次备份,即当表空间状态发生改变时应立即进行备份     可以使用OS系统cp命令来备份或RMAN进行备份只读表空间     使用RMAN时建议启用备份优化选项         RMAN> CONFIGURE BACKUP OPTIMIZATION ON;     只读表空间不支持热备     SQL> alter tablespace tbs1 begin backup;     alter tablespace tbs1 begin backup     *     ERROR at line 1:     ORA-01642: begin backup not needed for read only tablespace 'TBS1' 三、只读表空间的还原与恢复     还原与恢复只读表空间的问题在于控制文件如何控制只读表空间,分为下列三种情况:         ---------  ---------------  ----------------  -------------------------------------     case           backup 1     crash status                   recovery     ---------  ---------------  ----------------  -------------------------------------     case 1        Read-Only        Read-Only      将备份的只读表空间复制到目的地(Restore)     case 2        Read-Only        Read-Write     先Restore backup1,后recover(applied log )     case 3        Read-Write       Read-only       先Restore backup1,后recover(applied log )     只读表空间恢复时需要考虑的问题         重建一个控制文件时         重命名数据文件时         使用一个备份的控制文件时     下面对表空间tbs1置为只读后对比前后生成的重建控制文件的脚本       
Leshami
2018/08/07
6150
相关推荐
PLSQL Developer中控制结果集表格自动提交
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验