Codeigniter 3 MySQLi 安全数据库连接

Posted

技术标签:

【中文标题】Codeigniter 3 MySQLi 安全数据库连接【英文标题】:Codeigniter 3 MySQLi Secure db connection 【发布时间】:2021-05-28 12:06:00 【问题描述】:

最近我的 db 团队升级了 db 以进行加密连接。我们使用 Codeigniter 3 构建的门户开始出现以下错误。

Severity: Warning

Message: mysqli::real_connect(): (HY000/3159): Connections using insecure transport are prohibited while --require_secure_transport=ON.

Filename: mysqli/mysqli_driver.php

Line Number: 203

在数据库端进行此更改之前,它工作正常。当我尝试检查 Codeigniter 论坛时,我被要求检查以下链接。

https://forum.codeigniter.com/thread-77193-post-384725.html#pid384725 --> https://dev.mysql.com/doc/mysql-security-excerpt/8.0/en/using-encrypted-connections.html#using-encrypted-connections-client-side-configuration

我们有两个站点,一个是使用 Sprint 启动 (Java) 构建的,它使用简单 (useSSL=true),但他们没有遇到这些问题。但是 Codeigniter 开始抛出上述错误,我对此一无所知。

其他细节: Codeigniter 版本:3.1.11 PHP 7.3.11

下面是我在 codeigniter 端的连接字符串。

$db['default'] = array(
    'dsn'   => '',
    'hostname' => 'dbhost',
    'username' => 'dbusername',
    'password' => 'password',
    'database' => 'dbname',
    'dbdriver' => 'mysqli',
    'dbprefix' => '',
    'pconnect' => FALSE,
    'db_debug' => (ENVIRONMENT !== 'production'),
    'cache_on' => FALSE,
    'cachedir' => '',
    'char_set' => 'utf8',
    'dbcollat' => 'utf8_general_ci',
    'swap_pre' => '',
    'encrypt' => FALSE,
    'compress' => FALSE,
    'stricton' => FALSE,
    'failover' => array(),
    'save_queries' => TRUE,
);

【问题讨论】:

【参考方案1】:

您需要更多配置才能在 MySQL 连接上设置 SSL 密钥。 在加密密钥中创建一个数组并用这个键/值填充它。

‘ssl_key’ - Path to the private key file
‘ssl_cert’ - Path to the public key certificate file
‘ssl_ca’ - Path to the certificate authority file
‘ssl_capath’ - Path to a directory containing trusted CA certificates in PEM format
‘ssl_cipher’ - List of allowed ciphers to be used for the encryption, separated by colons (‘:’)
‘ssl_verify’ - TRUE/FALSE; Whether to verify the server certificate or not (‘mysqli’ only)

【讨论】:

如果你有 SSL 加密连接到你的 MySQL 服务器,你应该有一个 SSL 公共和认证文件(密钥)。请联系您的系统管理员、devops 或托管服务提供商。【参考方案2】:

我想,我已经想通了。它只是期待我 SSL_VERIFY => FALSE,然后它与 MySQL 连接。

'encrypt' => [
    'ssl_verify' => FALSE
],

如果我提供ssl_verify => TRUE,那么它需要所有其他参数 ssl_key、ssl_cert 和 ssl_ca。在我的例子中,它通过ssl_verify ==> FALSE 自动连接到 MySQL。

所以 SSL_VERIFY false 意味着不需要客户端验证,因此不需要证书、ca 和密钥路径。因此,这又是您的数据库的配置方式。如果它被配置为需要客户端验证,那么您应该传递 SSL_VERIFY = TRUE 以及其他所有其他详细信息。但就我而言, SSL_VERIFY = FALSE 很好。那可能是JAVA应用也没有遇到这个问题。

感谢大家的支持。

【讨论】:

禁用证书检查会使您面临漏洞。这绝对不是推荐的解决方案 我认为,拥有 ssl 证书可以提供额外的安全性。 “为了增加安全性,您可以将客户端设置为单向(服务器或客户端)或双向(服务器和客户端)SSL 身份验证,允许客户端或服务器验证彼此的身份。”参考:dev.mysql.com/doc/connector-j/5.1/en/… 也就是说,即使我们通过ssl_verify = false,服务器也不会解密任何东西? .在客户端拥有证书详细信息只是一种额外的安全性。

以上是关于Codeigniter 3 MySQLi 安全数据库连接的主要内容,如果未能解决你的问题,请参考以下文章

[尝试使用mysqli连接到数据库时出现Codeigniter错误

CodeIgniter 4 项目中未定义的常量“CodeIgniter\Database\MySQLi\MYSQLI_STORE_RESULT”

在 CodeIgniter 中调用未定义的方法 CI_DB_mysqli_result::where()

CodeIgniter 3 数据库连接到自己的 IP

Codeigniter“调用未定义的函数mysqli_init()”错误

Codeigniter:对未定义函数 mysqli_init() 的致命错误调用