以非 root 用户身份使用 C# 连接到 MySQL 数据库?

Connect to MySQL database w/ C# as non-root user?

首先让我说我对数据库完全陌生,但一直在阅读他们提供的 MySQL 教程。

现在,我正在尝试制作一个允许非特权用户(非 root)通过 C# GUI 应用程序连接数据库并在数据库上执行一些命令的应用程序。用户将使用 windows 身份验证登录数据库。

现在,我能够制作一个快速的 GUI,其中 运行 程序可以使用 "root" 连接到本地主机上的数据库并获取其中的任何内容。

我的问题是,我究竟如何允许用户使用非 root 权限进行连接?我唯一能够找到的所有交易都是使用连接字符串 w/ "root" 作为用户。

编辑:数据库已经创建。我个人将无法以 root 用户身份连接到它并授予其他用户权限。

您可以使用 grant 语法,如 root 向其他用户授予权限。例如:

GRANT ALL PRIVILEGES ON mydatabase.* TO pfinferno

嗯,首先,你必须意识到这个 "root"(来自 MySQL)与 "root" 用户(来自你的计算机)不同。

当您登录 MySQL 数据库时(首先以 root 身份),您可以创建另一个具有最低权限的用户。 (创建用户:https://dev.mysql.com/doc/refman/5.1/en/create-user.html

之后,您可以给(授予)这个特定用户一些权限。 (授予权限:https://dev.mysql.com/doc/refman/5.1/en/grant.html) 例如,您可以允许某些用户只使用表中的 select 数据。另一个用户可以 insert/update。等等。

因此,在您的应用程序中,您可以指定另一个用户而不是 root,正如您通常看到的那样。

这里显示的 table 中的行也是一些重要的概念:

select user,host,password from mysql.user where user='pfinferno';

重要提示,用户可以有多个主机名或通配符。每个人都有自己的权利和密码。虽然上面的密码是散列的,但至少你可以快速观察它,看看是否所有密码都匹配(比如 root 有 3 个帐户)。

主机列由以下值填充,主要是:

样本A:

  • 本地主机
  • 127.0.0.1
  • %
  • 诸如md21.newyork.comcastbusiness.net之类的常用名称

%值为通配符。它是为了灵活性,但与 'root'@'%' 这样的用户一起使用时可能会非常危险。强烈建议仅在样本 A 中将根保留为前两个。此外,前两个在不同的工具中有很大不同。我推荐的是为前两个设置一个 root 用户行,并保持密码相同。这种方法有利也有弊。但请记住,当您无法连接时,其他东西依赖于连接,无论是代理、phpmyadmin、工具、my.conf 设置等。您将经常重新访问它。

在 Mureinik 给出的示例中,它向具有通配符 host = % 的用户授予权限。这意味着它依赖于这样创建的用户。请注意,通常以这种方式设置用户帐户。尽管没有什么限制您将其锁定得更紧。


当用户尝试连接到服务器时,他最终连接的用户可以解析为不同的 user/host 组合,在没有本地主机(主机)的情况下可以看出user 或 common-name,而是主机值为通配符 % 的名称。这可以通过以下查询看到:

样本 B:

select current_user(),user();

后者是连接尝试时出现的用户,前者是已解决且实际的用户。正如在这些论坛中看到的那样,其含义可能会导致人们在调试中浪费数天时间。有些人几天都联系不上,我是认真的

样本 C:

create user 'pfinferno'@'localhost' identified by 'thePassword';
create user 'pfinferno'@'127.0.0.1' identified by 'thePassword';
create user 'pfinferno' identified by 'thePassword';
create user 'pfinferno'@'md21.newyork.comcastbusiness.net' identified by 'thePassword';

-- 上面的注释 #3 与 'pfinferno'@'%'

相同

现在允许,主机名可以是普通用户的通配符,主机名可以是 localhost 和 127.0.0.1 仅适用于 root。但在尝试锁定安全性时,管理员通常会根据传入的主机名创建用户帐户(例如样本 C,第 4 行),并根据此通过授权来改变安全性。管理它可能有点让人不知所措。所以他们经常说去他的,我会创建通配符用户。 Susie 说,这对新用户来说可能没问题,但对于 Secimen C 第 4 行,如果那是你进来的人,你可以在第 3 行用户上获得你不会接受的资助。因此,解析您实际上是什么用户(参见样本 B),从最具体的主机名到回退到更一般的主机名,直到找到诸如通配符之类的主机名。

不幸的是,用户本身并没有使用指定的主机名进行连接,他们就是这样。他们试图联系。所以你不要说嘿我想成为这个东西@hostname,你就是你自己。您是 'pfinferno'@'md21.newyork.comcastbusiness.net',但可能会回退到通配符。

如果用户在样本 C 除了 通配符 % 中被丢弃,那么你最好拥有你期望的与他们一起获得的资助,因为你现在是新用户。

尝试限制在 grant 语句中使用通配符,不要像惰性方法那样执行 *.*,这只会授予对所有数据库和 table 的权限。在 Mureinik 的示例中,它适用于一个数据库中的所有 table。不是太寒酸。尝试微调权限,例如授予 SELECT 对 table 的权限或根本不授予不需要它们的用户。小心 WITH GRANT OPTION 在网上看到的剪切和粘贴。如果您使用它,您只是授予用户权限以授予其他用户权限。

SSH 隧道

您可能不想使用 Secimen A host = % 通配符(除了明显的 We are Risk Averse)的一个原因是

create user 'pfinferno'@'localhost' identified by 'thePassword';

非常适合 SSH 隧道。您将通过 PKI 的加密安全通道进行连接,并以@localhost 的身份展示自己。这大大减少了安全风险。


为什么我无法连接?

希望下面的图片和一些评论可以说明我为什么这样命名这个部分。

drop user 'pfinferno'@'localhost';
drop user 'pfinferno'@'127.0.0.1';
drop user 'pfinferno'@'%';
drop user 'pfinferno'@'md21.newyork.comcastbusiness.net';
flush privileges; -- some say this is not necessary, I have found otherwise

create user 'pfinferno'@'localhost' identified by 'thePassword';
create user 'pfinferno'@'127.0.0.1' identified by 'thePassword';
create user 'pfinferno' identified by 'thePassword';
create user 'pfinferno'@'md21.newyork.comcastbusiness.net' identified by 'thePassword';

...

select user,host,password from mysql.user where user='pfinferno';

grant all on so_gibberish.* to 'pfinferno'@'%'; -- grant all rights on so_gibberish db

flush privileges; -- some say this is not necessary, I have found otherwise

看看一些赠款。

show grants for 'pfinferno'@'localhost';    -- sandboxed. Can just log in and sit there
+-----------------------------------------------------------------------------------------+
| Grants for pfinferno@localhost                                                          |
+-----------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'pfinferno'@'localhost' IDENTIFIED BY PASSWORD '*74692AE70C53...' |
+-----------------------------------------------------------------------------------------+

show grants for 'pfinferno'@'127.0.0.1';    -- sandboxed. Can just log in and sit there
same as above

show grants for 'pfinferno'; -- wildcard % user, has all rights on so_gibberish;
+-----------------------------------------------------------------------------------------+
| Grants for pfinferno@%                                                                  |
+-----------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'pfinferno'@'%' IDENTIFIED BY PASSWORD '*74692AE70C53...'         |
| GRANT ALL PRIVILEGES ON `so_gibberish`.* TO 'pfinferno'@'%'                             |
+-----------------------------------------------------------------------------------------+

请注意,上面 GRANT USAGE 意味着您至少有权登录并坐下(沙盒)。但是通配符 % 用户也拥有 so_gibberish 数据库的全部权利。

现在我通过 mysql -u pfinferno -pthePassword

进入 mysql 提示符
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
+--------------------+

mysql> select current_user(),user();
+---------------------+---------------------+
| current_user()      | user()              |
+---------------------+---------------------+
| pfinferno@localhost | pfinferno@localhost |
+---------------------+---------------------+

尝试的用户 (user()) 已解析为同一用户 (current_user())。我被沙盒化了,基本上什么都做不了,除了 select now() 无聊死了。

mysql> use so_gibberish;
ERROR 1044 (42000): Access denied for user 'pfinferno'@'localhost' to database 'so_gibberish'

以该用户身份退出 mysql CLI。

现在

drop user 'pfinferno'@'localhost';
drop user 'pfinferno'@'127.0.0.1';
drop user 'pfinferno'@'md21.newyork.comcastbusiness.net';

我刚刚放弃了四分之三的 pfinferno 用户

通过mysql -u pfinferno -pthePassword

转到mysql提示
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| so_gibberish       |
+--------------------+

mysql> select current_user(),user();
+----------------+---------------------+
| current_user() | user()              |
+----------------+---------------------+
| pfinferno@%    | pfinferno@localhost |
+----------------+---------------------+

mysql> use so_gibberish;
Database changed

这表明@来自任何主机的 CLI(或任何程序),连接尝试首先由用户提供,然后解析为实际(参见 user() 和 [= 的输出34=],分别)。

所以,也许奇怪的是,当我删除用户时,EFFECTIVE RIGHTS 随着用户被解析为不同的用户而增加。这个可以调试hours/days/weeks的题目。用户可能不知道他们真正登录的身份(解析为),或者为什么他们不能,因为每个人,顺便说一句,可以有不同的密码!对于在 mysql.user 中有几行的用户 root 尤其如此……并且考虑到所有 mysql 用户中可能有 50% 最初是作为开发人员与之联系的。只是一个猜测。