【问题标题】:Where and how to store MySQL passwords available to PHP在哪里以及如何存储 PHP 可用的 MySQL 密码
【发布时间】:2013-02-09 02:40:13
【问题描述】:

我正在使用带有单例 PDO 的 PHP 来访问数据库,它显然需要 MySQL 的用户名和密码。

众所周知,用户名和密码不应存储在公共目录中。

因此,我可以做类似require 'some_path/my_secrets.php'; 之类的事情,它设置了一堆变量,但是这些变量可能是全局定义的,这不是一个好主意(在使用单例时,不是全局的,但仍然是)。好的,我只能在某些函数中要求机密文件,但要记住的很多...

有没有更好的方法让 PHP 脚本可以使用私有数据?另外,我应该采取任何其他步骤吗?谢谢

【问题讨论】:

  • 只有一个全局变量,你可以有一个全局配置数组...
  • @DanielA.White。是的,我看到了那个和stackoverflow.com/questions/6322766/…,但是,他们提出了不同的问题。
  • @mb21。我在想它是否在初始文件中被调用,但猜你是对的。不过,您是否希望您的数据库密码之类的东西在一个可能会无意中将其打印在屏幕上的大程序中浮动?
  • 您可以看看 QuickCMS 或 QuickCart 是如何制作的。有一个全局的$config[] 数组。

标签: php security


【解决方案1】:

你的解决方案很好。

大多数建议的解决方案都被夸大了,尽管它们可能会提高安全级别,但不值得付出额外的努力。

因为安全不应只依赖于密码的保密性。充其量,即使密码被泄露,它的知识对于攻击者来说也毫无价值,因为他无法使用它。

这意味着,使用具有 principle of least privilege 之后权限的专用于您的应用程序的 MySQL 用户,并且只允许从该应用程序的 Web 服务器访问数据库(请参阅 MySQL Access Privilege System)。

【讨论】:

    【解决方案2】:

    首先,我想说,除非您的 PHP 应用程序需要它,否则请尽可能限制应用程序的数据库帐户的权限(例如:对适当表的读取权限,或者尽可能少的写入权限)。如果您的应用程序需要管理员权限来创建表等,那完全是“另一罐蠕虫”。

    其次,正如 ring0 建议的那样,不要以纯文本形式存储数据库密码。我建议使用散列 API 来存储密码的散列,例如:https://gist.github.com/nikic/3707231。当然,哈希可能最好存储在其他第三个位置(至少是一个单独的文件)。如果您的用户是值得信赖的,并且您可以找到一种方法,则可以根据用户的登录信息计算散列,但这可能需要在您的密码文件中为每个用户单独输入(因为每个散列的数据库密码都是不同)。

    从来没有万无一失的方法,我也不是安全专家,但我知道纯文本总是不利于存储密码,所以我认为这是朝着正确方向迈出的一步。

    【讨论】:

    • 关于在表级别限制权限的要点。关于你的第二点,我很确定这只适用于散列你的用户的个人密码,而不是根 MySQL 密码。
    • 我要说的是,将散列密码存储在单独的文件中可能比在代码或文件中存储纯文本密码更好,无论密码的用途如何。
    【解决方案3】:

    一开始我也遇到了同样的问题

    • DB 密码存储在includes 目录内的include 文件中(即防止偶然的PHP 代码直接从Web 文件中显示)

    然后出现了另一个想法,有点复杂但仍然很可行

    • 制作一个 C 程序,该程序拥有已编码的 DB 数据,并从 system 调用传递数据。源代码(包括编码密码)在安全的地方拥有。 C 代码必须执行一些检查以确保调用来自 PHP 等...

    但这相当昂贵 - C 速度很快,但通过 system 一直加载密码很昂贵。因此,将 APC 添加到游戏中会使整个事情变得更容易和更快

    • 在第一次请求期间,将 DB 数据加载到 APC 永久变量中 - 因此数据在内存中,更难从外部获取。该算法通常是

    算法

    Check if APC variables are set
    If yes use them
    If no load them from C program, only once
    

    APC documentation

    • 另一个想法,例如使用php-fpm 是在包含密码的 fpm 配置(只能由 root 读取)中设置一个环境变量

    最后,您还可以创建自己的 PHP 扩展,提供来自 C 代码的数据(扩展通常用 C 编写)。 This is some extension documentation

    这不是如何防止密码被盗的最终答案,但至少会让黑客更难确定密码 - 并且还需要更多的知识。

    【讨论】:

    • 谢谢 ringO。我需要考虑一下。但是,我不会 C,这会让我更难。
    • @user1032531 C 程序应该很简单。添加了基于 ENV 的解决方案。
    【解决方案4】:

    我知道的大多数系统都有一个 .htaccess 保护的包含文件。在里面定义一个配置数组并完成。这样做可能不是最安全的方式,但许多商店、CRM 和其他网络服务都这样做。

    【讨论】:

    • 由于信息位于公共目录之外,.htaccess 不适用。
    • 始终投入几行代码来保护通过 .htaccess 的秘密包含文件!否则一些愚蠢的配置错误可能会将文件暴露给公众。
    猜你喜欢
    • 1970-01-01
    • 2013-07-07
    • 2017-02-07
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 2011-08-02
    • 2012-03-22
    • 2020-02-06
    相关资源
    最近更新 更多