更改php / mysql数据库会创建不安全的连接吗?

时间:2019-03-28 18:39:56

标签: php mysql security database-connection

或者:“会以这种方式更改php / mysql数据库 创建不安全的连接吗?”

我正在考虑使我的实时/测试数据库自动化。我有点天真,所以我想我最好在这里问这个问题:

在以下php / mysql方案中,后果和/或安全问题是什么?

// set up the standard database

// Connection codes:
$host="localhost";
$user="imauser";
$password="imapassword";
$dbname="liveDB";

$cxn = mysqli_connect ($host,$user,$password,$dbname)
    or die ("Couldn't connect to the server.");

// check if $testMode is active, and reset $cxn with a new (test) $dbname:

if($testMode == TRUE){
    $dbname="testDB"; // test database
    // reset the cxn:
    $cxn = mysqli_connect ($host,$user,$password,$dbname)
        or die ("Couldn't connect to the server.");
}

这将允许我在代码的更高级别切换$ testMode。 简单地重写$ cxn是否可以正常工作,或者我将保持开放的活动mysqli_connect连接?

3 个答案:

答案 0 :(得分:2)

最好将数据库凭据与代码分开。万一有人发现读取您的代码的方式,他们应该看不到您的数据库密码。

将数据库凭据保留在配置文件中,您的应用在启动时会读取该配置文件。我会使用parse_ini_file()

这是一个示例配置文件:

[database]
host=localhost
user=imauser
password=imapassword
dbname=liveDB

这是您的阅读方式:

$config = parse_ini_file('config.ini', true);

如果我输出print_r($config),我会看到:

Array
(
    [database] => Array
        (
            [host] => localhost
            [user] => imauser
            [password] => imapassword
            [dbname] => liveDB
        )

)

这样,您可以在测试和生产环境中部署相同的代码,而只需要替换测试和生产服务器中的配置文件。

注意:确保不要将配置文件放在Web服务器可以从其提供文件的目录下。您的PHP代码可以从服务器上的任何位置读取文件,因此请确保没有人可以在浏览器中简单地打开配置文件。

答案 1 :(得分:1)

我在您的代码中看不到任何我认为不安全的东西。但是,两次mysqli_connect()似乎是不必要的。

您可以为此创建一个简单的ternary

// set up the standard database

// Connection codes:
$host = "localhost";
$user = "imauser";
$password = "imapassword";

//use a ternary like this
$dbname = $testMode ? 'testDB' : 'liveDB';

$cxn = mysqli_connect($host, $user, $password, $dbname) or die("Couldn't connect to the server: " . mysqli_connect_errno());

说明

上面的代码中的三元是等效

if($testMode == true) {
    $dbname = 'testDB';
} else {
    $dbname = 'liveDB';
}

可以像这样$variable = CONDITION ? TRUE : FALSE

来简单地解释三元组

如果您具有布尔变量(例如$testMode);您可以直接将其作为条件来检查它是真还是假。

if($testMode)等效于if($testMode == true)

其他更改

  • 我将您的die()调用更改为在无法显示错误的情况下实际显示该错误 连接。
  • 更改了一些格式,使其更易于阅读。

答案 2 :(得分:0)

我的意思是,只要您记得更改测试模式变量,就不会因此而引起安全性或其他问题。虽然我会用这样的switch语句来做到这一点

$devmode = "TEST";
$conn = null;
switch($devmode) {
    case "TEST"
        //conn here
       break;
    //case dev
    default:
        //local host con or prod conn
       break;
}

尽管有更好的方法来执行此操作,但我强烈建议您看一下诸如学说之类的东西来为您管理所有SQL,在学说中,您可以轻松地交换连接及其独立的数据库类型。