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

首先让我说我对数据库是全新的,但是他们已经阅读了他们的MySQL教程。

现在,我试图创build一个允许非特权用户(非root)连接的应用程序,并通过C#GUI应用程序对数据库执行一些命令。 用户将使用Windows身份validationlogin到数据库。

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

我的问题是,我如何让用户连接w /非root权限? 唯一的事情,我已经能够find所有处理w /使用连接stringW /“根”作为用户。

编辑:数据库已经build立。 我不会以root用户的身份连接到它并授予其他用户权限。

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

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

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

主机列由以下值填充:

样本A:

  • 本地主机
  • 127.0.0.1
  • 常见的名字,如md21.newyork.comcastbusiness.net之类的

%值是通配符。 这是为了灵活性,但是当像“root”@“%”这样的用户使用时,它会非常危险。 只有样本A中的前两名才是最好的。 而且,前两者在不同的工具上是完全不同的。 我建议前两个有一个root用户行,并保持密码相同。 这种做法有利有弊。 但是请记住,当你不能连接其他东西时,依赖于连接,无论是代理,phpmyadmin,工具,my.conf设置等。你将会重新审视这个问题。

在Mureinik给出的例子中,通配符host = %赋予用户权限。 这意味着它是在这样创建的用户银行。 请注意,通常以这种方式设置用户帐户。 虽然没有什么限制你把它锁定更紧。


当用户尝试连接到服务器时,最终连接的用户可以解析为不同的用户/主机组合,如在没有本地主机(主机)用户或通用名称的情况下可以看到的那样而是一个具有通配符%的主机值。 这个查询可以看到:

样品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语句中使用通配符,而不是像懒惰的方法那样执行*.* ,这只会授予所有数据库和表的权限。 在Mureinik的例子中,它是针对一个数据库中的所有表格。 不是太寒酸。 尝试微调权限,例如授予对表的SELECT权限或根本不授权给不需要它们的用户。 如同在网上看到的那样用WITH GRANT OPTION小心地从它上面剪切和粘贴。 如果您使用它,您只授予用户权限授予其他用户权限。

SSH隧道

你可能不想使用Secimen的一个原因一个主机= %通配符(除了明显的我们是风险厌恶)是

 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 db的所有权限。

现在我通过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用户中的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()current_user()的输出)。

所以,也许奇怪的是,当我放弃用户时, EFFECTIVE RIGHTS随着用户被解决为不同的问题而增加。 这可能是小时/天/星期调试的主题。 用户可能不知道他们真正登录的是谁(解析为),或者为什么他们不能,因为每个人都可以拥有不同的密码! 对于在mysql.user中有几行的用户root尤其如此,并且考虑到大概有50%的mysql用户连接它,最初是作为开发者。 只是一个错误。

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

 GRANT ALL PRIVILEGES ON mydatabase.* TO pfinferno 

那么,首先,你必须认识到,这个“根”(来自MySQL)与“根”用户(从你的计算机)是不同的。

当您登录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 )例如,您可以允许某些用户只能从表中选择数据。 另一个用户可以插入/更新。 等等。

因此,在您的应用程序中,您可以指定另一个用户而不是root,如通常所见。