0

我真的只是从使用 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");

我只是想问一下将数据库连接放在类构造函数中的正确方法是什么。不过,我不太了解我在这个论坛中找到的其他解决方案。我希望有人能给我一点启发。干杯!

4

2 回答 2

1

我将尝试详细说明您可能在论坛上找到的其他解决方案,因为您说您并不真正了解它们。

请记住(假设您的网络服务器已正确配置),您的 PHP 源代码无法从外部访问(即访问者无法访问)。因此,将凭据存储在源代码中实际上并没有任何本质上的错误。主要问题是您是否与其他人共享源代码,例如在 Bitbucket 或 Github 上。此外,任何对您的服务器具有文件访问权限的人(例如,可以坐在计算机前的人,或者可以将远程 shell 放入其中的人)都可以读取这些内容。

标准方法是只设置一个属于代码库的配置文件(即,它不置于版本控制之下,也不与可能使用或开发代码的任何其他人共享)。所以它看起来像这样:

<?php

$db_host = "localhost";
$db_username = "blahblahblah";
$db_password = "whatever";
$db_name = "dbname";

?>

对于您需要的任何其他配置值,依此类推。例如,您可以将其存储在其中,config.php为了增加安全性,请将其放在网络服务器的文档根目录之外。这样就无法从网络上访问它。您还想确保它只能被执行脚本的用户帐户读取,通常是weborwwwapache

现在,当您需要配置值时,您可以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将配置文件放在函数内部:这只是增加了一点安全性,以确保配置文件中的变量仅具有函数局部范围,并且一旦函数返回就不再可访问。

于 2013-08-13T18:01:37.207 回答
0

可以使用构造函数创建连接,但您可以查看单例模式以避免创建多个连接。

关于这些值,您应该使用常量或仅使用一组配置参数将它们存储到单独目录中的 config.php 文件中。因此,您将包含类文件、配置文件并使用配置参数实例化 DB 类。

于 2013-08-13T17:54:08.523 回答