【发布时间】:2014-09-22 06:02:41
【问题描述】:
我正在使用 mail() 函数在 php 中实现联系表单。在联系表单中,我询问用户的电子邮件地址,提交后我将他们的消息发送到我自己的电子邮件地址。
这是我的 php 代码:
$to = 'myemail@gmail.com';
$from_name = $_POST['InputName'];
$from_email = $_POST['InputEmail'];
$subject = 'Message from '.$from_name;
$message = $_POST['InputMessage'];
$headers = 'From: '.$from_email."\r\n".'Reply-To: '.$from_email.
"\r\n".'X-Mailer: PHP/'.phpversion();
$mailsuccess = mail($to,$subject,$message,$headers);
在对此进行测试后,我意识到有人可以向我发送一封伪装成其他人有效电子邮件地址的电子邮件。例如,在测试期间,我使用了朋友的电子邮件并给自己发了一条消息。这不是安全问题吗?在我的 gmail 帐户中,我确实收到了一条警告,指出这封电子邮件可能不是来自那个人,但如果不是明显垃圾邮件,我通常会忽略该警告。
例如,如果 Bob (bob@gmail.com) 通过伪装成 Chris (chris@gmail.com) 的联系表单发送消息,我将在电子邮件中回复 Chris。克里斯认为他的电子邮件被黑了,因为他从未发送过那封电子邮件。这通常是一个问题吗?或者有没有办法让它更安全?
【问题讨论】:
-
任何不需要登录的联系表单都会出现该问题,但您的代码确实存在其他问题
-
这是整个电子邮件中的一个巨大的普遍问题,一些 Webmail 客户端,例如
Roundcube让您拥有多个身份,每个身份都有自己的电子邮件地址,无论它是否真的属于您.有一些方法可以使用 DKIM 和其他方法来缓解这种情况,但通常并不完美,而且绝对不会出现在您的情况下;除非您添加某种Sign-in with Google功能并从 Google API 获取他们的电子邮件,否则您将拥有站点范围的登录和可信赖的电子邮件,显然只有 Google 会很愚蠢,+标准帐户需要验证电子邮件所有权。 -
另一种解决方案是给他们发送一封电子邮件,要求他们在发送邮件之前确认他们的地址。
-
更安全的方法是首先发送电子邮件至
chris@gmail.com要求他点击链接,如果事实上是他填写了联系表格,否则忽略联系请求。 -
@BaileyHerbert 比我早 13 秒哈哈