【问题标题】:Will changing the php/mysql database create an insecure connection?更改 php/mysql 数据库会创建不安全的连接吗?
【发布时间】:2019-03-28 18:39:56
【问题描述】:

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

我正在考虑自动化我的实时/测试数据库。我对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 连接挂起?

【问题讨论】:

    标签: php mysql security database-connection


    【解决方案1】:

    最好将数据库凭据与代码分开。以防万一有人找到阅读您的代码的方法,他们不应该看到您的数据库密码。

    将数据库凭据保存在配置文件中,您的应用会在启动时读取该文件。我会使用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 代码可以从服务器上的任何位置读取文件,因此请确保没有人可以简单地在浏览器中打开配置文件。

    【讨论】:

    • 确实如此。我会在我的回答中澄清这一点。
    • 比尔,好主意。我可能会在不久的将来以某种形式实现这一点。不过真的,我没有单独的生产服务器,只有一个“沙箱”目录和测试数据库。不过我可以看到这里的优势。
    【解决方案2】:

    我没有在您的代码中看到任何我认为不安全的内容。但是,两次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() 调用以实际显示错误(如果不能) 连接。
    • 更改了一些格式以更易于阅读。

    【讨论】:

    • 一个真正有深度的雄辩答案。这很有帮助。谢谢你,脾气暴躁。我不得不处理一些代码来完成这项工作。但它做得很好。一切顺利。
    • @Parapluie 很高兴我能帮上忙。
    【解决方案3】:

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

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

    虽然有更好的方法可以做到这一点,但我强烈建议您查看学说之类的东西来为您管理所有 SQL,在学说中,您可以轻松地交换连接以及独立的数据库类型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-09
      • 1970-01-01
      相关资源
      最近更新 更多