Java MySQL.users表作为应用程序身份验证

Java MySQL.users表作为应用程序身份验证,java,mysql,security,authentication,Java,Mysql,Security,Authentication,上面的链接很好地解释了我所处的困境 我有一个应用程序,用户通过提供用户名和密码来注册它。还有一些附加信息可以存储在一个单独的表中,供与用户名相关的所有用户使用。此外,我想将用户限制为只有一个表,其中使用GRANT存储特定于该用户的事件。要使用grant,需要一个MySQL用户帐户。接下来的问题是,MySQL用户同时也是应用程序用户有什么问题吗 我读过一些帖子,它们一直建议实现我自己的身份验证和访问系统,为什么要重新发明轮子?我在MySQL页面上没有遇到任何反对上述链接的建议 编辑 我用下面的语句

上面的链接很好地解释了我所处的困境

我有一个应用程序,用户通过提供用户名和密码来注册它。还有一些附加信息可以存储在一个单独的表中,供与用户名相关的所有用户使用。此外,我想将用户限制为只有一个表,其中使用GRANT存储特定于该用户的事件。要使用grant,需要一个MySQL用户帐户。接下来的问题是,MySQL用户同时也是应用程序用户有什么问题吗

我读过一些帖子,它们一直建议实现我自己的身份验证和访问系统,为什么要重新发明轮子?我在MySQL页面上没有遇到任何反对上述链接的建议

编辑

我用下面的语句创建了一个用户

CREATE USER 'test'@'localhost' IDENTIFIED BY 'testing';
其次是授予特权

GRANT CREATE USER ON *.* to 'test'@'localhost';
然后,我以该用户身份登录并执行以下命令:

    mysql> show grants;
+-----------------------------------------------------------------------------------------+
| Grants for tester@localhost                                                             |
+-----------------------------------------------------------------------------------------+
| GRANT CREATE USER ON *.* TO 'tester'@'localhost' IDENTIFIED BY PASSWORD '*AC57754462B6D4C373263062D60EDC6E452E574D' |
+-----------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| test               |
+--------------------+
2 rows in set (0.00 sec)

mysql> use mysql
ERROR 1044 (42000): Access denied for user 'tester'@'localhost' to database 'mysql'
我相信这里唯一的问题是DROP USER命令。有什么办法可以防止吗

mysql>删除用户“root”@“localhost”;
错误1396 HY000:root@'localhost'的删除用户操作失败部分原因是,您的应用程序不应管理MySQL用户

这是因为可以操纵您的应用程序的人可以操纵它来访问完整的数据库或使整个数据库不可用

应用程序应该以db作为应用程序进行身份验证,并且应用程序的db帐户(即MySQL用户)应该只被授予该应用程序所需的权限

一般来说,创建用户、销毁用户或授予任何或所有这些权限的能力对于应用程序来说都是不可取的,因为您的模型极易受到升级类型的攻击


我会重新考虑您的设计,例如,使用列来分隔用户数据,或者使用元结构(如键值对)。

在某种程度上,您的应用程序不应该管理MySQL用户

这是因为可以操纵您的应用程序的人可以操纵它来访问完整的数据库或使整个数据库不可用

应用程序应该以db作为应用程序进行身份验证,并且应用程序的db帐户(即MySQL用户)应该只被授予该应用程序所需的权限

一般来说,创建用户、销毁用户或授予任何或所有这些权限的能力对于应用程序来说都是不可取的,因为您的模型极易受到升级类型的攻击


我会重新考虑您的设计,例如,使用一列来分隔用户数据,或者使用一个元结构,如键值对。

我觉得不方便,因为mysql.users是MySAM,所以不支持事务我觉得不方便,因为mysql.users是MySAM,因此不支持事务处理是否不可能创建一个MySQL.user,应用程序只能使用它来创建、读取和删除其他MySQL.user并授予特权?当然,但如果应用程序受到攻击,应用程序在数据库上拥有这种级别的控制权是危险的,攻击者可以创建具有升级权限的其他用户,并做他们想做的任何事情。同意,我决定反对这种方法。当应用程序必须向新创建的用户授予必要的特权时,问题就出现了。GRANT自动将授予用户拥有的任何权限授予授予的用户。因此,所有用户都可以使用CRUD和CREATE/DROP USER访问整个数据库。不好,回答得太好了!我发现的第一个不仅重复了db用户的咒语!=app user,但实际上用一个令人信服的论点证明了这一点。难道不可能创建一个MySQL.user,应用程序只能使用它来创建、读取和删除其他MySQL.user并授予特权吗?当然,但如果你的应用程序被利用,那么你的应用程序在数据库上拥有这种级别的控制是危险的,攻击者可以创建具有升级权限的其他用户,并做他们想做的任何事情。同意,我决定反对这种方法。当应用程序必须向新创建的用户授予必要的特权时,问题就出现了。GRANT自动将授予用户拥有的任何权限授予授予的用户。因此,所有用户都可以使用CRUD和CREATE/DROP USER访问整个数据库。不好,回答得太好了!我发现的第一个不仅重复了db用户的咒语!=应用程序用户,但实际上用令人信服的论点证明了这一点。