10

我对加密、存储密码、设计安全的 PHP 脚本等主题进行了相当多的搜索。

似乎有几个共同的主题:

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

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

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

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

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

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

MySQL 数据库中的存储是否被视为“不安全”。如果您对我的机器有本地访问权限,但没有管理员或 root 密码或其他用户/密码组合用于我的 MySQL 数据库,那么您仍然能够获取所有数据吗?

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

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

///

一个后续问题。

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

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

这可能吗?

4

2 回答 2

3

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

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

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

于 2013-09-21T17:29:43.167 回答
1

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

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

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

于 2013-09-21T17:29:27.410 回答