【问题标题】:How to get the "really simple captcha" to work in a simple contact form?如何让“真正简单的验证码”在简单的联系表格中工作?
【发布时间】:2014-01-21 14:58:21
【问题描述】:

我尝试根据this tutorial创建一个简单的联系表格

为避免垃圾邮件攻击,我尝试将该联系表与 really simple captcha plugin. 结合使用

使用以下代码,我可以在我的任何页面中使用简码 [contact],并且表单正在显示,但是在检查验证码时出现问题。

这是插件的代码:

function wptuts_get_the_ip() {
    if (isset($_SERVER["HTTP_X_FORWARDED_FOR"])) {
        return $_SERVER["HTTP_X_FORWARDED_FOR"];
    }
    elseif (isset($_SERVER["HTTP_CLIENT_IP"])) {
        return $_SERVER["HTTP_CLIENT_IP"];
    }
    else {
        return $_SERVER["REMOTE_ADDR"];
    }
}
// short code function 
function wptuts_contact_form_sc( $atts ) {     
add_shortcode( 'contact', 'contact_form_shortcode' );

   extract(shortcode_atts(array(
        "email" => get_bloginfo('admin_email'),
        "subject" => '',
        "label_name" => 'Your Name',
        "label_email" => 'Your E-mail Address',
        "label_subject" => 'Your Answer',
        "label_captcha" => 'Captcha',
        "label_submit" => 'Submit',
        "error_empty" => 'Please fill in all the required fields.',
        "error_noemail" => 'Please enter a valid e-mail address.',
        "success" => 'Thanks for your e-mail! We\'ll get back to you as soon as we can.'
    ), $atts));

    $captcha_instance = new ReallySimpleCaptcha(); //imports really simple captcha plugin
    $word = $captcha_instance->generate_random_word();
    $prefix = mt_rand();
    $image= $captcha_instance->generate_image( $prefix, $word );

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

        $error = false;
        $required_fields = array("your_name", "email", "captcha", "subject");

        foreach ($_POST as $field => $value) {
            if (get_magic_quotes_gpc()) {
                $value = stripslashes($value);
            }
            $form_data[$field] = strip_tags($value);
        }

        foreach ($required_fields as $required_field) {
            $value = trim($form_data[$required_field]);
            if(empty($value)) {
                $error = true;
                $result = $error_empty;
            }
        }

        if(!is_email($form_data['email'])) {
            $error = true;
            $result = $error_noemail;
        }

        if ($error == false) {

            $captcha_text=$form_data['captcha'];                
            $correct = $captcha_instance->check( $prefix, $captcha_text );

            if($correct==TRUE){

                $email_subject = "[" . get_bloginfo('name') . "] " . $form_data['subject'];
                $email_message = $form_data['captcha'] . "\n\nIP: " . wptuts_get_the_ip();
                $headers  = "From: ".$form_data['your_name']." <".$form_data['email'].">\n";
                $headers .= "Content-Type: text/plain; charset=UTF-8\n";
                $headers .= "Content-Transfer-Encoding: 8bit\n";
                wp_mail($email, $email_subject, $email_message, $headers);
                $result = $success;
                $sent = true;
            }
        }
    }

    if($result != "") {
        $info = '<div class="info">'.$result.'</div>';        
    }

    $email_form = '<form class="contact-form" method="post" action="'.get_permalink().'">
        <div>
            <label for="cf_name">'.$label_name.':</label>
            <input type="text" name="your_name" id="cf_name" size="50" maxlength="50" value="'.$form_data['your_name'].'" />
        </div>
        <div>
            <label for="cf_email">'.$label_email.':</label>
            <input type="text" name="email" id="cf_email" size="50" maxlength="50" value="'.$form_data['email'].'" />
        </div>
        <div>
            <label for="cf_subject">'.$label_subject.':</label>
            <input type="text" name="subject" id="cf_subject" size="50" maxlength="50" value="'.$subject.$form_data['subject'].'" />
        </div>
        <div>
            <label for="cf_message">'.$label_captcha.':</label>
            <input type="text" name="captcha" id="cf_message" size="50" maxlength="50" value=""/>
        </div>
        <div id="captcha"><span id="captcha_text">Captcha:</span><img id="captcha_image" src="'.plugins_url("really-simple-captcha/tmp/" . $image) . '" alt="" /></div>
        <div>
            <input type="submit" value="'.$label_submit.'" name="send" id="cf_send" />
        </div>

    </form>';

    if($sent == true) {
        return $info;
    } else {
        return $info.$email_form;
    }
} 
add_shortcode('contact', 'wptuts_contact_form_sc');

// add plugins style to frontend
function prize_game_contact_form() {
wp_register_style('prize_game_contact_form', plugins_url('css/style.css',__FILE__));
wp_enqueue_style('prize_game_contact_form');
}
add_action('wp_enqueue_scripts', 'prize_game_contact_form');

到目前为止,我没有添加 $captcha_instance-&gt;remove( $prefix );,因为它不能正常工作。似乎每次我单击提交按钮时都会创建一个新词,并且函数$captcha_instance-&gt;check() 检查新词是否等于输入字段中的验证码文本,但这些词当然不匹配,因为它已经是一个新词.我不明白为什么单击提交按钮时会创建一个新单词。哪里出错了?

【问题讨论】:

    标签: wordpress forms plugins captcha


    【解决方案1】:

    我认为问题在于每次函数运行时都会生成一个新的$prefix。因此无法运行check()remove(),因为表单上使用的$prefix 是一个新值。

    在您的表单中,使用正在使用的$prefix 的值创建一个隐藏输入字段。因此,该值与表单一起发布。在表单发布后第二次运行该函数时,使用发布的$prefix 值来执行check()remove()。应该这样做。

    这是一篇关于如何将真正简单的验证码插件与我刚才提到的隐藏前缀字段一起集成到您的插件或主题中的详细文章:http://www.lost-in-code.com/platforms/wordpress/wordpress-plugins/wordpress-using-really-simple-captcha/

    如果您需要任何帮助,请随时告诉我。

    【讨论】:

    • 谢谢,没有测试它,因为那是一个旧项目,但我想这会起作用。
    【解决方案2】:

    您在使用 Wordpress 吗?不要试图重新发明轮子。

    下载像Contact Form 7 这样的免费插件,其中包括一个Ajax 驱动(不需要刷新页面)Askimet 垃圾邮件过滤器,以及验证码系统。

    • CAPTCHA 的效果只有 3-5 年前的一半。

    我给你的建议是:

    • 不要寻求简单,而要寻找有效的方法。

    【讨论】:

    • 感谢您的建议。我已经知道 Contact Form 7 并且确实 - 这是一个很好的插件。但是我想创建我自己的具有一些特殊功能的插件,我只是认为创建一个新的简单插件比修改复杂的联系表格 7 插件更容易。而且我什至不知道是否允许修改 cf7 脚本,所以我不得不尝试 ;)
    【解决方案3】:

    如果您不使用 WordPress,那么您可以查看此simple form & captcha idea - 如果您能找出验证码部分,即验证码已变得非常复杂且过度设计,而它需要做的只是区分人类并且在大多数情况下都是非人类的。

    【讨论】:

      【解决方案4】:

      只有在检查用户答案的​​正确性后,您才必须创建变量 $word、$prefix 和 $image,并且您必须通过隐藏的输入字段传递 $prefix 值。我还没有检查过,但是这段代码现在应该可以工作了:

      function wptuts_get_the_ip() {
          if (isset($_SERVER["HTTP_X_FORWARDED_FOR"])) {
              return $_SERVER["HTTP_X_FORWARDED_FOR"];
          }
          elseif (isset($_SERVER["HTTP_CLIENT_IP"])) {
              return $_SERVER["HTTP_CLIENT_IP"];
          }
          else {
              return $_SERVER["REMOTE_ADDR"];
          }
      }
      // short code function 
      function wptuts_contact_form_sc( $atts ) {     
      add_shortcode( 'contact', 'contact_form_shortcode' );
      
         extract(shortcode_atts(array(
              "email" => get_bloginfo('admin_email'),
              "subject" => '',
              "label_name" => 'Your Name',
              "label_email" => 'Your E-mail Address',
              "label_subject" => 'Your Answer',
              "label_captcha" => 'Captcha',
              "label_submit" => 'Submit',
              "error_empty" => 'Please fill in all the required fields.',
              "error_noemail" => 'Please enter a valid e-mail address.',
              "success" => 'Thanks for your e-mail! We\'ll get back to you as soon as we can.'
          ), $atts));
      
          $captcha_instance = new ReallySimpleCaptcha(); //imports really simple captcha plugin
      
          if ($_SERVER['REQUEST_METHOD'] == 'POST') {
      
              $error = false;
              $required_fields = array("your_name", "email", "captcha", "subject");
      
              foreach ($_POST as $field => $value) {
                  if (get_magic_quotes_gpc()) {
                      $value = stripslashes($value);
                  }
                  $form_data[$field] = strip_tags($value);
              }
      
              foreach ($required_fields as $required_field) {
                  $value = trim($form_data[$required_field]);
                  if(empty($value)) {
                      $error = true;
                      $result = $error_empty;
                  }
              }
      
              if(!is_email($form_data['email'])) {
                  $error = true;
                  $result = $error_noemail;
              }
      
              if ($error == false) {
      
                  $captcha_text=$form_data['captcha'];
                  $captcha_prefix=$form_data['prefix'];
                  $correct = $captcha_instance->check( $captcha_prefix, $captcha_text );
      
                  if($correct==TRUE){
      
                      $email_subject = "[" . get_bloginfo('name') . "] " . $form_data['subject'];
                      $email_message = $form_data['captcha'] . "\n\nIP: " . wptuts_get_the_ip();
                      $headers  = "From: ".$form_data['your_name']." <".$form_data['email'].">\n";
                      $headers .= "Content-Type: text/plain; charset=UTF-8\n";
                      $headers .= "Content-Transfer-Encoding: 8bit\n";
                      wp_mail($email, $email_subject, $email_message, $headers);
                      $result = $success;
                      $sent = true;
                  }
              }
          }
      
          $word = $captcha_instance->generate_random_word();        
          $prefix = mt_rand();
          $image= $captcha_instance->generate_image( $prefix, $word );
      
          if($result != "") {
              $info = '<div class="info">'.$result.'</div>';        
          }
      
          $email_form = '<form class="contact-form" method="post" action="'.get_permalink().'">
              <div>
                  <label for="cf_name">'.$label_name.':</label>
                  <input type="text" name="your_name" id="cf_name" size="50" maxlength="50" value="'.$form_data['your_name'].'" />
              </div>
              <div>
                  <label for="cf_email">'.$label_email.':</label>
                  <input type="text" name="email" id="cf_email" size="50" maxlength="50" value="'.$form_data['email'].'" />
              </div>
              <div>
                  <label for="cf_subject">'.$label_subject.':</label>
                  <input type="text" name="subject" id="cf_subject" size="50" maxlength="50" value="'.$subject.$form_data['subject'].'" />
              </div>
              <div>
                  <label for="cf_message">'.$label_captcha.':</label>
                  <input type="text" name="captcha" id="cf_message" size="50" maxlength="50" value=""/>
                  <input type="hidden" name="prefix" id="prefix" value="'.$prefix.'"/>
              </div>
              <div id="captcha"><span id="captcha_text">Captcha:</span><img id="captcha_image" src="'.plugins_url("really-simple-captcha/tmp/" . $image) . '" alt="" /></div>
              <div>
                  <input type="submit" value="'.$label_submit.'" name="send" id="cf_send" />
              </div>
      
          </form>';
      
          if($sent == true) {
              return $info;
          } else {
              return $info.$email_form;
          }
      } 
      add_shortcode('contact', 'wptuts_contact_form_sc');
      
      // add plugins style to frontend
      function prize_game_contact_form() {
      wp_register_style('prize_game_contact_form', plugins_url('css/style.css',__FILE__));
      wp_enqueue_style('prize_game_contact_form');
      }
      add_action('wp_enqueue_scripts', 'prize_game_contact_form');
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-20
        • 2018-08-26
        • 2011-05-18
        相关资源
        最近更新 更多