【问题标题】:Securing a contact form script保护联系表单脚本
【发布时间】:2012-08-18 06:42:18
【问题描述】:

你好!我只是想知道我刚刚制作的这个联系人表单脚本有多安全?很久以前,当我制作联系表时,我的老师一直在唠叨我。

if($_SERVER['REQUEST_METHOD'] === 'POST'){

    $myemail  =    "email@adress.com";
    $name      =    $_POST['name'];
    $email    =    $_POST['email'];
    $phone    =    $_POST['phone'];
    $subject  =    $_POST['subject'];
    $comments =    $_POST['comments'];

   if($name == 0 || !preg_match("/([\w\-]+\@[\w\-]+\.[\w\-]+)/", $email) || !preg_match("/^\d{2}(-\d{3}){2}(\d{2})?$/", $phone) || $subject == 0 || $comments == 0){

       $error_message = 'Something was written wrong..';

   } else {

       $message = "Hello!
       Your contact form has been submitted by:
       Name: $name
       E-mail: $email
       Phone: $phone
       Comments: $comments
       End of message";
       mail($myemail, $subject, $message);
       $error_message = 'Your message was sent!';

    }
}

关于如何使其安全的任何建议?

附: Securing a Contact FormSecuring a php contact form 都适用于 WordPress,这不是我想要的。

【问题讨论】:

  • 你可能想在codereview.stackexchange.com上发帖
  • 似乎它容易受到邮件注入的影响,这意味着通过注入自定义标头和自定义正文通过您的服务器发送(垃圾邮件)邮件。可以通过去除主题中的 \r 和 \n 以及您未过滤到邮件标题中的所有其他内容来修复。
  • 也许老师指的是人类/机器人检查员,例如recaptcha
  • @DanielM 是这样的吗? $subject = "$_POST['subject']\r\n";
  • @Nworks:不,恰恰相反:$subject = str_replace(array("\r", "\n"), array('', ''), $subject); 你应该对这个主题进行一些研究才能理解这一点。

标签: php email contact-form secure-coding


【解决方案1】:

您可以使用函数来验证条目,例如:

function check_input($data)
 {
    $data = trim($data);
    $data = stripslashes($data);
    $data = htmlspecialchars($data);
    return $data;
 }

   

        $name      =    check_input($_POST['name']);
        $email    =    check_input($_POST['email']);
        $phone    =    check_input($_POST['phone']);
        $subject  =    check_input($_POST['subject']);
        $comments =    check_input($_POST['comments']);

     if ($name && $email && $phone && $subject && $comments) {
         Send contact form...

}

当然,您可以添加验证码以使其更安全。

【讨论】:

【解决方案2】:

除了缺乏数据验证之外,您的代码中没有什么不安全的地方。您只需收集表单数据并将其发送出去。所以唯一的“不安全感”是除非使用任何类型的验证码,否则您很容易通过该表单发送垃圾邮件。我目前不确定,但可能会欺骗 mail() 以使用精心制作的 $subject 添加更多收件人,因此可以保存以确保它是 oneliner 并剥离任何 CRLF

【讨论】:

  • 所以我必须使用验证码?剥离任何 CRLF 是什么意思?
  • 他的意思是我的意思。 CRLF = 回车/换行 (\r\n)。剥离它们意味着移除它们。
  • 我也强烈建议远离 mail() 并忘记它曾经存在过。它尽可能地愚蠢(如果你知道你需要它,这是一件好事 - 几乎从来没有这种情况)。有很多用于发送邮件的专用库可以通过构建邮件结构或处理附件或处理经过身份验证的 smtp 来解决许多这些问题,甚至不应该考虑使用 mail()。看看 PHP Mailer - 简单、漂亮且经过测试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-20
  • 1970-01-01
  • 2011-08-27
  • 2019-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多