Py学习  »  DATABASE

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

Parapluie • 7 年前 • 1742 次点击  

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

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/31296
文章 [ 3 ]  |  最新文章 7 年前
Tim Hinz
Reply   •   1 楼
Tim Hinz    7 年前

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

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

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

Bill Karwin
Reply   •   2 楼
Bill Karwin    7 年前

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

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

GrumpyCrouton
Reply   •   3 楼
GrumpyCrouton    7 年前

在您的代码中,我没有看到任何我认为不安全的地方。然而,做 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() 调用以实际显示错误(如果无法显示) 连接。
  • 更改了一些格式以便于阅读。