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

标签 php mysql database permissions privileges

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

似乎有几个共同的主题:

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

现在,是我,还是这两者看起来有点冲突?

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

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

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

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

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

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

看来MySQL已经内置了创建用户和分配权限的功能,为什么要写一个PHP脚本来做同样的事情呢?

///

后续问题。

如果要这样做,则需要有一个 MySQL 用户供 PHP 脚本用于创建新用户。这将使它的用户/密码以明文形式存储,没有办法解决这个问题吗?

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

这可能吗?

最佳答案

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

您绝不希望您的应用程序能够用额外的数据库或(就此而言的表)污染您的 MySQL 数据库命名空间。在您的应用程序运行期间,它应该只能使用 Principle of least privilege 创建、检索、更新和删除记录。 ,这意味着您将授予您的数据库用户访问权限,使其只能执行所需的操作,仅此而已。

就密码散列而言,使用 bcrypt via PHP's crypt() function .将其存储在用户表中的数据库中。

关于php - 为什么不使用网站内置的 MySQL 用户和权限?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18935187/

相关文章:

php - 通过ajax php删除行

php - 在 Symfony (2.3) 中,路由注释中的等号和冒号有什么区别吗?

php - 找不到 Laravel API

mysql - SQL嵌套排序依据?

Java 连接池最佳实践?

php - 如何在php中显示mysql数据库的最高值

mysql - 尝试设置从 MySQL 返回的 bool 值时,Dapper 抛出无效的转换异常

php - 警告 : Illegal string offset : php

python - 如何验证 SQLAlchemy ORM 中的列数据类型?

sql - 如何检查是否存在使用表的 View