1

我正在尝试将 ReCaptcha 添加到我创建的用于共享内容的邮件表单中,但由于某种原因,当我点击“提交”时验证码没有得到验证,这意味着即使你在验证码中输入了错误的文本,该表格仍将发送电子邮件。我正在使用 joomla 2.5.8,recaptcha 插件已启用(尽管我认为它没有被初始化,因为我自己添加了 recaptchalib.php 并且我在邮件表单代码中包含了 publickey 和 privatekey 的引用)。

任何帮助将不胜感激!谢谢!!这是代码:

<?php require_once('recaptchalib.php'); ?>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script language="javascript" type="text/javascript">

              function validateEmail($email)
   {
        var emailReg = /^([\w-\.]+@([\w-]+\.)+[\w-]{2,4})?$/;
        if( !emailReg.test( $email ) )
        {
           return false;
        }
        else
      {
           return true;
        }
   }

   function validateForm()
   {
      var form = document.mailForm;
      if (form.recipient.value == "" || validateEmail(form.recipient.value)==false)
      {
         alert("bad email");
         return false;
      }
      if (form.subject.value == "")
      {
         alert("please enter subject");
         return false;
      }
      if (form.content.value == "")
      {
         alert("please enter massage");
         return false;
      }
      <?php 
      $privatekey = "privatekey";  
      $resp = recaptcha_check_answer($privatekey,$_SERVER["REMOTE_ADDR"],$_POST["recaptcha_challenge_field"],$_POST["recaptcha_response_field"]);   ?>                 
      if (!$resp->is_valid) 
      {    
      alert("try again");
         return false;
       }
      return true;
   }      
</script>
<?php 
   if($this->success=='1')
   {   
      echo JText::_('MAIL_SEND_SUCCESSFULLY');
   }   
   elseif($this->success=='0')
   {
      echo JText::_('MAIL_SEND_FAILED');
   }   
?>
<div id="SendMail">
   <h2>send mail</h2>   
   <form action="index.php" name="mailForm" method="post" onsubmit="return validateForm()">

   <table>
      <tr>
         <td><label><?php echo JText::_('MAIL_SEND_TO'); ?>:</label></td>
         <td><input type="text" name="recipient" size="25" value=""/></td>
      </tr>
      <tr>
         <td><label><?php echo JText::_('MAIL_SUBJECT'); ?>:</label></td>
         <td><input type="text" name="subject" size="25" value=""/></td>
      </tr>
      <tr>
         <td><label><?php echo JText::_('MAIL_MESSAGE'); ?>:</label></td>
         <td>
            <textarea name="content" rows="10" cols="40"></textarea>
            <br/><?php echo JText::_('MAIL_DESC'); ?>
         </td>
            <tr>
            <td><?php $publickey = "public key"; ?></td>
            <td><?php echo recaptcha_get_html($publickey);?></td>
            </tr>
   </table>      
   <p>
      <input type="hidden" name="controller" value="mail" />
      <input type="hidden" name="task" value="sendMail" />   
      <div class="button-mail">
         <input style="width: 50px;height: 25px;" type="submit" name="submit" value="<?php echo JText::_('SEND'); ?>"/>
         <a href="javascript: void window.close()" title="Close Window"><span style="color: #444;
   border: #D5D5D5 1px solid; padding: 4px; width: 50px;height: 25px;"><?php echo JText::_('CLOSE'); ?></span></a>
      </div>
   </p>
   </form>
</div>
4

1 回答 1

0

您的代码有错误。请看这条线

if (!$resp->is_valid) 
{    
    alert("try again");
    return false;
}

PHP在哪里$resp->is_valid,但作为 JS 执行。

  1. 正确的代码是

    if (!<php (int)$resp->is_valid;?>) 
    {    
        alert("try again");
        return false;
    }
    

    但它无论如何都不会工作,因为2。

  2. 您无法在 Javascript 验证中检查 recaptcha 代码。应该检查服务器端。或者,如果您想使用 javascript 检查它应该使用对服务器的 AJAX 请求进行检查。那是因为你编码

    <?php 
    $privatekey = "privatekey";  
    $resp = recaptcha_check_answer($privatekey,$_SERVER["REMOTE_ADDR"],$_POST["recaptcha_challenge_field"],$_POST["recaptcha_response_field"]);   ?>                 
    

    甚至在用户输入验证码之前在表单加载时执行。

于 2013-02-03T12:48:40.607 回答