【发布时间】:2013-11-29 06:41:24
【问题描述】:
我在我的网站中使用 HTML 合同表格指南中的合同表格。在测试中,我使用 apache 和 PHP v5.5 从我的计算机上运行我的网站。一切似乎在我的测试服务器上运行良好,我可以填写表格,单击提交,然后进入“成功页面”。当我将我的网站上传到我的托管服务并尝试使用联系表格时,验证码不接受我的输入并返回消息“反垃圾邮件检查失败”。我的托管服务正在运行 PHP v5.3。我不确定发生了什么变化以及为什么我的表单在上传时不再有效。哦,我也在学习PHP,所以我可能无法完全理解我被问到的内容,所以我可能需要更长的时间才能给出准确的答复。
* 此问题已解决。我最终联系了我的托管公司 fatcow。这是他们的回应“我已经在你的'PHP 脚本'中设置了 session.save_path,并且我已经将你的 PHP 脚本的内存限制从 32 MB 增加到了 128 MB。”我想这是服务器端的问题。我想我已经缩小了范围,当我遇到类似的问题时,我也可以假设它是服务器端问题。希望任何有类似问题的人都可以使用这篇文章并据此决定做什么。
我在$_SESSION['FGCF_Captcha_Answer'] 和$user_answer 上运行var_dump(),两个值相等。这是我得到的:
字符串'c85757e710d687d24c0b044812d5ee05'(长度=32)
字符串'c85757e710d687d24c0b044812d5ee05'(长度=32)
我也是从 fatcow 服务器托管的,并已与他们联系,看看他们是否知道他们服务器上的 reCAPTCHA 问题。只是在等待他们的答复。我正在运行的服务器是否有可能遇到这些事情,也许不是编程问题,但就像我上面所说的,在我自己运行 apache 的计算机上,表单工作正常,我在 fatcow 上遇到的唯一问题不是整个表单,只需 reCAPTCHA
这是验证码,如果还有什么需要请告诉我:
<?PHP
class FGSimpleCaptcha extends FG_CaptchaHandler
{
var $error_str;
var $captcha_varname;
var $uniquekey;
function FGSimpleCaptcha($captcha_var_name)
{
$this->captcha_varname=$captcha_var_name;
$this->uniquekey='KHJhsjsy65HGbsmnd';
}
/*Add more simple questions here.*/
function GetSimpleCaptcha()
{
$arrQuestions = array(
"What color is the sky? "=>"blue",
"What is 1+1=" => "2",
"What is the color of grass?"=>"green",
"Are you a robot? "=>"no",
"Are you human?"=>"yes");
$question = array_rand($arrQuestions);
$answer = $arrQuestions[$question];
$_SESSION['FGCF_Captcha_Answer'] = $this->Md5CaptchaAnswer($answer);
return $question;
}
function SetFormKey($key)
{
$this->uniquekey = $key;
}
function GetKey()
{
return $this->uniquekey;
}
function Validate()
{
$ret=false;
if(empty($_POST[$this->captcha_varname]))
{
$this->error_str = "Please answer the anti-spam question";
$ret = false;
}
else
{
$scaptcha = trim($_POST[$this->captcha_varname]);
$scaptcha = strtolower($scaptcha);
$user_answer = $this->Md5CaptchaAnswer($scaptcha);
if($user_answer != $_SESSION['FGCF_Captcha_Answer'])
{
$this->error_str = "Failed the anti-spam check!";
$ret = false;
}
else
{
$ret = true;
}
}//else
return $ret;
}
function Md5CaptchaAnswer($answer)
{
return md5($this->GetKey().$answer);
}
function GetError()
{
return $this->error_str;
}
}
?>
这是表单的部分代码:
class FGContactForm
{
var $receipients;
var $errors;
var $error_message;
var $name;
var $email;
var $message;
var $from_address;
var $form_random_key;
var $conditional_field;
var $arr_conditional_receipients;
var $fileupload_fields;
var $captcha_handler;
var $mailer;
function FGContactForm()
{
$this->receipients = array();
$this->errors = array();
$this->form_random_key = 'HTgsjhartag';
$this->conditional_field='';
$this->arr_conditional_receipients=array();
$this->fileupload_fields=array();
$this->mailer = new PHPMailer();
$this->mailer->CharSet = 'utf-8';
}
function EnableCaptcha($captcha_handler)
{
$this->captcha_handler = $captcha_handler;
session_start();
}
function AddRecipient($email,$name="")
{
$this->mailer->AddAddress($email,$name);
}
function SetFromAddress($from)
{
$this->from_address = $from;
}
function SetFormRandomKey($key)
{
$this->form_random_key = $key;
}
function GetSpamTrapInputName()
{
return 'sp'.md5('KHGdnbvsgst'.$this->GetKey());
}
function SafeDisplay($value_name)
{
if(empty($_POST[$value_name]))
{
return'';
}
return htmlentities($_POST[$value_name]);
}
function GetFormIDInputName()
{
$rand = md5('TygshRt'.$this->GetKey());
$rand = substr($rand,0,20);
return 'id'.$rand;
}
function GetFormIDInputValue()
{
return md5('jhgahTsajhg'.$this->GetKey());
}
function SetConditionalField($field)
{
$this->conditional_field = $field;
}
function AddConditionalReceipent($value,$email)
{
$this->arr_conditional_receipients[$value] = $email;
}
function AddFileUploadField($file_field_name,$accepted_types,$max_size)
{
$this->fileupload_fields[] =
array("name"=>$file_field_name,
"file_types"=>$accepted_types,
"maxsize"=>$max_size);
}
function ProcessForm()
{
if(!isset($_POST['submitted']))
{
return false;
}
if(!$this->Validate())
{
$this->error_message = implode('<br/>',$this->errors);
return false;
}
$this->CollectData();
$ret = $this->SendFormSubmission();
return $ret;
}
function RedirectToURL($url)
{
header("Location: $url");/* Redirect browser */
/* Make sure that code below does not get executed when we redirect. */
exit;
}
function GetErrorMessage()
{
return $this->error_message;
}
function GetSelfScript()
{
return htmlentities($_SERVER['PHP_SELF']);
}
function GetName()
{
return $this->name;
}
function GetEmail()
{
return $this->email;
}
function GetMessage()
{
return htmlentities($this->message,ENT_QUOTES,"UTF-8");
}
【问题讨论】:
-
您的代码中有
session_start()吗?如果您要使用 $_SESSION,则需要它。 -
@andrewsi 是的,我愿意。我会尝试从表单中输入一些代码,这样你就可以看到我正在处理什么。我尽量不让代码淹没你,所以我把它拿出来。
-
您会惊讶于人们忘记它的频率。在这种情况下 - 您收到的消息似乎是由于未通过此检查而出现的:
if($user_answer != $_SESSION['FGCF_Captcha_Answer'])。您能否尝试在这两个变量上使用var_dump,以便查看实际值? -
@andrewsi 我以前从未使用过。一直在浏览论坛以正确实施
var_dump(),但我不确定我应该把它放在哪里以获得结果。我试过控制台。 -
它应该出现在你的代码中,就在
if语句的正上方。您只需添加var_dump($user_answer);和var_dump($_SESSION['FGCF_Captcha_Answer']);,并将输出添加到您的问题中;重新运行代码,它会打印出这些变量的值。在调试时,var_dump()非常宝贵。
标签: php forms captcha spam-prevention