Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/228.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何在没有验证码的情况下保护联系人表单?_Php_Forms - Fatal编程技术网

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

Php 如何在没有验证码的情况下保护联系人表单?,php,forms,Php,Forms,在我的网站上,我有两个表单,其中有人(未注册)可以向指定的注册用户发送消息。表单很简单,我希望保持这种方式。如果我不想使用任何验证码,保护联系人表单免受垃圾邮件和机器人攻击的最佳方法是什么 Your message:... Your e-mail:... [Send] 你可以做一些事情来证明用户是人类。如果你想保持简单,可以找一个字段问一个数学问题,比如“2+5”。但这并不像验证码那样安全。但是,如果可能的垃圾邮件没有破坏你,那么这样做是可以的。你可以从IP实施时间限制。因此,如果垃圾邮件机器

在我的网站上,我有两个表单,其中有人(未注册)可以向指定的注册用户发送消息。表单很简单,我希望保持这种方式。如果我不想使用任何验证码,保护联系人表单免受垃圾邮件和机器人攻击的最佳方法是什么

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

你可以做一些事情来证明用户是人类。如果你想保持简单,可以找一个字段问一个数学问题,比如“2+5”。但这并不像验证码那样安全。但是,如果可能的垃圾邮件没有破坏你,那么这样做是可以的。

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

您必须在服务器端通过检查和存储用户的IP来实现这一点。然后,当他们再次发送表单时,检查用户是否已经在被阻止的IP中

这也是20年前的情况。

因此选项:

  • 最大化查询/IP
  • 添加安全问题
  • 验证码(即使你不喜欢)
  • 正在发送电子邮件以验证它
  • 通过JavaScript提交数据
  • 这些细节和我对它们的看法

  • 它可以很好地防止发送许多消息,但它们的一些副本仍然会被接收。如果你认为这是负担得起的,这可能会奏效。注意:垃圾邮件发送者可以使用代理或dinamic IP,但这可能会很慢。也许考虑不要阻止用户,但是如果他们发送太多的电子邮件,增加一个CAPTCHA。
  • 这到底是什么?这些问题像“10+1”或“10+1”或“今天是哪一天?”。如果你的网站只使用很少几种语言,它们可能会很好地工作。CAPTCHA仍然更好,但在这种情况下效果很好
  • 你不喜欢,但我还是说这是最好的。添加一个reCAPTCHA并不难,但它可以阻止90%或更多的垃圾邮件发送者。但这有两个问题:1。有时候人类也看不懂,2。垃圾邮件发送者可以利用人来解决它的最低金额(如$0.001/验证码),有时他们会这样做。但这也代表了案例2
  • 这可能很好,但如果垃圾邮件发送者注意到这一点,他们可以生成随机电子邮件地址并通过SMTP进行验证。但他们通常会去最容易的目标然后离开
  • 很好,垃圾邮件发送者不能让机器人像点击一样,但他们可以制作代码,使点击成为非必需的。但最简单的目标规则仍然存在

  • 在我看来,最好的解决方案是解决方案3,然后是解决方案2,然后是解决方案1,然后是解决方案4和5。

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

  • 当向用户显示表单时,仅为该表单提交生成一个随机ID(“表单密钥”)。将表单键存储在会话变量中。在隐藏的输入字段中提交“表单密钥”
  • 在服务器端,对照会话变量中存储的表单密钥检查提交的表单密钥。使用后立即失效。(将其从会话中删除)
  • 如果没有验证码或类似的东西,就不可能真正保护表单免受滥用。

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

  • 通过HTTP请求每个表单提交的表单,以获得有效的唯一forkey
  • 解析DOM树/HTML代码以获取表单键
  • 以正确的格式提交
  • 此技术还可以防止表单多次意外提交

    下面是一个代码示例:

    <?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 } ?>
    
    在我看来,许多网站(售票员、像谷歌这样的主要网站以及其他目标网站除外)可以通过使用多种不同的技术组合,在没有验证码的情况下防止评论/形成垃圾邮件。我最近创建了一个开源PHP项目,它实现了以下测试,以确定提交的内容是否可能是合法的,或者是垃圾邮件

    • 隐藏表单字段-如果填写了隐藏表单字段,则表示垃圾邮件
    • 表单提交时间-如果表单填写过快或过慢,则表示存在垃圾邮件
    • URL过多-如果注释字段的URL过多(数量可配置),则表示垃圾邮件
    • 鼠标移动-如果用户不使用鼠标,则表示垃圾邮件
    • 使用过的键盘-如果用户不使用键盘,则表示垃圾邮件
    • 验证引用器-如果HTTP引用器与表单URL不匹配,我们不应该接受提交
    • 验证电子邮件-如果表单中提供的电子邮件地址从语法角度来看无效,我们不应接受提交
    这是该项目的URL。我喜欢上面Kaii的测试,这将是PHP保护的一个很好的附加测试。 使用:

    它基本上接受一个字符串(您的表单html在PHP中存储为字符串)并生成一块模糊的Javascript

    它可以帮助隐藏您用来保护表单安全的表单密钥,或者对所有机器人程序完全隐藏表单


    我从90年代开始使用它(上面链接处的页面显然至少有那么旧),我从来没有收到过表单垃圾邮件。

    检查服务器端和客户端是否有明确的验证,并创建邮件功能,不保存在数据库中保护什么?如果是垃圾邮件机器人,那么验证码的目的是区分机器人和人类,因此所有机器人保护机制都属于这个总括术语。相关:可能重复?为什么不?如果问题是以正确的形式提出的,它可能比克林贡语更清楚captcha@Alfabravo没错,我经常很难阅读capthcas(是的,我指的是你,StackOverflow)。一张有破损字母的图片是sooo 2006。一些脚本可以捕获文本并解决问题,这就是我为什么指出它的原因。谢谢,这非常有用。我想我会先关注第4点,然后关注第1点。谢谢。这很好