0

同じページの AJAX/JavaScript/PHP Captcha 検証コードに問題があります。元のコードはhttp://www.phpcaptcha.orgからのものです。サードパーティのサイトを使用して、すべてのフォーム データを複数の人が編集するデータベースに保存しています。最近、大量のスパムを受信して​​いるため、この Captcha を実装しようとしています。

ここで本題に入ります。コードは毎回「falseを返す」ように設定されています。特定の条件が満たされた場合、「trueを返す」必要があります。コードは次のとおりです。

<?php
session_start(); // this MUST be called prior to any output including whitespaces and line breaks!


$GLOBALS['DEBUG_MODE'] = 1;
// CHANGE TO 0 TO TURN OFF DEBUG MODE
// IN DEBUG MODE, ONLY THE CAPTCHA CODE IS VALIDATED, AND NO EMAIL IS SENT
// EMAIL is edited out for school use
if( isset($_POST['captcha_code']))
{
$a = array("error"=>0);
print json_encode($a);
}
// Process the form, if it was submitted (Original Code called process_si_contact_form())
process_si_zoho1();

?>
<html>
<head>

<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/prototype/1.7.0.0/prototype.js"></script>


<script type="text/javascript">
//variables not part of original code
    function reloadCaptcha()
    {
    //original code ElementId labled 'captcha_code'
        document.getElementById('captcha').src ='securimage_show.php?sid=' + Math.random();
    }

    var r, Submit;
function processForm()
{
    new Ajax.Request('<?php echo $_SERVER['PHP_SELF'] ?>', {
        method: 'post',
        //Original code did not state 'zoho1'
       parameters: $('zoho1').serialize(),
        onSuccess: function(transport) {
        //Re-edited for school use. Not original code
            try {
                r = transport.responseText.evalJSON();
                Submit = r.submit

                if (r.error == 0) {
                alert('Congrats!');
                reloadCaptcha();


                } else {

                    alert("There was an error with your submission.\n\n" + r.message);

                }
            } catch(ex) {

                alert("There was an error parsing the json");

            }

        },
        onFailure: function(err) {

            alert("Ajax request failed");
        }

    });
return Submit;
}
}
</script>

process_si-zoho1() は次のとおりです。

<?php
//Original code process called 'process_si_contact_form())
function process_si_zoho1()
{
if ($_SERVER['REQUEST_METHOD'] == 'POST' && @$_POST['do'] == 'contact') {
    // if the form has been submitted

    foreach($_POST as $key => $value) {
        if (!is_array($key)) {
            // sanitize the input data
            if ($key != '-------') $value = strip_tags($value);
            $_POST[$key] = htmlspecialchars(stripslashes(trim($value)));
        }
    }

    $captcha = $_POST['captcha_code']; // the user's entry for the captcha code

    $errors = array();  // initialize empty error array


    if (sizeof($errors) == 0) {
        require_once dirname(__FILE__) . '/securimage.php';
        $securimage = new Securimage();

        if ($securimage->check($captcha) == false) {
            $errors['captcha_error'] = 'Incorrect security code entered';

        }
    }

   if (sizeof($errors) == 0) {
        // no errors, send the form
       //Edited out mail function from original code

//Changed JSON return array on successful validation to send new variable '$Submit' via serialized $entry
        $Submit = true;
        $entry = array('error' => 0, 'submit' => $Submit);
        die(json_encode($entry));
    } else {
        $errmsg = $captcha_error;
        foreach($errors as $key => $error) {
            // set up error messages to display with each field
            $errmsg .= " - {$error}\n";
            $Submit = false;
        }
//Added $Submit to the return array
        $return = array('error' => 1, 'message' => $errmsg, 'submit' => $Submit);
        die(json_encode($return));
    }


} // POST
} // function process_si_zoho1()


?>

送信ボタンがクリックされると、「processForm()」が実行されます。ここで本当に単純なものが欠けていると確信しています。私はそれにあまりにも関与しています。私は本当にあなたの助けに感謝します

AJAX.Request() の PHP が実行されるまで「Submit」の値が定義されないことはわかっていますが、最初から変数を定義する方法がわかりません。参考までに、変数「r」と「Submit」はすべて関数自体の外で宣言されているため、グローバル変数です。try/catch に return を挿入しようとすると、catch に「json の解析中にエラーが発生しました」というエラーが常に表示されます。また、現在のコードでは、送信の値が空白であるため、常に同じエラーが発生し、とにかくフォームを送信します。グローバル変数 "Submit" を "false" として定義しても、空白のように返されます。

関数の最後に「return false」以外が宣言されている場合、Captcha を検証せずにフォームを送信します。私はこれらすべてに非常に慣れていませんが、1日4〜8時間、ほぼ2週間調査しており、まだ動作するコードを見つけていません. それは可能ですか?つまり、他の Web サイトは同じページの検証を使用し、サードパーティのデータベースに送信していますよね?

必要に応じてさらにコードを提供できますが、問題はここにあるようです。戻り値を変更しようとしない場合、キャプチャは正常に検証され、「if (r.error == 0)」コードは正常に実行されます。関数間でデータが転送されていることを確認するためだけに、「Submit」の値を表示するアラートを追加しました。

私はここで頭がいっぱいです。助けていただければ幸いです。

ありがとう、

マット

完全なコード (詳細を除く) は次のとおりです。

<?php
session_start(); // this MUST be called prior to any output including whitespaces and line breaks!


$GLOBALS['DEBUG_MODE'] = 1;
// CHANGE TO 0 TO TURN OFF DEBUG MODE
// IN DEBUG MODE, ONLY THE CAPTCHA CODE IS VALIDATED, AND NO EMAIL IS SENT
// EMAIL is edited out for school use

// Process the form, if it was submitted (Original Code called process_si_contact_form())
process_si_zoho1();

?>
<html>
<head>

<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/prototype/1.7.0.0/prototype.js"></script>


<script type="text/javascript">
//variables not part of original code
    function reloadCaptcha()
    {
    //original code ElementId labled 'captcha_code'
        document.getElementById('captcha').src = '/securimage_show.php?sid=' + Math.random();
    }

    var r, Submit;
function processForm()
{
    new Ajax.Request('<?php echo $_SERVER['PHP_SELF'] ?>', {
        method: 'post',
        //Original code did not state 'zoho1'
       parameters: $('zoho1').serialize(),
        onSuccess: function(transport) {
        //Re-edited for school use. Not original code
            try {
                r = transport.responseText.evalJSON();
                Submit = r.submit;

                if (r.error == 0) {
                alert('Congrats!');
                reloadCaptcha();


                } else {

                    alert("There was an error with your submission.\n\n" + r.message);

                }
            } catch(ex) {

                alert("There was an error parsing the json");

            }

        },
        onFailure: function(err) {

            alert("Ajax request failed");
        }

    });
return false;
}
}
</script>
</head>
<body>
    <form action="----------" id="zoho1" method="POST" name="leadForm" onsubmit="return processForm()">
        <input name="----------" type="hidden" value="----------" />
        <input name="----------" type="hidden" value="----------" />
        <input name="----------" type="hidden" value="----------" />
        <input name="----------" type="hidden" value="----------" />
        <input name="----------" type="hidden" value="----------" />
        <input name="----------" type="hidden" value="----------" />
        <input type="hidden" name="do" value="contact" /><br />
        <p>
            <label for="First Name">First Name</label><br />
                <input class="required" maxlength="40" name="First Name" type="text" /></p>
        <p>
            <label for="Last Name">Last Name</label><br />
                <input class="required" maxlength="80" name="Last Name" type="text" /></p>
        <p>
            <label email="" for="">Email</label><br />
                <input class="required validate-email" maxlength="100" name="Email" type="text" /></p>
        <p>
            <label for="Phone">Main Phone</label><br />
                <input class="required" maxlength="30" name="Phone" type="text" /></p>
        <p>
            <label for="Mobile">Mobile Phone</label><br />
                <input maxlength="30" name="Mobile" type="text" /></p>
        <p>
            <label for="State">State</label><br />
                <select class="required validate-selection" name="State"><option selected="selected" value="-None-">-None-</option><option value="AL">AL</option><option value="AK">AK</option><option value="AZ">AZ</option><option value="AR">AR</option><option value="CA">CA</option><option value="CO">CO</option><option value="CT">CT</option><option value="DE">DE</option><option value="DC">DC</option><option value="FL">FL</option><option value="HI">HI</option><option value="ID">ID</option><option value="IL">IL</option><option value="IN">IN</option><option value="IA">IA</option><option value="KS">KS</option><option value="KY">KY</option><option value="LA">LA</option><option value="ME">ME</option><option value="MD">MD</option><option value="MA">MA</option><option value="MI">MI</option><option value="MN">MN</option><option value="MS">MS</option><option value="MO">MO</option><option value="MT">MT</option><option value="NE">NE</option><option value="NV">NV</option><option value="NH">NH</option><option value="NJ">NJ</option><option value="NM">NM</option><option value="NY">NY</option><option value="NC">NC</option><option value="ND">ND</option><option value="OH">OH</option><option value="OK">OK</option><option value="OR">OR</option><option value="PA">PA</option><option value="RI">RI</option><option value="SC">SC</option><option value="SD">SD</option><option value="TN">TN</option><option value="TX">TX</option><option value="UT">UT</option><option value="VT">VT</option><option value="VA">VA</option><option value="WA">WA</option><option value="WV">WV</option><option value="WI">WI</option><option value="WY">WY</option><option value="GA">GA</option></select></p>
<!--<div><label for="Mailing Zip">Mailing Zip</label><br /><input type="text" maxlength="30" name="Mailing Zip" /></div>--><!--<div><label for="Mailing Country">Mailing Country</label><br /><input type="text" maxlength="30" name="Mailing Country" /></div>-->
        <p>
            <label for="----------">----------</label><br />
                <select class="required validate-selection" name="----------"><option selected="selected" value="-None-">-None-</option><option value="----------">----------</option><option value="----------">----------</option><option value="----------">----------</option><option value="----------">----------</option><option value="----------">----------</option><option value="----------">----------</option><option value="----------">----------</option><option value="----------">----------</option></select></p>
        <p>
            <label for="-------">----------</label><br />
                <select class="required validate-selection" name="-------"><option selected="selected" value="-None-">-None-</option><option value="----------">----------</option><option value="----------">----------</option><option value="----------">----------</option><option value="----------">----------</option><option value="----------">----------</option><option value="----------">----------</option></select></p>
        <p>
            <label for="-------">------------</label><br />
                <select class="required validate-selection" name="-------"><option selected="selected" value="-None-">-None-</option><option value="----------">----------</option><option value="----------">----------</option><option value="----------">----------</option><option value="---------">-----------</option></select></p>
        <p>
            <label for="-------">Intended Degree</label><br />
                <select class="required validate-selection" name="-------"><option selected="selected" value="-None-">-None-</option><option value="--------------">-------------</option><option value="-------------">-------------</option><option value="-------------">--------------</option></select></p>
        <p>
            <label for="-------">How did you hear about TTU?</label><br />
                <textarea class="required" height="250" maxlength="1000" name="-------" width="250"></textarea></p>
        <p>
            <label for="Description">Comments</label><br />
                <textarea height="250" maxlength="1000" name="Description" width="250"></textarea></p>
                    <img id="captcha" src="/securimage_show.php" alt="CAPTCHA IMAGE" />
                    <input type="text" id="enterVerify" name="captcha_code" size="10" maxlength="6" />
                    <input type="button" id="reload" name="Reload" value="Reload" onClick="reloadCaptcha()">
                <input class="form-button" name="save" type="submit" value="Submit" />
    </form>
</body>
</html>
<?php
//Original code process called 'process_si_contact_form())
function process_si_zoho1()
{
if ($_SERVER['REQUEST_METHOD'] == 'POST' && @$_POST['do'] == 'contact') {
    // if the form has been submitted

    foreach($_POST as $key => $value) {
        if (!is_array($key)) {
            // sanitize the input data
            if ($key != '-------') $value = strip_tags($value);
            $_POST[$key] = htmlspecialchars(stripslashes(trim($value)));
        }
    }

    $captcha = $_POST['captcha_code']; // the user's entry for the captcha code

    $errors = array();  // initialize empty error array


    if (sizeof($errors) == 0) {
        require_once dirname(__FILE__) . '/securimage.php';
        $securimage = new Securimage();

        if ($securimage->check($captcha) == false) {
            $errors['captcha_error'] = 'Incorrect security code entered';

        }
    }

   if (sizeof($errors) == 0) {
        // no errors, send the form
       //Edited out mail function from original code

//Changed JSON return array on successful validation to send new variable '$Submit' via serialized $entry
        $Submit = true;
        $entry = array('error' => 0, 'submit' => $Submit);
        die(json_encode($entry));
    } else {
        $errmsg = $captcha_error;
        foreach($errors as $key => $error) {
            // set up error messages to display with each field
            $errmsg .= " - {$error}\n";
            $Submit = false;
        }
//Added $Submit to the return array
        $return = array('error' => 1, 'message' => $errmsg, 'submit' => $Submit);
        die(json_encode($return));
    }


} // POST
} // function process_si_zoho1()


?>
4

2 に答える 2

0

すべての助けをありがとう。私はさらに調査を行いましたが、問題は JavaScript にありました (コードの経験が最も少ない部分)。私は単に追加しました:

if (r.error == 0)
document.forms['formname'].submit();

助けてくれてありがとう!私は間違いなくこのフォーラムを再び使用します!

于 2013-05-06T18:32:30.490 に答える
0
<?php 

if( isset( $_POST['captcha'] ))
{
    $a = array("error"=>0);
    print json_encode( $a );
    exit();
}
?>

<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/prototype/1.7.1.0/prototype.js" ></script>
</head>
<body onload="processForm()">




<form  id="formtest"  action="" method="POST">
<input type="text" name="captcha" value="1vfvrfr">
</form>

<script>

var r, Submit;
function reloadCaptcha(){}
function processForm()
    {
        new Ajax.Request('<?php echo $_SERVER['PHP_SELF'] ?>', {
            method: 'post',
            //Original code did not state 'zoho1'
           parameters: $('formtest').serialize(),
            onSuccess: function(transport) {
            //Re-edited for school use. Not original code
                try {
                    r = transport.responseText.evalJSON();
                    Submit = r.submit

                    if (r.error == 0) {
                    alert('Congrats!');
                    reloadCaptcha();


                    } else {

                        alert("There was an error with your submission.\n\n" + r.message);

                    }
                } catch(ex) {

                    alert("There was an error parsing the json");

                }

            },
            onFailure: function(err) {

                alert("Ajax request failed");
            }

        });
    return Submit;
    }

</script>
</body>
</html>
于 2013-05-03T17:16:15.403 に答える