如何在没有验证码的情况下保护联系表格?

时间:2012-03-01 12:51:23

标签: php forms

在我的网站上,我有几种形式,其中有人(没有注册)可以向指定的注册用户发送消息。形式很简单,我想保持这种方式。如果我不想使用任何验证码,保护联系表格的最佳方式是垃圾邮件和机器人?

Your message:...
Your e-mail:...
[Send]

6 个答案:

答案 0 :(得分:7)

所以选项:

  1. 最大化查询/ IP
  2. 添加安全问题
  3. Captcha (即使你不喜欢它)
  4. 发送电子邮件进行验证
  5. 通过JavaScript提交数据
  6. 有关这些以及我对他们的看法的详情。

    1. 它可以很好地防止发送许多消息,但是它们的一些副本仍然可以进入。如果你认为这是可以承受的,这可能会有效。注意:垃圾邮件发送者可以使用代理或dinamic IP,但这可能会很慢。也许考虑不阻止用户,但如果他们发送太多电子邮件则添加验证码。
    2. 究竟是什么?这些是诸如“10 + 1”或“10加1”或“它是哪一天?”之类的问题。他们可能会运作良好 - 如果您的网站只有很少的语言。 Captchas仍然更好,但这种情况很好。
    3. 你不喜欢它,但我仍然说它是最好的。添加一个reCAPTCHA并不是那么难,但它会阻止90%的垃圾邮件发送者 - 或更多。但是这有两个问题:1。有时候人类也无法阅读它.2。垃圾邮件发送者可以使用人来解决它的最低限度(例如0.001美元/验证码)数量,有时也可以。但这也代表了案例2.
    4. 可能会很好,但如果垃圾邮件发送者注意到这一点,他们可以生成随机电子邮件地址并通过SMTP验证它。但他们通常会去最容易的目标并离开。
    5. 好,垃圾邮件发送者不能让机器人像点击一样,但他们可以制作使点击不需要的代码。但最简单的目标规则仍然存在。
    6. 在我看来,最好的是解决方案3,然后是解决方案2,然后是解决方案1,然后是解决方案4和5.

答案 1 :(得分:7)

在我看来,许多网站(除了门票销售商,谷歌等主要网站以及其他将被定位的网站)可以通过组合使用多种不同的技术来阻止评论/形式垃圾邮件而无需验证码。我最近创建了一个开源PHP项目,它实现了以下测试,以确定提交是否合法或垃圾邮件。

  • 隐藏表单字段 - 如果填写了隐藏表单字段,则表示垃圾邮件
  • 时间表提交 - 如果表单填写过快或过慢,则表示垃圾邮件
  • 网址过多 - 如果评论字段包含太多网址(数字可配置),则表示垃圾邮件
  • 鼠标移动 - 如果用户不使用鼠标,则表示垃圾邮件
  • 二手键盘 - 如果用户不使用键盘,则表示垃圾邮件
  • 验证引用者 - 如果HTTP引用者与表单URL不匹配,我们不应接受提交。
  • 验证电子邮件 - 如果表单中提供的电子邮件地址从语法角度来看无效,我们不应接受提交。

这是项目的URL。我喜欢上面的Kaii测试,会为phpFormProtect做一个很好的额外测试。 https://github.com/mccarthy/phpFormProtect

答案 2 :(得分:6)

您可以使用表单键技术保护表单:

  1. 向用户显示表单时,只为此单个表单提交生成随机ID(“表单键”)。将表单键存储在会话变量中。在隐藏的输入字段中提交“表单密钥”。
  2. 在提交方面,检查提交的表单密钥与存储在会话变量中的密钥。使用后立即使其无效。 (从会话中删除)
  3. 如果没有验证码或类似的东西,就不可能真正保护表单免受滥用。

    然而,使用这种技术的恶意垃圾邮件发送者必须

    1. 通过HTTP为每个单一表单提交请求表单以获取有效的唯一forkey
    2. 解析DOM树/ HTML代码以获取表单密钥
    3. 以正确的格式提交
    4. 据我所知,没有自动垃圾邮件联系表单抓取工具。

      此技术还可以保护您的表单免受多次意外提交。

      这是一个代码示例:

      <?php
      session_start();
      if (isset($_POST['form_submit'])) {
        // do stuff
        if (isset($_POST['formkey']) && isset($_SESSION['formkeys'][$_POST['formkey']])) {
          echo "valid, doing stuff now ... "; flush();
          // delete formkey from session
          unset($_SESSION['formkeys'][$_POST['formkey']]);
          // release session early - after committing the session data is read-only
          session_write_close();
          // do whatever you like with the form data here
          send_contact_mail($_POST);
        }
        else {
          echo "request invalid or timed out.";
        }
      }
      else {
        // show form with formkey
        $formkey = md5("foo".microtime().rand(1,999999));
        // put current formkey into list of valid form keys for the user session
        if (!is_array($_SESSION['formkeys']) {
          $_SESSION['formkeys'] = array();
        ]
        $_SESSION['formkeys'][$formkey] = now();
      ?>
      <html>
      <head><title>form key</title></head>
      <body>
        <form method="POST">
          <input type="hidden" name="PHPSESSID" value="<?=session_id()?>">
          <input type="text" name="formkey" 
            value="<?= $formkey ?>">
          <input type="submit" name="form_submit" value="Contact us!">
        </form>
      </body>
      </html>
      <?php } ?>
      

答案 3 :(得分:1)

您可以从IP实施时间限制。因此,如果垃圾邮件机器人试图一次又一次地发送表单(在特定的时间间隔内,例如1小时),则应拒绝该请求。

您必须通过检查和存储用户的IP来在服务器端执行此操作。然后,当他们再次发送表单时,检查用户是否已暂时处于被阻止的IP中。

这也是StackOverflow implemented 2年前的事。

答案 4 :(得分:0)

你可以做点什么来证明用户是人。如果你想保持简单,可能是一个问一个数学问题的字段,例如“2 + 5?”。但这不像验证码那么安全。但是,如果可能的垃圾邮件没有让你烦恼,那就可以了。

答案 5 :(得分:0)

使用:iScramble

基本上,它需要一个字符串(将您的html形式的HTML作为字符串存储在PHP中),并生成一个模糊的Javascript块。

它可以帮助隐藏用于保护表单的那些表单密钥,或者完全对机器人完全隐藏表单。

自90年代以来,我一直在使用它(上面链接的页面显然至少很旧),而且我从未收到过垃圾邮件。