【问题标题】:MySQL.users table as application authenticationMySQL.users 表作为应用程序认证
【发布时间】:2014-06-03 21:48:36
【问题描述】:

Why not use the built-in MySQL users and permissions for a website?

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

我有一个应用程序,用户通过提供用户名和密码来注册它。还有一些附加信息可以存储在与用户名相关的单独表(所有用户一个)中。此外,我想将用户限制为仅使用 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> DROP USER 'root'@'localhost'; ERROR 1396 (HY000): 'root'@'localhost' 的操作 DROP USER 失败

【问题讨论】:

  • 我觉得不方便,因为mysql.users是MySAM,所以不支持事务

标签: java mysql security authentication


【解决方案1】:

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

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

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

一般来说,应用程序不建议拥有创建用户、销毁用户或授予权限(任何或所有这些)的能力,因为您的模型很容易受到升级类型的攻击。

我会重新考虑您的设计,并用于例如用于分隔用户数据的列或键值对等元结构。

【讨论】:

  • 难道不能创建一个 MySQL.user 应用程序只能用来创建、读取和删除其他 MySQL.users 并授予权限吗?
  • 当然可以,但是如果您的应用程序被利用,攻击者可以创建具有升级权限的其他用户并为所欲为。
  • 同意,我决定反对这种方法。当应用程序必须向新创建的用户授予必要的权限时,就会出现问题。 GRANT 自动授予授予用户对已授予用户的任何权限。因此,所有用户都可以使用 CRUD 和 CREATE/DROP USER 访问整个数据库。不好。
  • 绝妙的答案!我发现第一个不仅重复了口头禅“db user!= app user”,而且实际上用令人信服的论据证明了它的合理性。
猜你喜欢
  • 2012-05-30
  • 1970-01-01
  • 2013-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-01
相关资源
最近更新 更多