我们编写的程序中,有时会涉及到连接数据库或一些账户以及口令等敏感信息,如果直接在程序中通过硬编码将会不安全也不容易维护,比如:
<?php
class Connection
{
public static function make()
{
try {
return new PDO('mysql:host=127.0.0.1;dbname=mytodo', 'root', '');
} catch (PDOException $e) {
die($e->getMessage());
}
}
}
如果这些信息控制不善容易造成信息泄漏,同时也难以维护管理。为此我们可以调整思路,让这些运行参数变得灵活可配置,从而到在编码时不直接暴露敏感信息,比如通过集中配置的方式来实现。
小实践
在之前系列的项目代码基础上。我们新增 config.php
文件:
// config.php
<?php
return [
'database' => [
'name' => 'mytodo',
'username' => 'root',
'password' => '',
'connection' => 'mysql:host=127.0.0.1',
'options' => [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
]
]
];
这里设置
PDO::ATTR_ERRMODE
表示要返回错误报告。
更多可以参考手册 PDO::setAttribute
我们将数据库需要用到的相关信息抽取出来集中到了 config.php
中,这很方便我们之后集中管理这些会变动的信息。
接下来我们将 database/Connection.php
文件内容更改为:
// database/Connection.php
<?php
class Connection
{
public static function make($config)
{
try {
return new PDO(
$config['connection'].';dbname='.$config['name'],
$config['username'],
$config['password'],
$config['options']
);
} catch (PDOException $e) {
die($e->getMessage());
}
}
}
在我们之前的 bootstrap.php
中,内容修改后如下:
<?php
$config = require 'config.php';
require 'database/Connection.php';
require 'database/QueryBuilder.php';
return new QueryBuilder(
Connection::make($config['database'])
);
这样我们引入了配置文件 config.php
让它能为数据库连接进行灵活的配置,只要我们控制好 config.php
的私密性(这里暂不展开具体讨论),我们就已避免从硬编码的角度暴露敏感信息。