【问题标题】:PHP: How to secure a 'plaintext' password within a PHP file in .htaccessPHP:如何在 .htaccess 中的 PHP 文件中保护“纯文本”密码
【发布时间】:2019-09-13 14:50:07
【问题描述】:

我有一个 nginx 服务器,它将流量重定向到一个文件夹(例如,我们只需调用文件夹“htaccess”)到一个 404 页面,这样我就可以在一个 php 文件中存储一个明文密码。问题是,这感觉非常不安全,但需要访问我的 mysql 数据库。

在线指南上找到:

define('DB_SERVER', 'localhost');
define('DB_USERNAME', 'redacted');
define('DB_PASSWORD', 'redacted');
define('DB_NAME', 'redacted');
$link = mysqli_connect(DB_SERVER, DB_USERNAME, DB_PASSWORD, DB_NAME);
if($link === false){
    die("ERROR: Could not connect. " . mysqli_connect_error());
}
?> 

同样,我需要使用 PHPMailer 存储 SMTP 服务器的密码,我的解决方案是使用变量 $password 和 $username 制作一个 .php 文件,并包含该文件(位于 htaccess 文件夹中)以便连接到服务器。但是,这也让人感到不安全,但我无法找到解决方法。我主要担心的是用户可以简单地注入 php 代码并执行 echo $password 并显示 php 文件引用的变量。谁能指出我正确的方向? .htaccess 是一种在您的服务器上隐藏数据的安全方式吗?

htaccess/user-config.php:

$pass='somepassword';
$user='someuser';

htaccess 之外的 php 文件:

// for examples sake, I'll call the folder 'htaccess'
include htaccess/user-config.php

$mail = new PHPMailer();
$mail->Username = $user;
$mail->Password = $pass;

【问题讨论】:

  • 通常的建议是将持有凭证的此类文件存储在域根目录之上。 “我主要担心的是用户可以简单地注入 php 代码并执行 echo $password 并显示 php 文件引用的变量。” - 在这一点上几乎没有什么可以做的。如果人们可以在您的系统中执行他们自己的任意 PHP 代码,那么在大多数情况下已经为时已晚。
  • 但是将它存储在 htaccess 文件夹中会是一个安全问题吗?我的意思是,用户不应该能够访问或了解文件夹和其中的文件。这是准确的,还是我没有考虑其他因素?问候

标签: php mysql .htaccess nginx phpmailer


【解决方案1】:

避免使用 htaccess 的正确方法是将此类配置文件放在 web 根目录之外。这就是为什么大多数框架的 Web 根目录指向 public 文件夹,该文件夹包含静态资产(图像、CSS)和一个从 ../ 加载文件的 index.php,类似于:

- app
  - controllers
  - models
  - views
  - public    <-- web root
    - img
    - css
    index.php <-- app entry point
  config.php  <-- config outside web root

这解决了一个问题,但留下了您提到的另一个问题 - 公开系统配置变量。泄漏此信息的最常见方法是启用调试设置,其中堆栈跟踪和详细错误消息可以揭示很多 - 因此请确保您只在生产系统上显示一般错误消息,并使未经授权的登台或测试环境无法访问用户。您对能够“简单地注入”用户提供的 PHP 表达的担忧确实是一个问题,但这将代表您的应用程序中存在一个非常重大的远程代码执行 (RCE) 漏洞错误,并且凭据泄漏将是您的最小的担心。这就是为什么大多数框架结构事物以避免此类问题的原因。

使用.php 文件来存储配置信息的一个小优点是,如果直接访问它,它将运行 PHP(什么都不做也不产生输出)而不是显示文件的内容。这不适用于 .ini、JSON 或 yaml 文件。

避免在文件中包含配置的一种方法是通过环境变量传递它,但是,这些值最终仍会出现在 PHP 运行时环境中(最明显的是在 $_ENV 中,但在其他地方也是如此)。

最终,如果您将钥匙交给他人,这就像担心有人进入您的房子一样;解决办法是不要给他们钥匙。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-22
    • 1970-01-01
    • 2017-12-25
    • 1970-01-01
    • 1970-01-01
    • 2014-12-16
    • 2011-01-16
    相关资源
    最近更新 更多