【问题标题】:PHP/Server Side: How to properly conceal database credentials filesPHP/服务器端:如何正确隐藏数据库凭据文件
【发布时间】:2018-09-02 14:33:10
【问题描述】:

我在隐藏 PHP 类所需的数据库凭据时遇到了很多问题。到目前为止,推荐的“解决方案”都没有奏效。

1) PHP 手册建议将凭据保存在不同的文件中:检查! 我所有的 PHP 数据库类都从不同的文件插入凭据。

典型的数据库类

class database{
private static $dbc = null;

public static function get($page,$component = null){
    if(self::$dbc === null) {
        $root = $_SERVER['DOCUMENT_ROOT'];
        $path = '/some path/';
        $file = 'pdo.php';
        require( $root . $path . $file );
    }
 ...more code...

凭据文件

$dbhost = 'some.host';
$dbname = 'someDBname';
$dbuser = 'someUser';
$dbpass = 'somePassword';

2)尽管如此,我将所有信息保存在网络主机中的文件,可以被嗅探或找到。

我怎样才能隐藏这个包含数据库信息的文件,以便拥有一个真正安全的网站和数据库?

【问题讨论】:

  • “文件可以被嗅探或找到”——由谁以及如何发现?
  • 最终,服务器的 PHP 进程可以访问凭据具有。在您信任的主要提供商的非共享主机(VPS、专用服务器等)上托管。
  • 我们不知道你读到的recommended solutions 是什么。您可以添加您尝试过的内容吗?我会将文件移到 Web 可访问目录之外。
  • 答案很简单:不要将文件放入您的DOCUMENT_ROOT!事实上,您应该将 大部分 PHP 文件放在文档根目录之外。

标签: php web-hosting document-root


【解决方案1】:

我建议将它们放在环境变量中。你可以getenv

您可以通过.env(Symfony 和 Laravel 都使用这个:Example)文件或.htaccess 文件中的here 解释来设置它们。

奖励:如果你是偏执狂,你可以加入盐并使用散列密码,正如 here, 解释的那样,但我怀疑这会改变很多。


编辑:在 cmets 中,@deceze 建议不要将凭证文件存储在文档根目录中。这绝对是您应该遵循的。

让我详细说明。假设您的域 example.com 指向 www/foo/bar/example.com/ 不要像 www/foo/bar/example.com/db.php 那样将文件存储在其中,而是将其存储在 www/foo/bar/db.php 的更高级别,这样就无法通过浏览器访问它,但 PHP 仍然可以访问ist,通过includerequire。您可以将.. 添加到路径以返回一个文件夹。如果您将它放在文档根目录中,则可以使用 http://example.com/db.php 访问它,并且如果您的服务器未正确配置(或者您使用其他正式形式,如 db.yml 或其他东西),它可以提供文件并因此暴露您的证书 注意:db.php 文件只是一个示例。如上所述,我强烈建议使用环境变量!


编辑 2: 在不使用环境变量的情况下坚持您的示例和 PHP 解决方案。你可以使用这样的东西:

// the db class
class database{
    private static $dbc = null;

    public static function get($page,$component = null){
        if(self::$dbc === null) {
            $root = $_SERVER['DOCUMENT_ROOT'];
            $path = '/../db/';
            $file = 'pdo.php';
            require( $root . $path . $file );

            self::$dbc = new PDO($dsn, $dbUser, $dbPass);
        }

        return self::$dbc;
    }
}

// the pdo.php file
$dsn = 'mysql:dbname=testdb;host=127.0.0.1';
$dbUser = 'dbuser';
$dbPass = 'dbpass';

文件结构类似于

www
  foo
    yourwebsite
      .htaccess
      index.php
      foobar.php
    db
      pdo.php

网站 example.com 将指向 www/foo/yourwebsite

【讨论】:

    猜你喜欢
    • 2020-03-25
    • 1970-01-01
    • 2014-11-09
    • 2018-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多