或者:“会以这种方式更改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连接?
答案 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,在学说中,您可以轻松地交换连接及其独立的数据库类型。