mysql客户端
mysql客户端推荐文章1:安装MySQL
mysql客户端推荐文章2:云时代,最好用的MySQL客户端工具推荐
数据库图形客户端(GUI)工具,可以大大帮助开发者提升SQL编写与开发的效率。在云时代,企业越来越多的开始采用RDS,同时也还有部分本地IDC自建数据库,而在云端也会选择/尝试多个不同云厂商。“工欲善其事,必先利其器”,在这样的背景下,看看有哪些工具产品可供选择吧。
整体综述本文完整对比了12种MySQL图形客户端(GUI)工具,从产品体验、功能完整度、云适配、计费模式、OS兼容性等多个角度进行评估与分析,给出推荐。下面产品推荐与整体得分图,读者可根据自己的实际情况选择:
12种MySQL图形客户端评估对比(NineData)
接下来,我们一起看看所有这些工具的特点吧。
NineData官网地址:
NineData是一款非常有特色的数据库SQL开发产品,对MySQL常用功能支持非常完整,包括智能的SQL补全、SQL执行历史、结果集编辑、数据对比、结构对比、数据迁移与复制等。它采用SaaS架构模式,用户不仅可以免费使用,而且无需下载安装,上手比较简单。NineData产品更新迭代比较敏捷,对于开发者的新需求响应比较迅速。另外,该产品在多云适配上是其重要的强项,支持多种连接和访问云数据库的方式,对阿里云、腾讯云、华为云、AWS等都有比较好的支持。另外,也适配国内比较流行的PolarDB、GaussDB、TDSQL等数据库。
对于新用户NineData还会赠送两个示例数据库,供用户使用。另外,NineData还提供了企业级SQL开发能力,支持多用户管理、数据库访问权限控制、变更流程、SQL规范、SQL与操作审计等内容,可以较好的解决企业内多人协作访问数据库的问题。
NineData综合评价如下:
产品体验:★★★★
云适配度:★★★★
功能完整:★★★★
是否收费:免费
环境兼容:Windows / Linux / macOS
产品截图:
NineData 产品页面截图
Navicat官网地址:
Navicat是一款来自香港的产品,约2000年左右发布,是一个老牌的商业化、闭源数据库管理软件,支持主流的Windows、Mac OS X以及Linux,最近两年开始支持订阅模式,个人使用价格约35美元/月,企业版约69美元/月(参考),国内购买为273元/月,有一定的价格门槛,但其使用体验也还不错,功能也比较完整,包括比较强大的SQL补全、导入导出、结果集编辑、E-R模型、数据对比、结构对比、数据迁移等,但有部分功能仅企业版才具备。Navicat的代码块功能做得比较强,可以非常方便自定义一些自己常用的SQL模板。
Navicat综合评价如下:
产品体验:★★★★★
云适配度:★★★
功能完整:★★★★★
是否收费:商业收费
环境兼容:Windows / Linux / macOS
产品截图:
Navicat 产品页面截图
MySQL Workbench官网地址:
Workbench是最老牌的数据库管理工具了。最早由奥地利程序员Michael G. Zinner独立开发,之后Zinner于2003年加入了MySQL AB公司,并于2005年发布了最早的Workbench 5.0版本;2013年发布了,6.0版本;2018年,发布了8.0版本。整体上,该产品依旧随着MySQL的版本而持续更新,但是,更新节奏较慢,界面也非常“老”,并没有受到Oracle/MySQL的重视。
Workbench支持主流的Windows、Mac OS X以及Linux,并且开放源代码。但因为界面架构比较长时间没有更新,所以使用的交互体验一般。因为是MySQL官方工具,功能支持是比较完整的,包括SQL补全、SQL历史、导入导出、结果集编辑、E-R模型、数据对比、结构对比、数据迁移等功能都具备。另外,也提供商业化的企业版,支持部分MySQL企业版的功能。
MySQL Workbench综合评价如下:
产品体验:★★★
云适配度:★
功能完整:★★★★★
是否收费:免费
环境兼容:Windows / Linux / macOS
MySQL Workbench 产品页面截图
DBeaver官网地址:
DBeaver 是一个基于 Java 开发数据库管理工具,提供开源免费的版本。因为是基于Java的,所以也能够支持Windows、Linux、macOS 等操作系统,其支持的数据库类型也比较多。同时也是因为基于Java,其在访问的不同的数据库版本时,有时候需要在线做一些驱动更新,需要访问GitHub的一些资源,而因为一些原因,这类更新经常失败,使其使用体验有一定打折。DBeaver也提供了基础的SQL补全、导入导出、结果集编辑等功能,但也有部分功能仅限于企业版(Pro版本)才提供,另外,软件似乎因为比较大的缘故,所以运行起来有点慢。
DBeaver综合评价如下:
产品体验:★★★
云适配度:★★
功能完整:★★★★
是否收费:开源免费(功能限制)+ 商业收费(完整版)
环境兼容:Windows / Linux / macOS
DBeaver 产品页面
phpMyAdmin官网地址:
这是另一个老牌的开源免费MySQL访问工具了,在云时代之前,开发者经常需要自己搭建自己完整的开发环境(例如“LAMP”)时,该软件还比较流行。从名字可以看出来,这是一个PHP的Web-Based的MySQL访问工具,所以需要使用并不是很方便,需要构建自己的Web服务器和PHP运行环境。一般来说,现在的开发者也并不会这么去做。
另外,phpMyAdmin一直没有商业化,主要靠捐赠和赞助的方式在运转(参考,有意思的是Navicat也在赞助列表,而且是唯一的白金赞助商),整体上,phpMyAdmin其迭代速度非常慢,功能支持也很有限,但是如果是简单、基础的使用,是没有问题的。但,如果是日常开发使用,并不是很推荐。
phpMyAdmin综合评价如下:
产品体验:★★
云适配度:★
功能完整:★★★
是否收费:开源免费
环境兼容:Windows / Linux / macOS
产品截图:
phpMyAdmin 产品页面截图
dbForge官网地址:是devart的核心产品,最早主要是支持SQL Server数据库,最近几年也发布了对MySQL数据库的支持,也是一个商业化收费软件,产品可以下载试用一段时间。根据使用经验来看,体验还是非常不错的,功能也非常完整。但是,仅支持Windows版本,标准版费用为199美元/年,起步价也并不便宜。dbForge综合评价如下:产品体验:★★★★★云适配度:★★功能完整:★★★★★是否收费:商业收费环境兼容:Windows产品截图:dbForge 产品页面截图
SQLYOG官网地址:
SQLyog更多的是专注于数据库的管理,包括性能、监控、优化等方面,也提供基础SQL编辑功能,所以在早期,其在DBA群体中比较受欢迎,但是在整体的开发者中,使用比率并不高。虽然,提供开源的社区版本,但是当前,公司主要在推广其商业版本。
另外,在云时代对于监控与实例管理方面的诉求在降低,在SQL开发与云适配上需求更强。从这个角度来看,并不是很推荐这个这个产品。此外,该软件仅支持Windows系统。最近几年这个产品发展比较缓慢,而且SQL开发功能也不再是主推的功能,所以也并不是特别推荐。
SQLYOG综合评价如下:
产品体验:★★★
云适配度:★
功能完整:★★★
是否收费:开源免费(功能限制)+ 商业收费(完整版)
环境兼容:Windows
产品截图:
SQLYOG 产品页面截图
HeidiSQL官网地址:
HeidiSQL也是一个发展了很长时间的MySQL客户端,使用Delphi构建,所以整体上,有非常好的Windows使用体验。但是不能支持macOS或者Linux。因为发展时间比较长,功能也比较完整。
新增了部分对于云产品的适配,例如,如果类型选择的是AWS RDS,那么在kill连接的时候会使用特定的存储过程进行kill。
HeidiSQL综合评价如下:
产品体验:★★★★★
云适配度:★★★
功能完整:★★★★
是否收费:开源免费
环境兼容:Windows
产品截图:
HeidiSQL 产品页面截图
阿里云DMS官网地址:
因为阿里云在国内市占率非常高,所以,阿里云DMS也是一个使用比较广,但是也因为其为阿里云的产品,所以其作为MySQL管理工具并不是非常有名。DMS比较完整的支持MySQL日常SQL开发相关的工作,其功能矩阵也比较完整,可以完成日常的开发工作。
DMS对于阿里云数据库的适配自然是非常好,使用也比较便利。但,其对于其他云数据库(诸如腾讯、华为、AWS)的支持就比较有限,而且似乎也并不会在这方面做任何的投入。另外,DMS最近一年的产品大方向主要是在于"一站式的数据管理",所以新增了数据资产、数据开发任务编排等功能。不再是一个SQL开发工具。
阿里云DMS综合评价如下:
产品体验:★★★★
云适配度:★★
功能完整:★★★★★
是否收费:免费
环境兼容:Windows / Linux / macOS
产品截图:
阿里云DMS 产品页面
BeeKeeper Studio官网或下载地址:
Beekeeper目前是由一个由个人开发的MySQL GUI软件。界面简洁现代,支持比较基础的SQL开发功能,包括了SQL窗口、创建表等能力,同时有非常好的平台兼容性。向用户提供免费的功能有限的社区版,完整版是收费的,最低价格为19美元。
BeeKeeper Studio综合评价如下:
产品体验:★★★★
云适配度:★
功能完整:★★★
是否收费:开源免费(功能限制)+ 商业收费(完整版)
环境兼容:Windows / Linux / macOS
产品截图:
BeeKeeper Studio 产品页面
Toad Edge官网地址:
Toad Edge是Quest公司的产品之一。主要支持MySQL和PostgreSQL,当然Toad系列也有支持Oracle/Db2/SQL Server等商业数据库,但都需要下载独立的软件。另外,该软件一般是通过销售渠道去销售的,所以网上也看不到其价格。当前,支持Windows和macOS版本。其功能支持也比较完整,另外,在SQL提示功能上, 比较有特色,支持比较常见的SQL代码提示。
Toad Edge产品综合评价:
产品体验:★★★
云适配度:★
功能完整:★★★★
是否收费:商业收费
环境兼容:Windows / macOS
产品截图:
Toad Edge 产品页面
DbVisualizerDbVisualizer发展时间也比较长了,支持的数据库种类也非常多,底层是基于Java构建的,有不错的平台兼容性,支持Windows / Linux / macOS,在市场也获得不错认可。不过,该软件仅支持英语,并没有对应的中文支持。
DbVisualizer综合评价如下:
产品体验:★★★★
云适配度:★★
功能完整:★★★★★
是否收费:免费版(功能受限)+ 商业收费
环境兼容:Windows / Linux /macOS
产品截图:
DbVisualizer 产品页面
最后通过Wine等方式支持的OS平台,这里并没有考虑,因为根据经验来看,大多数情况下,稳定性都不太好。另外,市面上也还有一些产品超过两年未更新,这里就不再介绍了,例如MyDB Studio;也有部分软件平台属性太强,例如Sequel Pro仅支持Mac,这里也没有介绍。总体上,打分有较强的主观性,所以仅供参考。
mysql客户端推荐文章3:Mysql LOAD DATA 读取客户端任意文件
复现 Mysql LOAD DATA INFILE 读取客户端任意文件漏洞
前言MySQL 客户端和服务端通信过程中是通过对话的形式来实现的,客户端发送一个操作请求,然后服务端根据客户端发送的请求来响应客户端,在这个过程中客户端如果一个操作需要两步才能完成,那么当它发送完第一个请求过后并不会存储这个请求,而是直接丢弃,所以第二步就是根据服务端的响应来继续进行,这里服务端就可以欺骗客户端做一些事情。
但是一般的通信都是客户端发送一个 MySQL 语句然后服务器端根据这条语句查询后返回结果,也没什么可以利用的。但是 MySQL 有个语法 LOAD DATA INFILE 可以用来读取一个文件的内容并插入到表中。
从上图的官方文档说明可以看到,该命令既可以读取服务端的文件,也可以读取客户端的文件,这取决于 LOCAL modifier 是否给定。
读取服务端上的文件内容存入表中的 SQL 语句是:
load data infile "/etc/passwd" into table TestTable fields terminated by '分隔符';
读取客户端上的文件内容存入表中的 SQL 语句是:
load data local infile "/etc/passwd" into table TestTable fields terminated by '分隔符';
两相对比,读取客户端上的文件内容多了一个 local 关键字。
以上所描述的过程可以形象地用两个人的对话来表示:
1. 客户端:把我本地 /data/test.csv 的内容插入到 TestTable 表中去2. 服务端:请把你本地 /data/test.csv 的内容发送给我3. 客户端:好的,这是我本地 /data/test.cvs 的内容4. 服务端:成功/失败正常情况下这个流程没有问题,但是前文提到了客户端在第二次并不知道它自己前面发送了什么给服务器,所以客户端第二次要发送什么文件完全取决于服务端,如果这个服务端不正常,就有可能发生如下对话:
1. 客户端:请把我本地 /data/test.csv 的内容插入到 TestTable 表中去2. 服务器:请把你本地 /etc/passwd 的内容发送给我3. 客户端:好的,这是我本地 /etc/passwd 的内容4. 服务端:成功偷取文件内容这样服务端就非法拿到了 /etc/passwd 的文件内容!接下来开始进行这个实验,做一个恶意服务端来欺骗客户端。为了编写出伪造恶意 MySQL 服务器的 POC,必须对 MySQL 协议有足够的了解,所以接下来尝试分析一下 MySQL 协议的数据包。
MySQL 协议数据包分析为了非法读取客户端文件,我们需要实现一个假的 MySQL 服务器。那如何实现呢?这需要我们对 MySQL 协议展开详细的分析才能做到,好在借助 Wireshark 结合 MySQL 官方文档可以帮助我们轻松分析 MySQL 协议的数据包。
我以 ubuntu 虚拟机为客户端,windows物理机为服务端,借助 Wireshark 工具捕捉两者间的 mysql 通信数据包。
客户端ip:192.168.239.129
服务端ip:192.168.1.3
客户端和服务端之间交互的 MySQL命令如下
mysql -h 192.168.1.3 -P 3306 -u root -puse security;load data local infile "/etc/passwd" into table users;
开启物理机的 mysql,这里注意需要设置 mysql 允许外来连接,不知道如何操作看看这篇文章
设置 MySQL 允许外部访问
2.打开 wireshark,选择捕获 Vmware 相关的网卡并选择过滤 MySQL 协议,然后用虚拟机连接。
注意:不要使用 mysql 8.0.12 版本,否则相关的数据包显示不完整,甚至连接的用户名都显示不了,这个版本的加密可能更严格吧。
官方文档告诉我们 MySQL 协议也支持通过 TLS 进行加密和身份验证。MYSQL_TLS
那我们捕获的数据包是否进行了加密呢?稍加分析一下这些捕获的数据包就可以判断其确实使用了 TLS 进行了加密。接下来我们根据文档结合 Wireshark 捕获的数据包来进行实践论证!
连接过程数据包运行连接命令时捕获到的数据包
mysql -h 192.168.1.3 -P 3306 -u root -p
不打算全部都细说,就以前两个数据包为例子,和官方文档对照来学习其结构。
?第一个数据包 Protocol::HandshakeV10 服务端到客户端当客户端通过 MySQL 协议连接到 服务端会发生什么呢?官方文档 Protocol::Handshake 告诉我们当客户端连接到服务端时,服务端会发送一个初始的握手数据包(Initial Handshake Packet)给客户端。根据服务端的版本和配置选项,服务端会发送不同的初始数据包。
为了服务端可以支持新的协议,Initial Handshake Packet 初始的握手数据包的第一个字节被定义为协议的版本号。从 MySQL 3.21.0 版本开始,发送的是 Protocol::HandshakeV10
我采用的 MySQL 版本是 5.7.26,所以发送的就是 Protocol::HandShakeV10 ,我们可以看看文档是如何定义这个数据包的结构的:
关于 Type 字段各个值的含义在 Integer Types 和 String Types
int 就是 一个字节,string 表示以 00 字节结尾的字符串。
我们点开 Wireshark 中服务端给客户端发送的初始数据包,从 Server Greeting 字段开始就是 payload 部分,也就是初始的握手数据包。从图中我们可以看到有协议版本、服务端的 MySQL 版本、进程 ID。这和我们上图的文档是不是完美对应上了?
Protocol::HandShakeV10 只定义了一个数据包的 payload 部分,而关于头部的定义在 MySQL Packets
和实际的数据包的对应:
payload_length:
sequence_id:
payload:
值得注意的是 Wireshark 的数据是按照小端排列的,比如数据包长度 74 对应的字段数据是 4a 00 00。
其余的字段就不再分析了,大同小异。紧接着简单看看客户端给服务端的回应吧。官方文档告诉我们,如果客户端支持 SSL(Capabilities Flags & CLIENT_SSL is on and the mysql_ssl_mode of the client is not SSL_MODE_DISABLED) ,那么一个短的被称为 Protocol::SSLRequest: 的数据包会被发送,使得服务端建立一个 SSL layer 并等待来自客户端的下一个数据包。(这里你可能会感到混乱,前面不是说 TLS 吗,怎么现在变成了 SSL?其实 TLS 是升级版的 SSL,但是由于 SSL 这一术语更加常用,所以人们经常互换使用者两个术语。什么是 SSL、TLS、HTTPS)
如果不支持,那么客户端会返回 Protocol::HandshakeResponse: 。同时在任何时候,发生任何错误,客户端都会断开连接。
?第二个数据包 Protocol::HandshakeResponse41 客户端到服务端根据前面的分析,这里客户端如果支持 SSL,那么会发送 Protocol::SSLRequest 数据包,否则就是Protocol::HandshakeResponse:。根据我的验证,应该发送的是 Protocol::HandshakeResponse41
感觉挺奇怪的,我觉得应该发送 SSLRequest 才是,但是其包结构却又对应不上。
client_flag(4字节),包括了扩展的 Client capabilities
image-20230110154523933
max_packet_size(4字节)
0x01000000 = 16777216
character_set(1字节)
filler(23字节)
username(以 00 结尾的字符串)
auth_response
文档中说这是一个条件选项,当前的数据包是满足这个条件的。
根据文档对这个字段的释义,其是一个不透明的验证响应。没想到在实际数据包中是一个密码,经过了某个哈希算法。我没有去求证 MySQL 采用什么哈希算法,
接下来就不继续分析,大同小异。
这个数据包的重点在于能够表明客户端是否支持 LOAD DATA LOCAL,这是我们可以读取客户端本地文件的根本。关于这个字段的定义在:CLIENT_LOCAL_FILES
?第三个数据包 Ok_Packet 服务端到客户端这个数据包一看就是 Ok_Packet
?第四个数据包 COM_QUERY 客户端到服务端这个数据包是 COM_QUERY
?第五个数据包 Text Resultset 服务端到客户端这个数据包是 Text Resultset
选择 security 数据库捕获的数据包当客户端向服务端发送 use security 命令选择数据库时捕获到的数据包。特别多,下图并没有截完整。这一步不重要
读取客户端文件捕获的数据包在客户端上执行如下命令将 /etc/passwd 文件内容写入到 users 表时捕获到的数据包。
load data local infile "/etc/passwd" into table users;
一共就四个包,很明显第一个包是一个 COM_QUERY
这个图我不小心去读服务端的文件了,但是无伤大雅。数据包结构是一样的,而且下图我重抓啦~
糟糕的是第三个数据包由于我的物理机拒绝了访问而导致这个数据包是一个错误响应数据包。
我在这里找到了解决方案
stackoverflow
连接的时
本文标题:mysql客户端
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。