将秘密存储在Web应用程序中很复杂,但是大多数语言/框架都有这样做的方法。
我正在创建一个Web应用程序,需要连接到MySQL数据库。我目前正在使用PHP 7.3。我正在使用PDO标准方式(new PDO(DB_DSN, DB_USER, DB_PASS)
)连接到SQL数据库,但已被告知以下语句:
数据库凭据应来自环境,而不应在源代码中进行硬编码。
但是,我不确定该怎么做。
当前,该应用程序托管在Linux服务器上,但正在迁移到Azure服务器。但是在我们迁移它之前,他们希望我如上所述更改SQL凭据配置。
我当前正在使用PHP文档注释here中提供的类。
有多种方法可以实现,但都不容易。但是,一种快速简便的方法是将凭据保存在服务器上的外部文件中,让php从中获取凭据并使用htaccess对其进行保护。
username|password
。在您的“ .htaccess”文件中,添加以下文本:-
# Deny access to .htaccess
<Files .htaccess>
Order allow,deny
Deny from all
</Files>
# Disable directory browsing
Options -Indexes
# Deny access to files with extensions .ini
<FilesMatch "\.(ini)$">
Order allow,deny
Deny from all
</FilesMatch>
在您的php中,使用以下代码:-
$creds = explode('|', file_get_contents("creds.ini"));
new PDO(DB_DSN, $creds[0], $creds[1]);
您必须根据用法自定义名称和php代码,这些只是示例代码和名称。
假设您当前的Linux安装使用Apache作为Web服务器,您可以像这样在其配置文件(httpd.conf或.htaccess)中配置环境变量
SetEnv DB_USER whatever
如果是它的Nginx,它将是
fastcgi_param DB_USER whatever;
此后,可以使用$_ENV
数组像这样访问这些值>
new PDO($dsn, $_ENV['DB_USER'], $_ENV['DB_PASS']);
((请注意,因为它太局限在PDO中,所以我会避免将整个DSN存储在环境中。最好存储诸如DB_HOST和DB_NAME之类的常规参数,然后从它们中调用DSN)
鉴于Azure没有使用任何一种,您将不得不在Windows GUI上配置此类变量,如在此答案What Can Access "App Settings Key Values"?中所述的某些GUI应用程序中>
当然,对于在本地开发服务器上运行代码的所有实例,都应重复该过程。
将秘密存储在Web应用程序中很复杂,但是大多数语言/框架都有这样做的方法。
[在PHP中,一种方法是将信息存储在环境变量中,然后可以retrieve at run time.例如,可以使用
$DB_DSN = $_SERVER["DB_DSN"]; $DB_USER = $_SERVER["DB_USER"]; $DB_PASS = $_SERVER["DB_PASS"];
然后每个环境(开发机器,测试服务器,生产服务器)可以对这些环境变量进行不同的设置。
甚至还有library可以帮助您。
将秘密存储在Web应用程序中很复杂,但是大多数语言/框架都有这样做的方法。