PHP(7.x)mysqli_的MySQL/MariaDB哈希数据库密码是否连接?

PHP(7.x)mysqli_的MySQL/MariaDB哈希数据库密码是否连接?,php,mysql,mariadb,websecurity,Php,Mysql,Mariadb,Websecurity,请原谅一个初学者的问题。欢迎提供建议、链接和进一步阅读 我关心网页的安全性,并寻找最佳实践。 当使用PHP连接到MariaDB/MySQL数据库时,大多数建议将数据库密码放在PHP页面(或包含的页面)上。这安全吗?是否有更好的“最佳实践” 我搜索过文档、堆栈溢出和关键字为“hash passwords MySQL MariaDB PHP7”等的互联网站,但答案都是关于客户端登录网页,而不是PHP直接与MariaDB交互。上面说密码是散列存储的,但这对我的PHP文件没有帮助。这篇文章没有提供太多有

请原谅一个初学者的问题。欢迎提供建议、链接和进一步阅读

我关心网页的安全性,并寻找最佳实践。 当使用PHP连接到MariaDB/MySQL数据库时,大多数建议将数据库密码放在PHP页面(或包含的页面)上。这安全吗?是否有更好的“最佳实践”

我搜索过文档、堆栈溢出和关键字为“hash passwords MySQL MariaDB PHP7”等的互联网站,但答案都是关于客户端登录网页,而不是PHP直接与MariaDB交互。上面说密码是散列存储的,但这对我的PHP文件没有帮助。这篇文章没有提供太多有用的信息,也没有真实的例子

所以,我的问题是:

  • HTTP用户下载我的源文件并查看这些密码的风险有多高?(我意识到PHP解析页面,因此典型用户看不到原始代码或无法下载PHP——ssh、PHP、MariaDB等的安全性是另一个问题。)

  • 我知道我可以散列密码,但是如果密码就在同一页上,这又有什么好处呢?(还是我遗漏了什么?)

  • 将数据库变量放入文件或使用
    包括(“super-sensitive info.php”)
    并放置变量 那里我可以(应该)散列或加密该文件或 密码,并且仍然使其可用?我是否可以(应该)隐藏此文件(例如
    .super-sensitive info.php
    ),然后使用服务器安全性限制访问

  • 而且,使用特殊字符给我带来了麻烦,例如,
    $password=“pa$$w@rd";
    应该看起来像
    $password=“pa\$\$w\@rd”,按照报价实践中的典型代码?还是我错过了不应该为SQL使用特殊字符的备忘录

  • 为了创建一个简单的示例,假设我有两个文件,看起来像这样。有更好的办法吗?还是这样

    super-sensitive info.php

    index.php


    对于一些最佳实践,请查看最常用的框架代码

    简言之,@chris85提出了最重要的几点。通常它具有文件夹结构:

    config/config.local.php
    public/index.php
    
    向git ignore添加
    config/*.local.php

    $ echo "config/*.local.php">>.gitignore
    
    config.php
    中:

    return [
      'db' => [
        'username' => '...',
        ...
      ]
    ];
    
    $config = require '../config.php';
    $db = DbConnect($config['db']);
    echo json_encode($db->getAllEpisodes());
    
    index.php
    中:

    return [
      'db' => [
        'username' => '...',
        ...
      ]
    ];
    
    $config = require '../config.php';
    $db = DbConnect($config['db']);
    echo json_encode($db->getAllEpisodes());
    
    从公用文件夹服务您的页面:

    $ php -S localhost:8000 -t ./public/
    

    您混淆了身份验证实体(通常是服务器)验证提供给它的密码的方式与需要证明其凭据的实体(通常是客户端)存储密码的方式。在您的示例中,服务器mysql数据库将密码存储为散列,因此即使数据泄漏,也无法确定原始密码是什么。一个重要的特性是,当客户端希望进行身份验证时,它必须提供密码的明文,以便服务器可以重复哈希过程。如果密码在客户机上散列并发送到服务器,那么验证将基于客户机显示的内容与服务器上存储的内容之间的精确匹配。明文的散列已成为密码-这是

    对于PHP/MySQL实例,是的,您的PHP需要密码的明文,并且需要将其提供给数据库进行身份验证。还有其他方法,但这些方法通常仅适用于在身份验证的两端控制代码的情况。因此,密码的明文可能比哈希密码更容易暴露

    无法存储PHP用于连接哈希数据库的密码

    在考虑保护明文的方法之前,您应该尽量减少可以使用它的上下文。MySQL可以使用x509证书进行身份验证(PHP同时支持),但这实际上相当于一个非常大的密码。最好在mysql中配置帐户,使其只能从特定地址访问(对于单个PHP/mysql节点,可以从localhost访问)

    …但如果你不控制基础设施,那就不太方便了

    HTTP用户下载我的源文件的风险有多高


    当您知道如何以及由谁管理基础架构时,这很难量化。但您似乎忽略了数据可能通过的其他路径

    至于保护密码

    • 正如其他人所说,如果您将密码存储在一个文件中,那么最好确保该文件位于文档根目录之外

    • 将其命名为包含扩展名为.php的密码的文件应该意味着,如果Web服务器直接指向该文件,它将尝试执行该文件,而不是将内容返回给http客户端。虽然试图隐藏文件是出于隐蔽性的安全考虑,因此不是一个好主意,但密码的存在并不是一个好做法

    • 对于Apache(和其他一些Web服务器),在文件名前面加“.ht”通常会阻止Web服务器直接访问它

    • 您可以将mysql用户名和密码存储为PHP(因此也可以存储在.htaccess文件中)。这是攻击者查找密码的一个相当明显的地方,但在某些情况下可能是合适的

    加密密码只是意味着你需要找一个安全的地方来存储加密密钥,而不是找一个安全的地方来存储密码

    我是否错过了不应该为SQL使用特殊字符的备忘录

    您的数据库密码通常不会出现在SQL语句中(除了从由..
    标识的
    GRANT…中)。不管怎样,只要对特殊字符进行了适当的转义,就可以使用它们。但特殊角色则不然
    
    GRANT ALL ON yourdb.* TO 'phpuser'@'192.168.0.%';