PHP 安全 E-mail 学习笔记

1. 邮箱安全

1.1 邮箱注入攻击

在使用邮箱发送功能时,如果不对输入的邮箱地址进行过滤和验证,可能会受到邮箱注入攻击。攻击者可以通过特定的输入,使得程序执行非预期的代码。

示例:

phpCopy Code
$email = $_POST['email']; $message = $_POST['message']; mail($email, 'Subject', $message);

如果用户在 email 字段中输入以下内容:

Copy Code
john.doe@example.com%0ACc:bobby@example.com

那么 $email 将会包含两个邮箱地址:

Copy Code
john.doe@example.com Cc:bobby@example.com

这样就会以 Cc:bobby@example.com 为抄送者,向 john.doe@example.com 发送邮件,这可能会导致信息泄露等安全问题。

为了避免此类问题,应该对输入内容进行过滤和验证,确保只有一个合法的邮箱地址被发送邮件。

1.2 垃圾邮件过滤

在使用邮件发送功能时,还需要注意垃圾邮件过滤。垃圾邮件过滤可以通过多种方式实现,其中常用的方式是基于黑名单和基于规则的过滤。

示例:

phpCopy Code
$email = $_POST['email']; $message = $_POST['message']; if (!filter_var($email, FILTER_VALIDATE_EMAIL)) { echo 'Invalid email address'; } elseif (preg_match('/(viagra|cialis)/i', $message)) { echo 'Message contains spam'; } else { mail($email, 'Subject', $message); }

在此示例中,使用 filter_var() 函数进行基本的邮箱地址验证。如果验证失败,则拒绝发送邮件。然后使用正则表达式检查邮件内容是否包含特定的垃圾邮件词语(如“viagra”或“cialis”)。如果包含,则拒绝发送邮件,否则发送邮件。

2. PHP 邮件发送函数

2.1 mail()

PHP 内置了 mail() 函数,可以用于发送电子邮件。其语法为:

phpCopy Code
mail(string $to, string $subject, string $message, ?string $additional_headers = null, ?string $additional_parameters = null): bool

其中,

  • $to:收件人地址;
  • $subject:邮件主题;
  • $message:邮件内容;
  • $additional_headers:可选的附加邮件头,如抄送、密送等;
  • $additional_parameters:可选的附加参数,如 SMTP 服务器地址等。

示例:

phpCopy Code
$to = 'john.doe@example.com'; $subject = 'Test email'; $message = 'This is a test email'; $headers = 'From: webmaster@example.com' . "\r\n" . 'Reply-To: webmaster@example.com' . "\r\n" . 'X-Mailer: PHP/' . phpversion(); mail($to, $subject, $message, $headers);

在此示例中,使用 mail() 函数发送电子邮件。从 $headers 变量中设置邮件头,包括发件人、回复地址等信息。

结语

通过本文的介绍,我们了解了 PHP 中邮件发送的基本知识和安全注意事项。在实际开发中,应该遵循安全规范和最佳实践,确保代码的质量和安全性。