如何使用 PHP 安全地连接到数据库?

信息安全 php 数据库 mysql 权限
2021-08-23 22:51:18

目前在 PHP 中(在文件中/var/www/website.com/public_html/functions.php)。我正在像这样连接到数据库:

function connect(){
    $config = parse_ini_file('/var/www/website.com/db.ini');
    $con = mysqli_connect("localhost",$config['username'],$config['password'],$config['db']);
    if(!$con){
        die("Failed to connect to Database"); 
    }
    return $con;
}

/var/www/website.com/db.ini哪里

username=user123
password=pass123
db=mydb

有权限:

-rw-r--r-- 1 root root 84 /var/www/website.com/db.ini

PHP 将由www-data或运行root

的根website.com/var/www/website.com/public_html/

从安全的角度来看,这是使用 PHP 连接到数据库的最佳方式吗?我也在使这段代码开源。

2个回答

你的方法看起来不错。

  • 您将凭据存储在单独的配置文件中,而不是将它们内嵌在源代码中。这使得在与他人共享代码时变得安全,并在错误配置导致普通 PHP 代码被打印出来(这种情况经常发生)的情况下保护凭证。

  • 配置文件位于公共文档根目录之外,因此 Web 应用程序的用户无法直接访问它,除非存在其他漏洞(例如目录遍历漏洞)。

  • 在任何情况下,您都应该避免将服务器作为root. 否则权限模型毫无价值,因为root可以读取和写入任何文件。

请注意,您根本不必在代码中解析凭据 - 您可以将它们指定为服务器配置中的PHP 运行时设置,如此所述。

另见:

我对这种-rw-r--r-- 1 root root方法持怀疑态度。这样做的安全方法是

  1. 使文件-r-------- 1 root root即只能由用户读取root
  2. 以 . 身份启动您的应用程序root,读取凭据并立即连接setuid()www-data. 因此,任何破坏该应用程序的人都无法读取该文件,即使是通过目录遍历攻击,除非他们当然找到了另一种获取方式,root在这种情况下,无论如何游戏都结束了。在 PHP 中应该是可能的

这与 Web 服务器用于绑定到端口 80 的机制相同,该端口是特权端口。