代码之家  ›  专栏  ›  技术社区  ›  Parapluie

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

  •  0
  • Parapluie  · 技术社区  · 5 年前

    或者:“将更改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连接?

    0 回复  |  直到 5 年前
        1
  •  1
  •   GrumpyCrouton    5 年前

    在您的代码中,我没有看到任何我认为不安全的地方。然而,做 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
  •  2
  •   Bill Karwin    5 年前

    最好将数据库凭据与代码分开。为了防止有人找到读取您代码的方法,他们不应该看到您的数据库密码。

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

        3
  •  0
  •   Lulceltech    5 年前

    我的意思是,只要您记得更改您的测试模式变量,就不会有安全性或其他问题产生。尽管我会用这样的switch语句来做这个

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

    不过,有更好的方法可以做到这一点,我强烈建议您研究类似于条令的东西来为您管理所有SQL,在条令中,您可以轻松地交换您的连接以及独立于数据库类型的连接。