关于MySQL绕过授予information_schema中对象时报ERROR 1044(4200)错误的攻略如下:
1. 问题概述
当我们授权一个用户访问MySQL数据库中的information_schema时,有时候会遇到错误提示:
ERROR 1044 (42000): Access denied for user 'user_name'@'%' to database 'information_schema'
这是因为MySQL使用了特殊的代码路径来处理这些系统表,从安全角度考虑,拒绝用户访问information_schema中的数据和对象,以限制可能的攻击和数据泄露。
但是,在某些情况下,我们确实需要允许用户访问information_schema中的数据和对象。本文将讨论如何绕过该问题的方法。
2. 解决方案
我们可以使用以下三种方法来避免ERROR 1044(4200)错误:
方法一:使用授予权限
我们可以使用以下语句授权用户访问information_schema中的数据和对象:
GRANT SELECT ON information_schema.* TO 'user_name'@'%';
这个语句将授予'user_name'@'%'用户在information_schema数据库中选择任何表的权限。
方法二:更改MySQL源代码
MySQL默认不允许我们访问information_schema中的任何表,这是因为源代码中定义了一个函数security_ctx_check(),该函数会检查用户的权限,如果没有访问表的权限则返回错误代码。我们可以更改源代码,并重新构建MySQL以绕过此限制。
以下是如何更改MySQL代码的步骤:
-
下载MySQL的源代码
wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.36.tar.gz
-
解压缩源代码包
tar -zxvf mysql-5.7.36.tar.gz
-
更改源文件中的security_ctx.cc文件
cd mysql-5.7.36/sql
vi security_ctx.cc
找到以下代码片段:
if (arg_db == system_schema || arg_db == mysql_schema ||
arg_db == performance_schema_schema || arg_db == information_schema_schema)
return1;
}
DBUG_RETURN(0);
并更改为:
if (arg_db == system_schema || arg_db == mysql_schema ||
arg_db == performance_schema_schema) return1;
DBUG_RETURN(0);
这里我们将if语句中的arg_db == information_schema_schema删除,并重新排版代码。
- 重新构建MySQL
cmake .
make
make install
重新构建MySQL可能需要一些时间,但是这个方法可以完全绕过对information_schema的限制。
方法三:使用MySQL中的FEDERATED引擎
MySQL中的FEDERATED引擎可以将数据源的表“联合”到当前MySQL服务器中。通过使用FEDERATED引擎,我们可以实现绕过授权和安全问题的目的。以下是使用FEDERATED引擎的步骤:
- 首先需要检查MySQL服务器是否已经开启FEDERATED引擎,可以输入以下SQL语句:
mysql
SHOW ENGINES;
如果FEDERATED引擎已经在列表中,那么可以跳过第2步。
- 开启FEDERATED引擎
在启动MySQL服务器时,需要使用--federated选项开启FEDERATED引擎。如果MySQL服务器已经按照二进制安装包安装,那么可以在my.cnf文件中添加如下选项:
[mysqld]
federated=1
- 创建一个FEDERATED表
假设本地MySQL服务器的IP地址为192.168.1.1,端口号为3306,用户名为user_name,密码为password,那么我们可以通过以下SQL语句来创建一个FEDERATED表:
mysql
CREATE TABLE federated_table (
id INT(11) NOT NULL AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
PRIMARY KEY (id)
) ENGINE=FEDERATED CONNECTION='mysql://user_name:password@192.168.1.1:3306/your_database/Table_name';
在这个例子中,我们在本地MySQL服务器上创建一个名为federated_table的表,并将它连接到位于远程MySQL服务器上的your_database数据库中的Table_name表。
注意,我们需要使用“mysql://”URL格式来定义远程MySQL服务器的连接信息,然后在后面跟着用户名、密码、IP地址、端口和数据库和表名。
以上是三种方法中的小部分示例,可以根据具体情况选择不同的方法。绕过授权和安全限制是有风险的,请在使用前评估风险。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:关于MySQL绕过授予information_schema中对象时报ERROR 1044(4200)错误 - Python技术站