【问题标题】:How can I improve my form? [closed]如何改进我的表格? [关闭]
【发布时间】:2012-09-14 06:04:43
【问题描述】:

目前,我们收到了大量垃圾邮件。我刚刚添加了以下行:

if ($field_budget == "" || $field_timeline == "" || $field_email == "" || $field_name == "") { echo "Please fill out all required form details, thank you!"; } else {

这帮助了几个星期,但现在垃圾邮件发送者又回来了。什么是改进我的表单的简单、优雅的方法(下面的完整代码)?

<?php
$field_name = $_POST['cf_name'];
$field_email = $_POST['cf_email'];
$field_website = $_POST['cf_website'];
$field_company = $_POST['cf_company'];
$field_budget = $_POST['cf_budget'];
$field_custombudget = $_POST['cf_custombudget'];
$field_timeline = $_POST['cf_timeline'];
$field_message = $_POST['cf_message'];

$mail_to = 'sean@seanduran.com';
$subject = 'Message from a site visitor, '.$field_name;

$body_message = 'Name: '.$field_name."\n";
$body_message .= 'e-mail: '.$field_email."\n";
$body_message .= 'Website: '.$field_website."\n";
$body_message .= 'Company: '.$field_company."\n";
$body_message .= 'Budget: '.$field_budget."\n";
$body_message .= 'Custom Budget: '.$field_custombudget."\n";
$body_message .= 'Timeline: '.$field_timeline."\n";
$body_message .= 'Message: '.$field_message;

$headers = 'From: '.$field_email."\r\n";
$headers .= 'Reply-To: '.$field_email."\r\n";

if ($field_budget == "" || $field_timeline == "" || $field_email == "" || $field_name == "") {
    echo "Please fill out all required form details, thank you!";
} else {
    $mail_status = mail($mail_to, $subject, $body_message, $headers);

    if ($mail_status) { ?>
        <script language="javascript" type="text/javascript">
            alert('Thank you for the message. We will contact you shortly.');
            window.location = 'http://seanduran.com';
        </script>
    <?php
    }
    else { ?>
        <script language="javascript" type="text/javascript">
            alert('Message failed. Please, send an email to sean@seanduran.com');
            window.location = 'http://seanduran.com';
        </script>
    <?php
    }
}
?>

【问题讨论】:

  • 在表单中使用验证码怎么样? ?
  • 重要的是,为了帮助阻止垃圾邮件发送者,请清理您的数据。您允许任何内容进入您的标题(并且您现在已经公开放置链接,因此您的首要任务是清理它。删除所有换行符注入标题。
  • 如何限制允许用户在标题中放置的内容?
  • “删除所有换行符注入标题”。还要检查无效(不可打印)字符、电子邮件地址的有效性(使用 PHP 验证函数)并检查长度 - 如果超过 100 个字符则拒绝。只需阻止任何人将 naster 标头注入您的标头即可。

标签: php forms


【解决方案1】:

你可以使用一个技巧--

插入一个文本字段,通过 CSS(id)隐藏它并检查它必须为空!

所有的垃圾邮件机器人都会用一些东西填充字段,所以只需给它一个名称“地址”之类的东西......

如果机器人填写,你可以报错...

其他提示只是使用ReCaptcha

【讨论】:

  • +1。我做同样的事情
  • 嗯,我想我可以试试看!我不想使用验证码,这可能是解决方案。
  • 然后一个聪明的机器人建造者会来看看那个领域并对他的机器人进行编程,这样它就不会再工作了。这是一个不错的短期解决方案。 ReCaptcha 是正确的解决方案。 +1。
  • 也这么想……工作起来更像是一种魅力
  • 这不是一个通用的解决方案,但适用于很多垃圾邮件机器人——正如我所提到的,recaptcha 是更安全的唯一方法。
【解决方案2】:

我会介绍一个验证码。垃圾邮件发送者也很擅长解决这些问题,但这是一个很好的附加措施。看看例如reCAPTCHA,添加起来应该不会太难(见instructions here)。

【讨论】:

    【解决方案3】:

    将您的姓名和电子邮件字段更改为:

    Name: <input type="text" name="cf_123" />
    Email: <input type="text" name="cf_456" />
    

    引用如下:

    $field_name  = $_POST['cf_123'];
    $field_email = $_POST['cf_456'];
    

    然后添加这些字段:

    <input type="text" name="name" class="foo" />
    <input type="text" name="email" class="foo" />
    

    .. 使用这个 CSS:

    .foo {
        display : none;
    }
    

    然后你可以简单地将这个条件添加到你的 PHP 中:

    if (!empty($_POST['name']) || !empty($_POST['email'])) {
        return false; // only a bot would see those fields and fill them out. 
    }
    

    【讨论】:

    • 自动完成功能不再起作用...
    • 自动完成功能也无法识别cf_name
    【解决方案4】:

    一般更改

    • 验证所有发布数据。检查标头注入
    • 验证码

    看看这篇文章作为一个好的开始:http://www.digital-web.com/articles/bulletproof_contact_form_with_php/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-29
      • 1970-01-01
      • 1970-01-01
      • 2017-06-12
      • 1970-01-01
      • 2013-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多