在PHP中防止电子邮件注入攻击的当前最佳做法是什么?

时间:2009-05-05 08:43:25

标签: php email code-injection

现在最好的做法是如何从PHP电子邮件表单中清理数据?

我目前正在使用这样的东西......

$msg = $_POST['msg'];
$email = filter_var($_POST['email'], FILTER_VALIDATE_EMAIL);
$name = $_POST['name'];

$subject = "Message from the MY_WEBSITE website e-mail system";
$message = "From: " . $name . "\n";
$message .= "Email: " . $email . "\n\n";
$message .= $msg;
$headers = "From: " . $email . "\r\n" .
           "Reply-To: " . $email . "\r\n" .
           "X-Mailer: PHP/" . phpversion();

$mailSuccess = mail("me@example.com", $subject, $message, $headers);

以这种方式简单地过滤电子邮件字段是否足以提供保护?能否/我应该更有效地强化脚本以防止垃圾邮件发送者?

提前致谢!

[编辑]澄清,因为到目前为止的答案表明我没有很好地解释自己。

我并不主要关注获取此脚本的垃圾邮件程序,但是任何人利用它将非法电子邮件发送到除me@example.com以外的任何地址。这可能包括机器人,但同样可能是人类击败CAPTCHA测试。

我正在寻找的是PHP,它将确保mail()方法发送的电子邮件不会被劫持。这可能是一个正则表达式或过滤器或类似的,只是删除某些字符。再次感谢。[/编辑]

1 个答案:

答案 0 :(得分:2)

我会这样做:

  • 使用CAPTCHA;
  • 如果主题或正文包含任何HTML标记,则无法发送。注意:我没有说剥离它们。只是不发送电子邮件并向用户提供错误消息原因。向自己发送过滤后的垃圾邮件毫无意义。只是不发送它;
  • 删除任何高或低字符(filter_vars()可以执行此操作);
  • 将邮件限制为,例如,4000个字符(或您选择的其他适当限制);
  • 如果邮件包含任何未指向当前站点的URL,则
  • 会失败;
  • 可以说使用How do you stop scripters from slamming your website hundreds of times a second?中的一些技术来确保有人发送信息。