Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/236.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.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和MySQL-如何在源代码中避免使用密码?_Php_Mysql_Password Protection - Fatal编程技术网

PHP和MySQL-如何在源代码中避免使用密码?

PHP和MySQL-如何在源代码中避免使用密码?,php,mysql,password-protection,Php,Mysql,Password Protection,我有一个在数据库中存储数据的小PHP应用程序。目前,用户名/密码在PHP代码中是硬编码的。例如,我不太喜欢这种情况,因为代码在存储库中也可用 我最好的想法是将数据从代码移动到配置文件(从存储库中排除),并以某种方式对其进行编码,这样就不会直接读取(混淆)。有没有更好、更容易使用的方法来解决这个问题 $link = mysql_connect('localhost', 'mysql_user', 'mysql_password'); if (!$link) { die('Could no

我有一个在数据库中存储数据的小PHP应用程序。目前,用户名/密码在PHP代码中是硬编码的。例如,我不太喜欢这种情况,因为代码在存储库中也可用

我最好的想法是将数据从代码移动到配置文件(从存储库中排除),并以某种方式对其进行编码,这样就不会直接读取(混淆)。有没有更好、更容易使用的方法来解决这个问题

$link = mysql_connect('localhost', 'mysql_user', 'mysql_password');
if (!$link) { 
    die('Could not connect: ' . mysql_error());
}
mysql_select_db('mydb');
范围:我想建立一个强大的,但也易于使用的解决方案。我想要合理的安全性,但我这里不处理高度机密的数据


备注:不再建议使用
mysql\u connect
函数,请参阅堆栈溢出问题*。我本可以更改代码示例,但由于一些注释提到了这一点,我没有这样做。然而,问题的原始性质仍然有效。

我要做的是在存储库中只存储示例配置文件,如config.php.dist,而不将实际的config.php置于版本控制之下。

最简单的方法是,如您所说,使用配置文件

许多框架都使用这个(、等),这是最常见的操作方式(即使在非PHP环境中,例如ASP.NET及其
web.config
文件)。这还允许您通过仅复制站点的文件将配置值从一个环境复制到另一个环境,这比依赖服务器设置环境变量(很快就会丢失和忘记)有好处

您不必担心密码的混淆,因为它不是一个全球可访问的文件,当然不应该是web可访问的。我的意思是,您可以a)告诉您的web服务器不要为您的配置文件提供服务(已经使用
web.config
文件执行此操作,并提供HTTP 404.8状态而不是内容),或者b)将其移到web服务目录之外。如果有人能看到你的配置文件,那就比把它放在源代码中更糟糕了

最好有一个基本(空/默认)版本的配置文件,并将其按环境分开,这样您就可以为生产、开发和测试平台使用不同的配置文件

环境变量是区分这些环境最常用的方法,类似于以下代码:

// Check if it's been set by the web server
if (!empty($_ENV['ENVIRONMENT'])) {
    // Copy from web server to PHP constant
    define('ENVIRONMENT', $_ENV['ENVIRONMENT']);
}

if (!defined('ENVIRONMENT')) {
    // Default to development
    define('ENVIRONMENT', 'development');
}

// Load in default configuration values
require_once 'config.default.php';

// Load in the overridden configuration file for this environment
require_once 'config.' . ENVIRONMENT . '.php';
另一种非常常见的方法是使用XML配置文件,并仅在适当的情况下读取所需的值(将配置文件的缓存副本存储在内存中)。这可以很容易地限制为只加载某些值,而不允许任意包含PHP文件,在我看来,这是一个总体上更好的解决方案,但以上内容应该让您朝着正确的方向开始

您可能希望忽略该文件。另一方面,您可能希望对文件的框架或具有合理默认值的框架(当然,后者不适用于登录数据)进行版本控制。处理该问题的一种常见方法是使用签入模板配置文件,安装过程将该文件复制到实际配置文件的位置,并在该位置对其进行自定义。这可以是手动的,也可以是自动的


(虽然与主要问题有点无关,但为您的环境引入一个常量可以让您做一些其他很酷的事情,比如推迟到伪邮件实现而不是实时邮件实现,但当然这也可以通过配置文件来完成)

如果您使用的是Apache,它可以将信息存储在virtualhost配置中

SetEnv  MYSQL_USER     "xx"
SetEnv  MYSQL_PASSWORD "y2wrg435yw8"

可以使用
$\u ENV[]
轻松获取数据,以便在代码中使用。

最好将密码从代码移到配置文件中,这样密码就不会在存储库中。在配置文件中对其进行加密的想法值得怀疑,因为拥有配置文件+解密它的PHP代码的人总是可以运行代码并获得明文密码。可能最好将密码以纯文本形式保存在配置文件中,并考虑如何保护配置文件不受未经授权的访问。

您始终可以使用该功能创建配置ini文件。

问得好。您可以将最敏感的部分(例如密钥/密码)作为环境变量移出,但这只会将问题推迟到服务器配置(可能也在存储库中)


您还可以尝试避免数据库之类的东西的密码,方法是减少密码,改为在防火墙后保护它。这些都不是完美的解决方案,但它们是我所知道的方法。

我看不出所有这些问题。如果要共享存储库,您可能不想硬编码密码和配置。您应该提供一个默认值:

host: localhost
user: root
pass: root
name: db
如果您真的需要,您可以使用并解析
.ini
文件,但与源代码中设置的数组相比,它可能非常慢,对我来说没有多大意义


记住:你唯一可以信任的是你的源代码,如果他们能得到它,你就完蛋了。

正如其他人所提到的,把它放在源代码管理之外的一个单独的配置文件中(显然这将在源代码管理下的代码中提到)

最好将文件命名为config.php,而不是config.ini,以防目录意外暴露,这意味着该文件不会被下载,而不会返回任何内容。

如果您认为这种方式很有价值,他们建议将配置存储在环境中

这样做的另一个好处是,当您在非生产环境中进行测试时,您可以编写完全相同的代码。如果你想(或不想)