如何在HTML文件中运行的PHP代码中隐藏电子邮件帐户密码?

如何在HTML文件中运行的PHP代码中隐藏电子邮件帐户密码?,php,html,.htaccess,phpmailer,Php,Html,.htaccess,Phpmailer,我在我的网站上编辑了.htaccess文件,并使PHP代码能够在HTML文件中运行 一切正常,但不知何故,服务器上的.htaccess文件被重新更改,HTML从PHP处理程序列表中删除 这不仅破坏了网站的功能,而且在查看联系人页面的源代码时,您可以看到电子邮件帐户密码,我将其添加到用于联系人表单的PHP Mailer的PHP代码中 我如何保护密码,以防类似情况再次发生?我对PHP比较陌生,不知道是否有什么聪明的方法可以做到这一点,比如可能只有在PHP正常运行的情况下才从外部文件中输入密码?将文件

我在我的网站上编辑了.htaccess文件,并使PHP代码能够在HTML文件中运行

一切正常,但不知何故,服务器上的.htaccess文件被重新更改,HTML从PHP处理程序列表中删除

这不仅破坏了网站的功能,而且在查看联系人页面的源代码时,您可以看到电子邮件帐户密码,我将其添加到用于联系人表单的PHP Mailer的PHP代码中


我如何保护密码,以防类似情况再次发生?我对PHP比较陌生,不知道是否有什么聪明的方法可以做到这一点,比如可能只有在PHP正常运行的情况下才从外部文件中输入密码?

将文件保存在文档根目录的外部


然后
include()
it.

是的,在外部文件中保守秘密是您所需要的。正如其他人提到的,将此文件保持在web根目录之外也很重要,这样就没有指向它的直接URL。在PHP中,最流行的方法是使用。其思想是将所有机密存储在项目根目录下的
.env
文件中,但通常通过确保
.gitignore
文件将其排除,来确保此文件不会保存在git repo中。所以你可能会得到这样一个结构:

/var/www/my_site <- your project root on your server
    app/ <- project files
    vendor/ <- dependencies
    public/ <- web root
        index.php <- default entry point for your app
    .env <- config and secrets, note is *outside* web root
EMAIL_USERNAME = me@example.com
EMAIL_PASSWORD = supersecret
$mail->Username = env('EMAIL_USERNAME');
$mail->Password = env('EMAIL_PASSWORD');
要获取这些值,请使用dotenv的
env()
global函数,如下所示:

/var/www/my_site <- your project root on your server
    app/ <- project files
    vendor/ <- dependencies
    public/ <- web root
        index.php <- default entry point for your app
    .env <- config and secrets, note is *outside* web root
EMAIL_USERNAME = me@example.com
EMAIL_PASSWORD = supersecret
$mail->Username = env('EMAIL_USERNAME');
$mail->Password = env('EMAIL_PASSWORD');
当然,您可以将其用于许多事情,例如数据库凭据、外部服务的身份验证密钥、应用程序名称等

在git repo中包含一个文件(通常称为
.env.dist
example.env
)是非常常见的,该文件包含您在real
.env
文件中使用的结构和变量名,而实际上不包含秘密本身,只是:

EMAIL_USERNAME =
EMAIL_PASSWORD =
这使得您可以很容易地看到,如果您正在进行新的安装,您需要填写哪些值

为了保护您的秘密,您还需要做其他事情:

  • 将web服务器配置为拒绝提供以
    .env
  • 确保在生产中禁用所有调试输出(例如,如果您执行了
    var\u转储($mail)
    ,则会显示您的电子邮件密码)

在应用程序之外还有其他保密方式,例如通过真实的系统环境变量,但dotenv可能是您所需要的一切。

什么是“文档根目录之外”?联系人页面位于网站“mysite.com”的根目录中。那么,我将把要包含的文件放在哪里呢?这是一个很好的建议,只要没有有效的open_basedir限制。关于共享主机。你能解释一下吗?我不明白。另外,我应该将带有SMTP设置的部分PHP代码存储在一个.PHP文件中,还是只将密码存储在一个文本文件中?大多数主机都将域的根设置为指向名为
public\u html
或类似目录(称为文档根目录)的目录,但是您可以访问高于此级别的文件夹-即“文档根目录之外”。请向我们展示php代码作为示例。也许您的提供商更新了PHP版本,并且禁用了。不要依赖PHP处理的.html文件。确保您的所有文件都是.php,如果您坚持在最后使用.html,请使用服务器重写。首先,为什么您需要在php脚本中存储密码?@Systix,我不相信在我使用时,short_open_标记被禁用,而且它正在工作。@Lawrencerone,除了我遇到的安全风险之外,PHP处理的HTML文件还有其他问题吗?谢谢你的建议。我一直在尝试,但我被卡住了。我对PHP非常陌生,我没有使用git回购。我刚刚使用VisualStudio代码为我的网站创建了PHP文件,并通过ftp将它们上传到我的共享托管空间。我要求托管公司安装他们已经安装的phpdotenv,我可以看到一个子文件夹vendor\vlucas\phpdotenv。我的托管空间的结构是:Home/public\u html/mysite.com/,我在主文件夹中创建了一个名为“.env”的文件,并插入以下行:EMAIL\u USERNAME=me@example.comEMAIL_PASSWORD=supersecreta,然后我创建了一个PHP文件:Home/public_html/mysite.com/test-env.PHP,并将此代码放入其中:但它给出了一个内部服务器错误。在PHP文件中,VSCode在第2行的文本“Dotenv\Dotenv”下加了下划线,表示“未定义类型”。我做错了什么?这真的是一个单独的问题。您不必使用git,但这并不妨碍您使用composer。在本地运行,并将
供应商
与其他文件一起上载。通过dotenv的
env()
函数获取值,而不是从
$\u env
获取值。VS代码将有一个composer插件来帮助您。