我真的刚刚开始使用MySQLi进行OOP,我想出了这个问题。
这是我的代码:
Class Database{
public $mysqli;
public function __construct($db_host, $db_user, $db_password, $db_name){
$this->con = new mysqli($db_host, $db_user, $db_password, $db_name);
}
}
上面的代码正在运行。 但是当我需要实例化这个类时,我需要在我的主页面中声明我的主机名,用户名和数据库名称,这不是安全的,而且非常容易受到攻击(我猜)。
$db = new Database("HostOfDatabase", "DBRoot", "", "databaseOfMine");
我只想问一下将数据库连接放在类构造函数中的正确方法是什么。我不太了解我在这个论坛中发现的其他解决方案。我希望有人可以启发我一点。干杯!
答案 0 :(得分:0)
使用构造函数创建连接是可以的,但您可以查看Singleton模式以避免创建多个连接。
关于值,您应该使用常量或仅使用配置参数数组将它们存储在单独目录中的config.php文件中。因此,您将包含类文件,配置文件并使用config参数实例化DB类。
答案 1 :(得分:0)
我会尝试详细说明您在论坛上找到的其他解决方案,因为您说您并不真正了解它们。
请记住(假设您的网络服务器配置正确),您的PHP源代码无法从外部访问(即访问者无法访问)。因此,在源代码中存储凭据实际上没有任何内在错误。主要问题是如果您与其他任何人共享源代码,例如在Bitbucket或Github上。此外,任何对您的服务器具有文件访问权限的人(例如,可以坐在计算机上的人,或者可以将远程shell放入其中的人)都能够阅读这些文件。
标准方法是只设置一个不代码库的配置文件(即,它不受版本控制,如果没有其他人可能正在使用或开发码)。所以它看起来像这样:
<?php
$db_host = "localhost";
$db_username = "blahblahblah";
$db_password = "whatever";
$db_name = "dbname";
?>
依此类推您需要的任何其他配置值。您可以将其存储在config.php
中,为了增加安全性,请将其放在网络服务器的文档根目录之外。这样就无法从网上访问它。您还希望确保它只能由执行您的脚本的用户帐户读取,通常是web
或www
或apache
。
现在,当您需要配置值时,您可以include("config.php")
直接访问变量。例如,它可能看起来像这样:
<?php
class Database{
public function __construct(){
require("config.php");
$this->con = new mysqli($db_host, $db_user, $db_password, $db_name);
}
}
?>
注意我require
是函数内部的配置文件:这只是一点安全性,以确保配置文件中的变量只有函数本地范围,并且一旦函数返回就不再可访问