我想知道这段代码是否安全,
$mail = mail($_POST['email'], 'foo' , 'foo');
据报道RIPS不安全。
答案 0 :(得分: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为您做所有必要的输入消毒;它验证电子邮件地址并剥离恶意标头攻击,作为其标准流程的一部分。
希望有所帮助。
答案 1 :(得分:2)
当然,它不安全且易受邮件注入攻击。你为什么问?
SMTP协议非常简单,非常接近HTTP协议 它包含标题,每个标题由另一个新行分隔。 所以,让$ _POST ['email']等于
foo@example.com
To: bar@example.com
您的脚本将发送2封邮件 几乎每个论点都是如此,包括主题。
此外,就像在HTTP中一样,标题通过空行与正文分隔 因此,攻击者也可以重写正文
为了防止这种情况发生,只需检查用户输入的字段(当然是主体),\n
和\r
字符。
答案 2 :(得分:-1)
恶意用户无法注入邮件头,但他可以传递一长串漫长的逗号分隔电子邮件地址,并将您的服务用于垃圾邮件。
在使用函数(或任何你需要的函数)之前,你应该总是对用户输入数据进行检查!