我们正在创建 PHP/MySQL Web 应用程序。
一侧:
我的 PHP 开发人员相信创建一个包含用户/密码/权限的表来授予或拒绝对最终应用程序某些部分的访问。
另一方面,我的数据库专家希望直接使用数据库来创建用户/密码/权限。
对于 DB 选项,我认为我们需要在 MySQL 前面创建一个单独的 Web 服务,才能正常工作?或者我是否允许用户直接访问数据库?
什么是最好的方法来做到这一点? 稳定的 php/mysql 应用程序(如 Dupral 或 Joomla)如何工作?
是的,这是一个关于设计最佳实践的问题,但我需要找出 PHP/MySQL 开发的最佳实践。 MySQL 应该管理 Web 用户,还是只管理一个数据库用户,其余的在应用程序级别。
最佳答案
采用 PHP 路线。
<小时/>无论您是通过 PHP 还是直接通过 MySQL 创建登录名,它们最终仍会存储在您的 MySQL 数据库中。但这两种方法之间存在一些差异。要点是,如果您采用 PHP 路线,您的用户将能够自己创建登录名(这意味着自己选择密码)。如果您采用数据库路线,您的用户将必须拥有分配给他们的密码。
<小时/>在 MySQL 中,可以使用诸如 SHA()
之类的东西来安全地对密码进行哈希处理(带盐),尽管据我所知,您无法选择更安全的MySQL 中的加密算法。 SHA-256/SHA-512 几乎肯定能满足您的需求,尽管您可能需要更安全的东西。
使用 PHP,您可以访问类似 password_hash()
的方法和 password_verify()
,它可以与 PASSWORD_BCRYPT
或 PASSWORD_ARGON2I
等算法一起使用(比标准 SHA-256 或 SHA-512 安全得多)。
最后,您必须考虑数据库泄露(每天大约有 30,000 起)时会发生什么。如前所述,无论哪种情况,加密的密码都会存储在数据库中。如果您通过 MySQL 创建登录,您可能还会暴露加密的方法(可能连同使用的任何盐)。如果您通过 PHP 构建登录信息,攻击者将需要对您的网站具有完整的 shell 访问权限,以便能够弄清楚您如何加密密码。
<小时/>最重要的是,绝不允许用户访问您的数据库。事实上,我建议确保您的主数据库用户角色仅具有 required privileges与数据交互(可能是SELECT
、INSERT
、UPDATE
)并使用具有CREATE
权限的单独用户创建用户。
关于PHP、MySQL 应用程序用户和凭据应该在应用程序或数据库上运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52156987/