【问题标题】:mysqli connection db user and password settingsmysqli连接db用户和密码设置
【发布时间】:2018-05-08 20:34:39
【问题描述】:

我试图弄清楚是否有一种方法可以制作一个密码恢复系统,该系统实际上隐藏了带有所有 mysqli db 用户名和密码的“connection.php”。这可能吗?

我发现的大多数教程都显示了“connection.php”文件以建立与数据库的连接,并且可以从源代码中查看它,从而使数据库登录信息可见。有人可以帮我解决这个问题或为我指出正确的方向吗?

示例:

 <?php
 $connection = mysqli_connect('localhost', 'root', 'Rvm@i[9)0?~=');
 if (!$connection){
die("Database Connection Failed" . mysqli_error($connection));
}
 $select_db = mysqli_select_db($connection, 'pixelw3p_demo');
 if (!$select_db){
die("Database Selection Failed" . mysqli_error($connection));
 }
  ?>

这是在connection.php文件中,需要添加为

  require_once('connection.php');

现在可以在源代码中看到这个 php 文件,然后您就知道要查找哪个 php 文件来获取数据库信息。有什么办法可以隐藏所有这些,这样我的数据库就不会受到攻击?

【问题讨论】:

  • 您是否真的尝试查看源代码?
  • 注意:mysqli 的面向对象接口明显不那么冗长,使代码更易于阅读和审核,并且不容易与过时的mysql_query 接口混淆。在您对程序风格投入过多之前,值得转换一下。示例:$db = new mysqli(…)$db-&gt;prepare("…") 过程接口是 PHP 4 时代引入的 mysqli API 的产物,不应在新代码中使用。
  • 好吧,我觉得自己像个白痴……如果你愿意,你可以删除它。
  • 只要你在学习,问一些看起来很尴尬的问题并没有错。别担心。最好问而不是糊涂而不知道更好。

标签: php mysql mysqli


【解决方案1】:

直截了当地说:在 PHP 文件中包含凭据绝对没有错。每个人都在谈论的是“永远不要将密码、API 密钥或其他敏感信息”存储在 版本控制(例如 git)中包含的文件中。

PHP 文件本身并不比 ENV、INI、JSON、XML、YAML 或其他任何东西差。实际上,PHP 文件甚至更好,因为它不需要严格放在文档根目录之上。而且,使用 PHP 进行配置可以更好地与您的应用程序集成。

真正必不可少的是,将所有应用程序设置放在一个单独的文件中,并从版本控制中删除,所以它永远不会进入存储库或其他服务器。

鉴于以上所有,使您的配置文件与源代码分开:

  • .gitignore 中添加config.php 行(如果您使用的是git)

  • 创建一个名为 config.sample.php 的文件,并将所有变量设置为像这样的空值

      return [
          'db' => [
              'host' => '127.0.0.1',
              'username' => '',
              'password' => '',
              'dbname' => '',
              'port' => 3306,
          ],
      ];
    
  • 添加到版本控制

  • 在您的应用程序引导文件中有这样的代码

      if (!file_exists('config.php'))
      {
          throw new \Exception('Create config.php based on config.sample.php');
      }
      $config = require 'config.php';
    
      mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
      $mysqli = new mysqli(...$config['db']);
      $mysqli->set_charset('utf8mb4');
    
  • 然后,按照建议,在您的应用程序运行的每台服务器上创建 config.php,每个服务器都有自己的一组值

您必须了解,此例程对于任何文件格式是强制性的,config.ini 已包含在内。 此例程使您的密码安全且可移植,而不是您选择的文件格式。

【讨论】:

    【解决方案2】:

    坦率地说,您发现的大多数教程可能都是绝对垃圾,而且他们告诉您的所有内容都是错误的。他们中很少有人真正解决严重的安全问题,而那些通常要么掩盖它,要么没有通过推广最佳实践来解决问题。

    这并不难,但要做到正确可能会很棘手。你需要记住很多事情。

    切勿在您的源代码中存储密码、API 密钥或其他敏感信息。使用配置文件,尤其是 INI、JSON 甚至 XML 格式的简单配置文件。 PHP 具有快速轻松地读取所有这些内容的功能。

    切勿将配置文件存储在您的公共“Web 根目录”内的某个位置,该位置可以被修改 URL 以探测此类文件的人访问。即使您的 Web 服务器配置中有规则来阻止这些请求,这些规则也可能被意外禁用,当您将应用程序重新部署到未正确配置的新服务器时,通常会出现这个问题。

    切勿将您的生产配置文件检查到版本控制中。这就是您将 API 密钥和密码泄露给攻击者的方式。例如,不小心将 Amazon AWS 密钥推送到公共 GitHub 存储库时,通常会被使用该密钥启动数百个昂贵实例的人迅速惩罚。存储库是否为私有无关紧要:这些存储库可以被他人克隆并在您不知情的情况下公开。

    始终尽您所能,尽量减少存储关键密码、API 密钥和其他凭据的位置。使用像 1Password 这样的安全存储系统作为“保险库”,其中的内容被正确彻底地加密,而不是像 Google Doc 这样可能会被泄露的东西。

    总是烧毁存储在服务器上的所有密码、API 密钥和其他凭据,以防万一。如果您不知道他们有多少访问权限或访问时间有多长,请重新发出新密码,生成新的 API 密钥,并绝对确定旧凭据不再有效。不要以为你有时间解决这个问题。你可能不会。当您意识到自己遇到问题时,立即永久解决问题。

    这里最简单的答案是制作一个包含此信息的config.ini 文件,该文件保存在 Web 根目录之外并保存在服务器上。不要下载它。不要复制它。除非你需要,否则不要碰它。这有助于避免代价高昂、令人痛苦的错误。

    【讨论】:

    • 所以我对 config.ini 进行了一些研究,但仍然没有找到关于我将如何链接它或读取它的信息,如果它在公用文件夹之外并且只保存在服务器上。我是否将其位置放在 php.ini 中,甚至将 ini 放在 php 文件夹中,说明 php.ini 的位置?如果我记得正确阅读它是一个 parse_ini_file() 以读取所述 ini。只是不确定如何链接它或将其放置在哪里方便。谢谢
    • 你可能想看看像Laravel 这样的包是如何组织应用程序的,因为这类框架通常有一个很好的模型可供使用。他们还有关于如何正确配置应用程序的 Web 根目录的文档。修改php.ini 应该是不必要的,这通常是关于虚拟主机配置的Apache httpd 或Nginx 类型的问题。
    • 开始使用 ini 方法。像一个魅力一样工作,我终于可以取出用户名和密码来获取源周围的东西。感谢您为我指明正确的方向!
    【解决方案3】:

    .htaccess 文件通常不可能在浏览器中显示,但请注意,这取决于网络服务器设置。这是 Apache 和 NGINX 中的默认值(.htaccess 文件没有功能),但要非常注意其他网络服务器可能有其他默认值,并且可能会显示 .htaccess 的内容。

    相反:php.ini 文件通常没有配置为在 HTTP 请求时被拒绝! 此外,如果 PHP 处理失败,您最终会得到明文凭据。

    无论如何,我认为 .htaccess 方法与使用 htpasswd 进行身份验证或限制访问一样可靠。

    在 Apache 的 .htaccess 中这有效:

    php_value mysqli.default_host     localhost
    php_value mysqli.default_user     obelix
    php_value mysqli.default_pw       zKSIOSwjsiyw9263djcaleP982WLdDU3kzn6
    php_value mysqli.default_db       broccoli
    

    那么在 PHP 中就很简单了:

    $db = mysqli_connect();
    $db->select_db('menhirdb');
    

    这总比在源代码中存储凭据要好。

    如果您认为您的网络服务器性能很差,因为在每个 HTTP 查询中逐行读取 .htaccess,最好将其放在 httpd.conf 中 无论如何,我会这样做,但随后喜欢:

    php_admin_value mysqli.default_host     localhost
    php_admin_value mysqli.default_user     obelix
    php_admin_value mysqli.default_pw       zKSIOSwjsiyw9263djcaleP982WLdDU3kzn6
    php_admin_value mysqli.default_db       broccoli
    

    使用 'php_admin_value' 的好处是 .htaccess 值不会自动覆盖它们。我认为这是一个很大的安全优势。正如我不止一次目睹的那样,易受攻击的 CMS 系统编写了恶意的 .htaccess 文件。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-07
    • 1970-01-01
    • 2020-10-28
    • 2015-04-19
    相关资源
    最近更新 更多