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

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

$link = mysql_connect('localhost', 'mysql_user', 'mysql_password');
if (!$link) { 
    die('Could not connect: ' . mysql_error());
}
mysql_select_db('mydb');

范围:我想建立一个强大的,但也易于使用的解决方案.我想要合理的安全性,但我不是在处理高度机密的数据.

Remark: It is no longer recommended to use the mysql_connect functions, see Stack Overflow question Why shouldn't I use mysql_ functions in PHP?*. I could have changed the code example, but since some comments refer to this, I did not. However, the original nature of the question remains valid.

推荐答案

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

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

你不需要担心密码的混淆,因为它不是一个世界范围内可访问的文件,它当然不应该是网络可访问的.我的意思是,您可以a)告诉您的web服务器不要为您的配置文件提供服务(IIS已经为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文件,在我看来,这总体上是一个更好的解决方案,但上面的方法应该会让您朝着正确的方向开始.

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

(Whilst somewhat unrelated to the main question, introducing a constant for your environment allows you to do some other cool stuff like deferring to a fake mail implementation instead of a live 100 one, but of course this could also be done with a configuration file)

Php相关问答推荐

Laravel 10查询中的多个where子句

如何在搜索域名时重定向到登陆页?

从WooCommerce Checkout Country Select2下拉列表中重新排序国家/地区

模型中的Laravel自定义查询字段

如何在不指定symfony列的情况下从数据库中获取行数组

在特定日期之间使用特定的元密钥销售产品

如何在PHP中出现弃用警告时触发错误?

WooCommerce在购买后多次重定向

Apache只允许index.php-不从根目录工作

需要以一种形式执行两个操作

为什么从一个页面到另一个页面都找不到 JQuery,因为它们使用相同的 twig 模板?

将 PHP 版本更改为 8.1,但 WordPress 认为我们正在使用版本 7.4?

PHP Laravel 迁移文件不创建关系

woocommerce checkout 页面上的自定义字段

添加产品标签以通过 WooCommerce 邮箱通知订购商品

正则表达式 (php) 匹配单个 [ 或单个 ] 但忽略 [[ ]] 之间的任何内容?

为什么 ECDSA 384 签名验证在 GO 中失败,但在 PHP 中却没有?

转发和非转发呼叫 - 后期静态绑定

NetBeans 不显示中文内容

如何使 Wordpress Woocommerce 自定义输入字段成为必填字段