Php 我的验证码是如何被机器人规避的?

Php 我的验证码是如何被机器人规避的?,php,forms,captcha,Php,Forms,Captcha,以下是我的脚本,用于检查填充的字段: foreach($_POST as $key => $value){ //required fields if(in_array($key, $required_fields) && empty($value) && $all_required_filled){ $error_message .= "<li>Not all required fields were filled

以下是我的脚本,用于检查填充的字段:

foreach($_POST as $key => $value){
    //required fields
    if(in_array($key, $required_fields) && empty($value) && $all_required_filled){
        $error_message .= "<li>Not all required fields were filled out</li>"; 
        $valid = false;
        $all_required_filled = false;
    }
    //valid email address
    if($key == 'email'){
        if (!filter_var($value, FILTER_VALIDATE_EMAIL)) {
            $error_message .= "<li>Invalid email format</li>";
            $valid = false; 
        }
    }
    //captcha is valid
    if($key == "captcha"){
        if((int)$value !== (int)$_SESSION['veriword']){
            $error_message .= "<li>The captcha was incorrect</li>";
            $valid = false;
        }
        else{
            $message .= "User entered {$value}. Correct answer was {$_SESSION['veriword']}";
        }
        continue;
    } 
}
foreach($\u发布为$key=>$value){
//必填字段
if(在数组中($key,$required,$fields)&&empty($value)&&all\u required\u filled){
$error_message.=“
  • 没有填写所有必填字段”
  • ”; $valid=false; $all\u required\u filled=假; } //有效电子邮件地址 如果($key=='email'){ 如果(!filter\u var($value,filter\u VALIDATE\u EMAIL)){ $error_message.=“
  • 无效的电子邮件格式”
  • ”; $valid=false; } } //验证码有效 如果($key==“验证码”){ if((int)$value!==(int)$\u会话['veriword']){ $error_message.=“
  • 验证码不正确”
  • ”; $valid=false; } 否则{ $message.=“用户输入了{$value}。正确答案是{$\u会话['veriword']}”; } 继续; } }
    基本上,如果captcha表单字段与captcha插件设置的会话变量匹配,脚本将在电子邮件中打印一行,列出用户输入的内容和正确的值


    当我错误地填写验证码时,我无法发送表单,并在页面上留下错误消息。然而,不知何故,垃圾邮件机器人成功地发送了表单,而没有列出表单字段和验证码值的行。所以它完全绕过了“如果”的说法,不知怎的?我不确定发生了什么…

    与其在
    $\u POST
    上循环,不如明确检查所需的输入:

    if (isset($_POST['captcha'])) {
        if (intval($_POST['captcha']) !== $_SESSION['veriword']) {
            $error_message .= "<li>The captcha was incorrect</li>";
            $valid = false;
        }
    } else {
        $error_message .= "<li>The captcha was not submitted</li>";
        $valid = false;
    }
    
    if(设置($\u POST['captcha'])){
    if(intval($\u POST['captcha'])!=$\u会话['veriword']){
    $error_message.=“
  • 验证码不正确”
  • ”; $valid=false; } }否则{ $error_message.=“
  • 验证码未提交”
  • ”; $valid=false; }
    介意提供所有post数据吗?在浏览器中打开“与我们联系”页面,打开“开发工具”并从表单中删除验证码字段(完整),提交页面如果未发送验证码,则不会检查验证码。所以机器人只需发布所有数据,而不需要captcha@jfadich如何从表单中删除captcha字段?表单只是向服务器提交数据的一种方式。机器人程序通常只是直接向服务器发出post请求,完全绕过表单。