我想弄清楚是否有一种方法可以制作一个密码恢复系统,该系统实际上隐藏了带有所有 mysqli 数据库用户名和密码的“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));
}
?>
Run Code Online (Sandbox Code Playgroud)
这是在 connection.php 文件中,需要添加为
require_once('connection.php');
Run Code Online (Sandbox Code Playgroud)
现在可以在源代码中看到这个 php 文件,那么您就知道要查找哪个 php 文件来获取数据库信息。有什么办法可以隐藏所有这些,这样我的数据库就不会受到攻击吗?
说得直白一点:在 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,
],
];
Run Code Online (Sandbox Code Playgroud)
将其添加到版本控制中
在您的应用程序引导文件中有这样的代码
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');
Run Code Online (Sandbox Code Playgroud)
然后,按照建议,config.php在应用程序运行的每台服务器上创建,每个服务器都有自己的一组值
您必须了解的是,此例程对于任何文件格式都是必需的,config.ini包括在内。正是这个例程使您的密码安全且可移植,而不是您选择的文件格式。