【发布时间】:2015-10-16 01:31:04
【问题描述】:
我的网站上有一个联系表单,它将用户姓名、电子邮件地址、主题和消息的帖子值提交给使用 phpmailer 发送电子邮件的函数。使用 strip_tags 是否足以使此表单安全?我还没有实现。
function sendEmail($mail, $to, $subject, $senderName, $from, $message) {
if((!empty($to)) && (!empty($subject)) && (!empty($senderName)) && (!empty($from)) && (!empty($message))) {
$mail->isSMTP(); // Set mailer to use SMTP
$mail->Host = '[REDACTED]'; // Specify main and backup SMTP servers
$mail->SMTPAuth = true; // Enable SMTP authentication
$mail->Username = '[REDACTED]'; // SMTP username
$mail->Password = '[REDACTED]'; // SMTP password
$mail->SMTPSecure = 'tls'; // Enable TLS encryption, `ssl` also accepted
$mail->Port = 587; // TCP port to connect to
$mail->setFrom($from, $senderName); //
$mail->addAddress('[REDACTED]', '[REDACTED]'); // Add a recipient. Hardcoded email address
$mail->addReplyTo($from, $senderName);
$mail->Subject = $subject;
$mail->Body = "<h1>You've received a message through the contact form at chriscomposes.com</h1><br><br>" . $message;
$mail->AltBody = "You've received a message through the contact form at chriscomposes.com." . $message;
if(!$mail->send()) {
return "<p style='margin-left: 5px; color: red;'>Message failed to send.</p>";
} else {
return "<p style='margin-left: 5px; color: green;'>Message has been sent.</p>";
}
} else {
return "<p style='margin-left: 5px; color: red;'>One or more fields are empty. Please enter a subject, name, email address, and message.</p>";
}
}
^ 那就是它运行的函数。使用硬编码的电子邮件地址,我认为使用表单发送电子邮件的人不会容易受到攻击。另一个问题是接收地址的用户很容易受到插入到电子邮件中的 javascript 的攻击。
然后它发布:sendEmail($mail, $contactEmail, $_POST['subject'], $_POST['sender_name'], $_POST['sender_email'], $_POST['body']);,其中 $contactEmail 是从我的数据库中提取的地址。然后该函数使用 phpmailer 发送电子邮件地址。
【问题讨论】:
-
是否有任何用户输入?
-
你应该发布过滤消息的任何代码,你提到 strip_tags 但不要显示它。
-
我不知道任何运行 javascript 的电子邮件客户端,因此 XSS 不适用,除非您还在“感谢”页面上重新显示提交的内容。不要将提交者的电子邮件地址用作
from地址,因为这会使您无法通过 SPF 检查;把它放在reply-to中。你为什么要传入$mail实例?看起来将它作为本地静态可能会更好,或者您需要小心在调用之间清除收件人。 -
$mail 变量在函数范围之外,如果您不传递邮件对象,它会引发服务器错误。感谢您提供有关 SPF 检查的提示。这真的很有用。将其设置为 webmaster@mydomain.com 并将名称设置为 mydomain.com 是否有效。或者只是将电子邮件地址设置为 webmaster@mydomain.com,名称可以是发送邮件的人的姓名?
标签: php security phpmailer contact-form