我想知道这段代码是否安全,
$mail = mail($_POST['email'], 'foo' , 'foo');
它被 RIPS 报告为不安全。
正如其他人已经说过的那样,mail($_POST['email']...)
在您开始考虑标头注入攻击之前,使用不安全有几个原因。
允许将 POST 变量用作“收件人”地址是不安全的,因为您的表单可用于向任何人发送邮件。即使垃圾邮件发送者无法将他们的消息放入正文中,它仍然可以通过向某人的邮箱发送数千条消息来攻击他们。
其次,您没有向我们展示您的$_POST['email']
变量是否已被清理。在将其用作电子邮件地址之前,您应该检查它是否是有效的电子邮件地址。否则,是的,它可能会被用来对您的邮寄者造成恶作剧。幸运的是,PHP 内置了电子邮件验证功能:
$sanitisedEmail = filter_var($_POST['email'], FILTER_VALIDATE_EMAIL);
if(!$sanitisedEmail) {die('your email address is invalid');}
但除此之外,如果你想避免头部注入攻击,你应该mail()
完全避免使用 PHP 的函数。内置mail()
功能非常基础,有许多可以被黑客利用的弱点。最好使用高质量的包装库,例如phpMailer。
phpMailer 的主要目的是使在 PHP 中发送电子邮件更加简单——mail()
如果您需要开始添加标题或附件,使用标准函数所需的 PHP 代码可能会变得非常混乱;phpMailer 使这一切变得非常简单。
但除此之外,使用它也会让你的代码更加安全;phpMailer 为您完成所有必要的输入清理;作为标准流程的一部分,它会验证电子邮件地址并去除恶意标头攻击。
希望有帮助。
Surely it's not secure and vulnerable to mail injection. Why do you ask?
SMTP protocol is very simple and very close to HTTP one.
It contains headers and each header separatted from another by a mere newline.
So, having $_POST['email'] equal to
foo@example.com
To: bar@example.com
your script will send 2 mails.
The same goes for almost every argument, including Subject.
Also, just like in HTTP, headers separated from the body by an empty line.
So, the attacker may also rewrite the body as well
To prevent that, just check user-entered fields ('cept for the body of course), for \n
and \r
characters.
恶意用户无法注入标头,但他可以传递一长串逗号分隔的电子邮件地址,并使用您的服务发送垃圾邮件。
在将用户输入数据用于函数(或任何您需要的东西)之前,您应该始终对它们进行检查!