【问题标题】:two question about phpMailer security when hosting my app?托管我的应用程序时有关 phpMailer 安全性的两个问题?
【发布时间】:2021-08-06 17:18:57
【问题描述】:

目前我正在使用 phpMailer 在表单提交中向我的 Gmail 帐户发送电子邮件。我用于发送电子邮件的代码类似于以下代码:

###################
/* sendeng email */
###################
use phpMailer\PHPMailer\PHPMailer;
if ($sehat === true) {
    require_once "../phpMailer/PHPMailer.php";
    require_once "../phpMailer/SMTP.php";
    require_once "../phpMailer/Exception.php";

    $mail = new PHPMailer();

    //smtp settings
    $mail->isSMTP();
    $mail->Host = "smtp.gmail.com";
    $mail->SMTPAuth = true;
    $mail->Username = "myGmail@gmail.com";
    $mail->Password = 'myPassword';
    $mail->Port = 465;
    $mail->SMTPSecure = "ssl";

    //email settings
    $mail->isHTML(true);
    $mail->setFrom($commEmail, $commName);
    $mail->addAddress("myGmail@gmail.com");
    $mail->Subject = ("$commEmail ($commTopic)");
    $mail->Body = "<div style='text-align:right; direction:rtl;'>" . nl2br(strip_tags($commMess)) . "</div>";
    // $mail->Body = nl2br(strip_tags($commMess));
    // $mail->AltBody = nl2br(strip_tags($commMess));
    // $mail->Body = $commMess;
    /* for other language messages */
    $mail->CharSet = 'UTF-8';

    if($mail->send()){
        $status = "success";
        $response = "Email is sent!";
    }
    else
    {
        $status = "failed";
        $response = "Something is wrong: <br>" . $mail->ErrorInfo;
    }

    exit(json_encode(array("status" => $status, "response" => $response)));
}

我在发送电子邮件方面没有任何问题。但我的第一个问题是我在代码中使用$mail-&gt;Password = 'myPassword'; 的位置。实际上,我正在本地主机(WAMPSERVER)上编写和调试代码,并且我在代码中使用了我的真实密码而不是 myPassword。但是在完成应用程序后,我将把它托管到一个真实的服务器上(部署我的应用程序)。我的问题是,使用此代码,host provider 可以访问我的 Gmail 密码吗?如果是这样,解决方案是什么?是 phpMailer 中的错误还是我错了?

第二个的问题是,当我想将表单数据发送到我的Gmail帐户时,我必须将我的Gmail的设置更改为“较低的安全性”在此本地主机版本。如果我部署我的应用程序并且它可以在线使用,我必须再次这样做(Gmail 的安全性较低)还是有更好的方法?因为现在当我将 Gmail 安全设置返回到 正常 状态时,phpMailer 不会发送数据。

【问题讨论】:

  • 服务器可以做的任何事情,任何控制服务器的人也可以做。如果您的服务器在必要时可以通过 Gmail 发送电子邮件并且它需要密码才能这样做,那么管理服务器的主机提供商也可以根据需要这样做。
  • 如果您的网络服务器没有您的凭据,它应该如何使用 Gmail 发送邮件?
  • @Nico Haase 感谢您的评论,我对托管问题不是很熟悉,所以我想也许我可以为这个问题做点什么,但是降低 Gmail 安全设置怎么样?在线版有必要吗?
  • 您还应该使用他们的 API 发送电子邮件,而不是将帐户设置为“较低的安全性”。该标志通常会偶尔恢复一次(他们正在推动人们使用他们的 API 而不是通过 SMTP 发送)。使用他们的 API,您可以获得该应用程序的特定凭据,您可以轻松删除这些凭据,而无需修改您的帐户凭据(绝不应与任何人共享或放在任何服务器上)

标签: php security localhost phpmailer web-deployment


【解决方案1】:

一般来说,您需要能够信任您的主机,但有一个步骤可以帮助您避免所有这意味着:使用 XOAUTH2 进行身份验证。

通过这种机制,您不必在服务器上存储真实的 ID 和密码;您需要在一次性操作中使用它们以获得可以限制为 gmail 操作的令牌。有code examples provided with PHPMailer,还有a utility script you can use to obtain your auth tokena wiki article to help you configure it(尽管它可以使用更新;欢迎贡献)。但是,请注意,使用 OAuth 通常是一种复杂且令人不快的体验,其中包含许多可能将事情搞砸的方式。在这个用例中,它确实提供了安全性增强,因为这意味着您不必将真实的 Google 凭据留在周围。

一个谨慎的托管服务提供商将允许您加密虚拟机的磁盘映像,这意味着他们无法从虚拟机管理程序中读取您的数据,并且如果他们也没有对您的实例的 SSH 访问权限,那么您的数据应该是受到很好的保护。

【讨论】:

  • 感谢您的回答。在部署我的应用程序之前我需要学习很多东西!!!关于您的最后一个提示(区分大小写),我认为第一个 "phpMailer" 是库代码所在的文件夹的名称。我错了吗?如果不是,我用小写“p”而不是“P”来调用那个文件夹。
  • 不,您混淆了命名空间和文件夹名称; use 语句不是文件夹名称,它们是命名空间类和函数的本地别名。如果您是 PHP 新手,那么您应该做的第一件事就是学习使用 Composer。它没有那么复杂,一旦你弄清楚了,你就不想没有它。
  • 那么为什么代码正在运行并且没有给我任何错误?
  • 这是一个很好的问题——所以我查了一下,结果是I was completely wrong!命名空间区分大小写,这就是您没有收到错误的原因;我从来没有想过它们不是,因为变量和属性是!我将从我的答案中删除该注释,以免将来尴尬...无论如何,它们与您的文件夹名称仍然没什么关系。
【解决方案2】:

我的问题是,使用此代码,主机提供商可以访问我的 Gmail 密码吗?

是的。

如果是这样,解决办法是什么?

不要使用您不信任的主机。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多