当前在 PHP 中防止电子邮件注入攻击的最佳实践是啥?

Posted

技术标签:

【中文标题】当前在 PHP 中防止电子邮件注入攻击的最佳实践是啥?【英文标题】:What's current best practice to prevent email injection attacks in PHP?当前在 PHP 中防止电子邮件注入攻击的最佳实践是什么? 【发布时间】:2010-10-23 20:39:29 【问题描述】:

如今,从 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);

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

提前致谢!

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

我主要关心的不是垃圾邮件机器人获取此脚本,而是任何人利用它向me@example.com 以外的任何地址发送非法电子邮件。这可能包括一个机器人,但也可能是一个击败 CAPTCHA 测试的人。

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

【问题讨论】:

【参考方案1】:

我会这样做:

使用验证码; 如果主题或正文包含任何 html 标记,则发送失败。注意:我没有说把它们去掉。只是不要发送电子邮件并向用户提供错误消息原因。向自己发送经过过滤的垃圾邮件毫无意义。只是不要发送它; 去除任何高位或低位字符(filter_vars() 可以做到这一点); 将消息限制为 4000 个字符(或您选择的其他适当限制); 如果消息包含任何不指向当前站点的 URL,则失败; 可以使用How do you stop scripters from slamming your website hundreds of times a second? 中的一些技术来确保有人发送消息。

【讨论】:

> 最佳实践(恕我直言)是不要向 HTML 表单提供的电子邮件地址发送电子邮件。为了明确这一点,所提供的代码不会——或者至少不应该——向网站所有者以外的任何人发送电子邮件。该地址被硬编码到 PHP (me@example.com) 中。我要确保没有人劫持脚本,就像经典的 \ncc:victim@victim.com 向其他人发送垃圾邮件一样。感谢您的链接! :c)

以上是关于当前在 PHP 中防止电子邮件注入攻击的最佳实践是啥?的主要内容,如果未能解决你的问题,请参考以下文章

php中防止SQL注入,该如何解决?

如何防范sql注入攻击

如何防止 PHP 中的代码注入攻击?

PHP怎么防止sql注入

PHP 防止SQL注入攻击的方法。

PHP获取IP地址的方法,防止伪造IP地址注入攻击