2013-02-22 34 views
0

我在想,如果这个代码是安全与否,

$mail = mail($_POST['email'], 'foo' , 'foo'); 

据报道,为不安全的乡郊。

+1

你基本上可以发送邮件给你的服务器的任何人。它可以被垃圾邮件发送者滥用。 – 2013-02-22 14:40:20

+1

将$ _POST放入任何东西都不是明智的选择,请始终清理您的输入! – Drewdin 2013-02-22 14:40:25

+2

当引用安全公告时,请链接到它或引用它。它永远不会包含“这是不安全的”,而是确切描述问题是什么以及它出现在哪个版本的语言中。 – 2013-02-22 14:41:25

回答

2

当然,它不安全,容易受到邮件注入。你为什么要问?

SMTP协议非常简单,非常接近HTTP协议。
它包含标题和每个标题分隔另一个仅仅换行。 因此,有$ _ POST [ '电子邮件']等于

[email protected] 
To: [email protected] 

你的脚本将发送2个邮件。
几乎每个参数都是一样的,包括主题。

此外,就像在HTTP中一样,标头通过空行与正文分开。
因此,攻击者也可能改写体以及

为了防止这种情况,只需要检查用户输入的字段(当然身体CEPT),用于\n\r字符。

+0

对不起,我的糟糕解释,我只是有兴趣在头注入:PHP的santize $反对头注入? – user1700840 2013-02-22 15:21:25

-1

恶意用户无法注入头文件,但他可以传递一个长长的逗号分隔的电子邮件地址并使用您的服务进行垃圾邮件。

在使用函数(或任何您需要的)之前,您应该始终对用户输入数据执行检查!

3

正如其他人已经说过,使用mail($_POST['email']...)是不安全的,有几个原因,你甚至开始考虑头注入攻击。

允许将POST变量用作'收件人'地址是不安全的,因为您的表单可能用于将邮件发送给任何人。即使垃圾邮件发送者无法将其消息发送到正文中,也可以通过用数千条消息来爆炸他们的邮箱来攻击他人。其次,你没有告诉我们你的$_POST['email']变量是否已经过消毒处理。在使用它作为一个之前,你应该检查它是一个有效的电子邮件地址。否则,是的,它可能会导致你的邮件恶作剧。幸运的是,PHP有一个内置的电子邮件验证功能:

$sanitisedEmail = filter_var($_POST['email'], FILTER_VALIDATE_EMAIL); 
if(!$sanitisedEmail) {die('your email address is invalid');} 

但是,除了别的,如果你想避免头注入攻击,你应该避免使用PHP的mail()功能完全。内置的mail()函数是非常基础的,并且有很多可以被黑客利用的弱点。你会是使用优质包装库如phpMailer更好。

phpMailer的主要目的是使发送电子邮件更简单的PHP - 使用标准mail()函数所需的PHP代码可以变得非常混乱,如果你需要开始添加标头或附件; phpMailer使这一切非常简单。

但此外,使用它还会使您的代码更安全; phpMailer为你做所有必要的输入消毒;它会验证电子邮件地址并将恶意标头攻击作为其标准过程的一部分。

希望有所帮助。