【问题标题】:Need a class for creating a database connection php with mysqli需要一个使用 mysqli 创建数据库连接 php 的类
【发布时间】:2023-03-22 03:12:01
【问题描述】:

我需要创建一个类来连接数据库。我知道硬编码数据库信息很糟糕,例如:

$user = "xxx";
$password = "yyy";
$server = "zzz";
$dbname = "name";

mysql_connect($user,$password,$server);
mysql_select_db($dbname);

这就是我使用“包含”的原因,例如:

include "config.php" 

其中包含所有需要的变量,然后我可以将 mysql_connect 与它们一起使用。但据我所知,这也是一种不好的做法。我怎样才能使用 mysqli 类(扩展它?)最简单的方法,当然也是最安全的?

感谢任何提示

【问题讨论】:

  • 为什么硬编码存在安全风险?
  • 我建议你使用 PDO。 PDO 为您提供了一个 DB 抽象层和所有访问数据的类,包括连接。

标签: php mysql mysqli


【解决方案1】:

最后,您必须将连接配置参数放入代码中。不管它是在常量、类等中......

我认为硬编码这些值不会带来安全风险。您的 php 脚本在服务器中。因此它们受到文件系统权限和系统权限的保护。 如果有人可以访问您的文件,则安全问题在于服务器而不是 php 脚本。

使用 PDO,它有类来处理数据库访问。

来自PDO php manual

PHP 数据对象 (PDO) 扩展定义了一个轻量级的、一致的 PHP中访问数据库的接口。

连接是通过创建 PDO 基础的实例来建立的 类。

示例 #1 连接到 MySQL

 <?php
 $dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
 ?>

【讨论】:

  • 如果您引用外部来源的材料,请确保您引用它。我已经编辑了您的问题,以说明应该如何归因。
【解决方案2】:

我现在无法真正回答你的问题, 但作为提示,请观看此视频。

这是一个 PHP 安全系列,可以帮助您:

https://www.youtube.com/watch?v=Nx-g-0ynP_I

如果不起作用,请在 youtube 上搜索 PHP Security 第 1 部分!

希望对你有帮助!

【讨论】:

    【解决方案3】:

    硬编码数据库常量并没有什么非常不安全的地方(正如其他人所说,它们必须在某个地方......)尽管您注意到将这些值放在单独的文件中是个好主意。我建议更进一步,不要在源代码管理中跟踪此文件,而是创建一个模板,例如 config.base.php,您将其复制到 config.php 并配置每个服务器。还有其他选项(在我工作的地方,我们跟踪这些文件,但将它们命名为 $(hostname).php 允许一些巧妙的导入链接,但不是必需的)但这是一个简单、安全的选项,其优点是保留这些版本控制之外的值。这允许在不提供这些密码的情况下分发代码。

    您需要关心的更大的安全问题是锁定您的前置 MySQL 用户,使其仅拥有您的 webapp 所需的权限。例如,通常情况下,您的网站使用CREATEing 或ALTERing 表是一个坏主意,因此最好不要将这些权限授予您网站使用的用户,并拥有不同的更高权限您直接用于离线更改架构的用户。

    对于您的问题,我在 common.php 类中执行以下操作来创建我的 MySQLi 连接:

    require_once($_SERVER['DOCUMENT_ROOT'].'/includes/config.php');
    $db = @new mysqli(MYSQL_HOST,MYSQL_USER,MYSQL_PASS,MYSQL_DB);
    if(mysqli_connect_errno())
    {
        if(DEBUG_MODE)
            $template->error('Failed To Connect To Database: '.mysqli_connect_errno().': '.mysqli_connect_error());
        else
            $template->error('Failed To Connect To Database.  Try reloading the page.  If this error persists, <a href="/contact.php">let me know</a>.');
    }
    

    【讨论】:

      【解决方案4】:

      我猜所有建议的答案都可能是正确的,但出于我的目的和情况,我创建了一个文件,其中包括 mysqli 对象创建和与数据库的连接以及一些用于转义数据的功能。我只是将文件包含在需要数据库连接的所有其他 .php 文件中,而且它非常易于使用和执行查询。如果有人需要更多信息或示例,请告诉我。

      谢谢大家

      【讨论】:

        猜你喜欢
        • 2018-12-30
        • 2014-12-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-13
        • 1970-01-01
        • 2013-12-26
        相关资源
        最近更新 更多