数据库设置安全性

时间:2013-08-06 02:43:39

标签: php mysql security variables

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

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

我使用require_once()函数将此页面放入主页面。对于通过服务器(我的域)到达此页面的人来说,是否有任何方法可以获取存储在这些变量中的值?这是保持数据库设置的安全方法吗?

5 个答案:

答案 0 :(得分: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>

答案 1 :(得分:2)

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

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

答案 2 :(得分:0)

根据我所知的PHP安全性,这些信息有两种泄露方式:

  1. 如果客户端以某种方式加载dbSettings.php,则服务器不会处理该页面。这显然会给出详细信息,因为他们只能查看文件。一般来说,如果您的服务器配置正确,并且您没有创建备份文件,这应该不是问题。
  2. 如果客户端加载了dbSettings.php,您需要确保没有错误可能泄漏信息(因此,例如mysqli创建不会失败并泄漏信息)。由于您的应用未初始化,因此可能会出现您经常屏蔽的错误。
  3. 至于安全存储信息,我不认为有更好的解决方案可以像Barmar建议那样做,并将配置文件放在Web服务器实际上不提供文件的地方。 PHP仍然可以访问这些文件,但Web服务器不会将它们提供给客户端。根据您的主机,这可能是也可能是不可能的。

答案 3 :(得分:0)

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

只有当您错误配置您的Web服务器以便它不会处理php页面而是将它们返回给用户时 - 其他人才能访问该文件以进行下载。因此,无法再从外部访问您的设置。

除此之外你不应该从生产服务器上的php代码中获取echo,dump等等这些值,你也应该从mysql驱动程序中捕获任何错误,这样它们就不会打印给生产服务器上的用户。

答案 4 :(得分:0)

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

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

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

使用example.php:

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

  echo $super_secret_data;
?>

的config.php:

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

  $super_secret_data = 42;
?>

当然,这里唯一的安全好处是,如果直接访问页面,可执行代码将不会在没有常量的情况下运行,并且不能定义const的文件也无法访问其数据(这是非常糟糕的安全性)通过默默无闻,你可能仍然可以在文件上调用getfilecontents()