为什么不使用内置的MySQL用户和网站权限


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

我已经搜索了很多关于加密,存储密码,设计安全PHP脚本等主题。

似乎有几个共同的主题:

  • "不要尝试编写自己的加密脚本,使用现有的库(例如。PHPass)"。
  • "不要为每个用户创建MySQL数据库,创建一个大数据库并编写一个好的PHP脚本来管理您的用户,密码及其数据。

现在,是我,还是这两者似乎没有一点冲突?

让我们以这个例子为例。我想创建一个用户可以在其中创建帐户的网站。他们可以添加敏感信息(例如他们的家庭住址),然后他们可以在网站上查看或编辑这些信息。此敏感信息不应公开,也不应提供给网站的任何其他用户。它应该是"仅供用户使用"。

有一个管理员应该能够读取敏感信息(例如向每个客户发送一封信),但当然无法读取密码。如果认为有必要,可以在当地完成,即。不允许管理员通过互联网访问。

可以采取一切预防措施来使用最新版本、最佳实践等。该网站可以从专用机器上运行,该机器可以是物理安全的,并且不与任何其他任务共享。

那么,为什么不为网站的每个用户创建MySQL用户呢?当MySQL已经提供此功能时,为什么要滚动自己的PHP脚本来创建用户,然后将此信息存储在数据库中的表中?实际原因是什么?我们是否认为使用 PHPass(或替代方案)提供比 MySQL 内置的密码存储"更安全"的密码存储?

存储在MySQL数据库中是否被认为是"不安全的"。如果您对我的机器有本地访问权限,但没有我的 MySQL 数据库的管理员或根密码或其他用户/通行证组合,那么您仍然可以获取所有数据?

如果为网站的每个用户创建一个MySQL用户

被认为是"可以接受的",那么为什么不为每个用户创建一个新的数据库或表,并在MySQL中设置权限,以便每个用户只能访问他们的数据,而不能访问其他任何内容呢?当然,具有本地访问权限和root密码的管理员可以读取所有信息。

因此,似乎通过设计,MySQL中已经内置了创建用户和分配权限的功能,为什么要编写PHP脚本来做同样的事情呢?

//

/

一个后续问题。

如果要这样做,那么PHP脚本需要一个MySQL用户来创建新用户。这会让它的用户/通行证以明文形式存储,没有办法解决这个问题吗?

现在,理想情况下,此MySQL用户将无法读取/写入或对任何现有数据库执行任何操作,但能够创建新用户,创建新数据库/表并分配权限,以便此新用户。

这可能吗?

MySQL用户是为MySQL服务器本身的用户服务的。这些用户应仅供服务器管理员或需要用户运行的应用程序使用(为每个应用程序提供单独的用户)。MySQL用户管理系统是专门为适应对服务器上运行的数据库的受控访问而构建的,而不是作为Web应用程序中用户身份验证的基础。此外,任何数据库添加(和用户创建)都将要求您有一个用户运行对数据库具有这些权限的应用程序。虽然它本身不是一个直接的漏洞,但如果在你的PHP系统中发现一个,它可能会让你的生活变得更糟。

您永远不希望您的应用程序能够用其他数据库或(表)污染您的 MySQL 数据库命名空间。在应用程序运行期间,它应该只能使用最小特权原则创建、检索、更新和删除记录,这意味着您将授予数据库用户仅执行其所需操作的访问权限,而不能执行其他操作。

就密码哈希而言,通过 PHP 的 crypt() 函数使用 bcrypt。将其存储在用户表内的数据库中。

问题是MySQL访问控制不够细粒度:它只在数据库和表级别运行。如果您授予用户对表UPDATE权限,则他们可以更新该表中的任何行,包括包含有关应用程序其他用户信息的行。

您可以为每个用户提供自己的数据库,但这会使编写通用应用程序变得非常困难。如果站点管理员想要搜索用户,他们必须编写搜索数千个表的查询。 在这样的环境中编写加入是完全行不通的。

或者考虑用于在用户之间进行通信的应用程序。如果用户 A 想要向用户 B 发送消息,他们需要将某些内容写入用户 B 可以读取的表中。但是,如果每个用户只能访问自己的表,则没有这样的表。你要做什么,为每对用户创建一个数据库?那么多路通信,比如论坛系统呢?