Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在PHP中保护数据库密码?_Php_Database_Security - Fatal编程技术网

如何在PHP中保护数据库密码?

如何在PHP中保护数据库密码?,php,database,security,Php,Database,Security,当PHP应用程序建立数据库连接时,它当然通常需要传递登录名和密码。如果我对我的应用程序使用一个最小权限登录,那么PHP需要知道该登录名和密码。保护该密码的最佳方法是什么?似乎仅仅在PHP代码中编写它不是一个好主意。将它们存储在web根目录之外的文件中。一些人将此误解为关于如何在数据库中存储密码的问题。这是错误的。它是关于如何存储密码,让您能够访问数据库 通常的解决方案是将密码从源代码移到配置文件中。然后将管理和保护该配置文件的工作交给系统管理员。这样,开发人员就不需要知道有关生产密码的任何信息,

当PHP应用程序建立数据库连接时,它当然通常需要传递登录名和密码。如果我对我的应用程序使用一个最小权限登录,那么PHP需要知道该登录名和密码。保护该密码的最佳方法是什么?似乎仅仅在PHP代码中编写它不是一个好主意。

将它们存储在web根目录之外的文件中。

一些人将此误解为关于如何在数据库中存储密码的问题。这是错误的。它是关于如何存储密码,让您能够访问数据库


通常的解决方案是将密码从源代码移到配置文件中。然后将管理和保护该配置文件的工作交给系统管理员。这样,开发人员就不需要知道有关生产密码的任何信息,并且在源代码管理中也没有密码记录。

将数据库密码放入文件中,使其对提供文件服务的用户是只读的


除非您有某种方法只允许php服务器进程访问数据库,否则这几乎是您所能做的一切。

如果您谈论的是数据库密码,而不是来自浏览器的密码,那么标准做法似乎是将数据库密码放在服务器上的php配置文件中


您只需要确保包含密码的php文件具有相应的权限。也就是说,它应该只能由web服务器和您的用户帐户读取。

将它放在某个配置文件中通常是这样做的。只要确保你:

  • 不允许从网络之外的任何服务器访问数据库
  • 注意不要意外地向用户显示密码(在错误消息中,或通过PHP文件意外地用作HTML等等)

  • 您的选择有点有限,因为您说需要密码才能访问数据库。一种通用方法是将用户名和密码存储在单独的配置文件中,而不是主脚本中。然后确保将其存储在主web树之外。如果存在web配置问题,导致php文件只显示为文本而不是执行,那么您就没有公开密码

    除此之外,您对正在使用的帐户的访问权限最小。再加上

    • 不要将用户名/密码组合用于任何其他用途
    • 将数据库服务器配置为仅接受来自该用户的web主机的连接(如果数据库位于同一台计算机上,则localhost更好),这样即使凭据已公开,也不会对任何人有用,除非他们具有对该机的其他访问权限
    • 混淆密码(即使ROT13也可以)如果有人访问该文件,它不会提供太多防御,但至少可以防止随意查看该文件

    Peter

    如果您使用的是PostgreSQL,那么它会在
    ~/.pgpass
    中自动查找密码。有关更多信息,请参阅。

    另一个技巧是使用PHP单独的配置文件,该文件如下所示:

    <?php exit() ?>
    
    [...]
    
    Plain text data including password
    
    
    [...]
    包含密码的纯文本数据
    
    这并不妨碍您正确设置访问规则。但是,如果您的网站被黑客攻击,那么“require”或“include”将在第一行退出脚本,因此获取数据更加困难


    但是,千万不要让配置文件位于可以通过web访问的目录中。您应该有一个“Web”文件夹,其中包含您的控制器代码、css、图片和js。这就是全部。任何其他内容都会进入脱机文件夹。

    对于非常安全的系统,我们会在配置文件中加密数据库密码(配置文件本身由系统管理员保护)。在应用程序/服务器启动时,应用程序会提示系统管理员输入解密密钥。然后从配置文件读取数据库密码,解密并存储在内存中以备将来使用。仍然不是100%安全,因为它是存储在内存中解密的,但您必须在某个时候称之为“足够安全”

    如果可以在存储凭据的同一文件中创建数据库连接。在connect语句中内联凭据

    mysql_connect("localhost", "me", "mypass");
    
    否则,最好在connect语句之后取消设置凭据,因为不在内存中的凭据不能被删除;)


    最好的方法是根本不存储密码
    例如,如果您在Windows系统上,并且连接到SQL Server,则可以使用集成身份验证,使用当前进程的标识连接到数据库,而无需密码


    如果您确实需要使用密码连接,请首先使用强加密(例如,使用AES-256,然后保护加密密钥,或使用非对称加密,让操作系统保护证书)对其进行加密,然后将其存储在配置文件中(web目录外)使用strong ACL

    如果您在其他人的服务器上托管,并且在webroot之外没有访问权限,您可以始终将密码和/或数据库连接放入文件中,然后使用.htaccess锁定该文件:

    <files mypasswdfile>
    order allow,deny
    deny from all
    </files>
    
    
    命令允许,拒绝
    全盘否定
    
    最安全的方法是根本不在PHP代码中指定信息

    如果您使用的是Apache,这意味着要在httpd.conf或虚拟主机文件中设置连接详细信息。如果这样做,就可以调用mysql_connect(),而无需任何参数,这意味着PHP永远不会输出您的信息

    以下是在这些文件中指定这些值的方式:

    php_value mysql.default.user      myusername
    php_value mysql.default.password  mypassword
    php_value mysql.default.host      server
    
    然后按如下方式打开mysql连接:

    <?php
    $db = mysqli_connect();
    
    <?php
    $db = mysqli_connect(ini_get("mysql.default.user"),
                         ini_get("mysql.default.password"),
                         ini_get("mysql.default.host"));
    

    此解决方案是通用的,因为它对开放源代码应用程序和封闭源代码应用程序都很有用

  • 为应用程序创建操作系统用户。
    <?php
    $db = mysqli_connect(ini_get("mysql.default.user"),
                         ini_get("mysql.default.password"),
                         ini_get("mysql.default.host"));