0

我的网站上有一个名为 dbSettings.php 的文件,其中包含以下内容:

<?php
    $host = "localhost";
    $dbName = "database";
    $user = "user";
    $pwd = "pass";
    $db = new mysqli($host, $user, $pwd, $dbName);
?>

我使用 require_once() 函数将此页面放入我的主页。通过服务器(我的域)访问此页面的人有什么方法可以获取存储在这些变量中的值?这是保持数据库设置的安全方法吗?

4

5 回答 5

3

这是在 php 应用程序中保留数据库凭据的常用方法。通常,配置文件会保留这些设置,一些好的做法是

  • 对文件的适当文件权限,例如
    chmod the file 640 instead of 600. Keep file ownership to your user and change group to webserver. This way, the webserver can only read and not modify it
  • 将文件移出 webroot,使其他人无法直接访问
  • 仅向该数据库用户授予所需的数据库权限
    If user just needs to access one database only give privileges for that database and data not give Structure or Administration related privileges if not needed
  • 如果可能的话,用
    .htaccess
    <files dbSettings.php> order allow,deny deny from all </files>
于 2013-08-06T02:52:27.627 回答
2

如果您的网络服务器配置正确,网络客户端应该无法查看设置。当.php通过网络服务器访问文件时,它会执行脚本,并将打印的内容返回给客户端。脚本的源代码不会发送给客户端。

您可以通过将这样的文件放在您的 webroot 之外来使事情更安全。然后客户端甚至无法解决它们,只能通过require从另一个脚本中访问它们。

于 2013-08-06T02:49:07.260 回答
0

根据我对 PHP 安全性的了解,这些信息有几种泄漏方式:

  1. 如果客户端可以以某种方式加载 dbSettings.php,而无需服务器处理页面。这显然会给出细节,因为他们可以只看文件。一般来说,如果您的服务器配置正确,并且您没有创建备份文件,这应该不是问题。
  2. 如果客户端加载了 dbSettings.php,您要确保没有错误会泄漏信息(例如,mysqli 创建不会失败并泄漏信息)。由于您的应用程序未初始化,因此您经常屏蔽的错误可能会出现。

至于安全地存储信息,我认为没有比 Barmar 建议的更好的解决方案,并将配置文件放在 Web 服务器实际上不提供文件的地方。PHP 通常仍然可以访问这些文件,但 Web 服务器不会将它们提供给客户端。根据您的主机,这可能会也可能不会。

于 2013-08-06T02:53:09.020 回答
0

确保您的 dbSettings.php 无法通过 URL 访问,因此 php 必须能够读取此文件,但不应通过在浏览器中输入其地址(通过猜测、运气等)来访问此文件。但是如果你已经正确配置了 www 服务器,你应该没问题,因为 php 将被处理并且空白页面将返回给用户。

仅当您错误地配置了您的网络服务器,因此它不会处理 php 页面而是将它们返回给用户 - 其他人可以访问该文件以进行下载。因此,您的设置不能从外部访问。

除此之外,您不应该在生产服务器上从您的 php 代码中获得回显、转储等这些值,并且您还应该从 mysql 驱动程序中捕获任何错误,这样它们就不会在生产服务器上打印给用户。

于 2013-08-06T02:56:51.307 回答
0

正如前面的答案所述,最重要的安全措施是正确的网络服务器配置。

当您正在创建一个永远不应直接访问的配置文件时,您可以安全地将其放在服务器根目录之外,或者放在服务器配置为不提供文件的目录中。只要文件具有适当的权限,您就可以include()在没有网络服务器帮助的情况下进行操作。

如果出于某种原因您选择坚持将配置文件放在可访问的位置,您可以使用一种define()技巧来防止未经授权的执行。这是通过在文件中定义一个常量来包含配置文件来完成的,在实际之前include(),然后检查配置文件本身中是否存在常量。

例子.php:

<?php
  define ('my_const', 1);
  include ('config.php');

  echo $super_secret_data;
?>

配置.php:

<?php
  if (!defined ('my_const'))
    die ();

  $super_secret_data = 42;
?>

当然,这里唯一的安全优势是如果直接访问页面,可执行代码将无法在没有常量的情况下运行,并且其数据将无法被未定义 const 的文件访问(由于晦涩难懂,安全性非常差,因为你可能仍然可以调用getfilecontents()文件)。

于 2013-08-06T03:13:14.207 回答