mysqli连接数据库用户和密码设置

时间:2017-11-24 20:50:38

标签: php mysql mysqli

我想弄清楚是否有办法建立一个密码恢复系统,实际上隐藏了所有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文件来获取数据库信息。所有这些都可以隐藏所以我的数据库不容易受到攻击吗?

3 个答案:

答案 0 :(得分:4)

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

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

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

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

  • config.php 中添加 .gitignore 行(如果您使用的是 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。正是这个例程使您的密码安全且便于携带,而不是您选择的文件格式。

答案 1 :(得分:0)

说实话,你发现的大部分教程都可能是绝对的垃圾,而且他们告诉你的一切都是错的。其中很少有人真正解决严重的安全问题,而那些通常要么掩盖它,或者未能通过推广最佳实践来解决问题。

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

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

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

从不检查您的生产配置文件到版本控制。这就是您将API密钥和密码泄露给攻击者的方式。例如,意外地将Amazon AWS密钥推送到公共GitHub存储库通常会受到使用该密钥来驱动数百个昂贵实例的人的迅速惩罚。如果存储库是私有的并不重要:这些存储库可以由人克隆并在您不知情的情况下公开。

始终尽最大努力减少存储关键密码,API密钥和其他凭据的位置数量。使用像1Password这样的安全存储系统作为“保险库”,其内容经过适当和彻底的加密,而不是像谷歌文档那样可能受到损害。

始终在受到攻击时刻录存储在服务器上的所有密码,API密钥和其他凭据。如果您不知道访问权限或访问时长,请重新发布新密码,生成新的API密钥,并确保旧凭据不再有效。不要以为你有时间解决这个问题。你可能不会。当你意识到自己遇到问题时,立即永久地解决问题。

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

答案 2 :(得分:-1)

.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 文件。