(以下讨论以postgresql10版本为准)
有些人在设计应用的时候,为了图方便,将超级用户postgres或有超级权限的用户当做应用程序的连接用户,此举危害极大。因为Postgresql有几个只有超级用户才能执行的函数,不但可以摧毁数据库,甚至可以摧毁服务器的操作系统。
一、
大对象操作函数 lo_import、lo_export:
lo_import函数可读取操作系统的文件为一大对象,lo_export函数可将大对象写到操作系统的文件,假设你的服务器C盘有个文件odbc.ini。
点击(此处)折叠或打开
-
select lo_import('c:\odbc.ini') -- 返回OID,比如是123
-
select lo_put(123,0,'\x414243') -- 将大对象前3个字符改为ABC
-
select lo_export(123,'c:\odbc.ini') -- 你会发现odbc.ini前3个字母也被改为ABC
-
select lo_unlink(123) -- 删除大对象123
所幸的是lo_import、lo_export存取操作系统文件的权限依赖于服务器运行postgresq操作系统用户的权限,如果是系统管理员administator身份运行postgresql,那就可以修改服务器上的任何文件。所以postgresql在设计时是不允许系统管理员初始化和运行数据库的,然而在文件系统没有权限设置功能的操作系统如WIN7、XP等非服务器版的电脑上,
postgresql是可以以系统管理员身份运行的,所以在这些系统上运行postgresql是十分危险的事。
二、
文件存取函数 pg_ls_dir、pg_read_file、pg_read_binary_file:
虽然以上文件存取函数只限于pgdata集群目录,但pg_ls_dir函数可列出目录的内容,pg_read(_binary)_file函数可读取文件内容,很容易将数据库的整个集群从服务器上download下来,如果有SSL私密key也放在这pgdata目录(默认)下,也会被一览无余。
三、
状态采集函数 pg_stat_activity:
pg_stat_activity 可列出当前正在连接的进程状态,其中列query可显示上次执行语句,若有机密数据,也将被一览无余(非超级权限用户也可执行此函数,但此列是空的)
综上所述,请不要将超级权限用户分发到应用上,同时严格保密密码,也不要将postgresql装在非服务器版本的电脑上。
阅读(2991) | 评论(0) | 转发(0) |