Categories
PHP Programming

I’m not a robot

Google has a nifty way of checking if you’re human or not.

I wrote a PHP Class for verifying ReCaptcha v.2.

<?php
class asbraRecap
{
    public $google_secret_key;
    public $google_site_key;

    public function include_java()
    {
        return("
            <script> src='https://www.google.com/recaptcha/api.js?onload=onloadCallback&render=explicit' async defer>
            <script> type='text/javascript'>
                // Change this to your Google site-key
                sitekey = '$this->google_site_key'
                var onloadCallback = function() {
                    grecaptcha.render('asbra_recaptcha', {
                        'sitekey' : sitekey 
                    });
                };
            
        ");
    
    }

    public function verify_recaptcha()
    {
            // Set some variables
            $response = $_POST["g-recaptcha-response"];
            $url = 'https://www.google.com/recaptcha/api/siteverify';
            $data = array(
                'secret' => $this->google_secret_key,
                'response' => $_POST["g-recaptcha-response"]
            );

            // Options for file_get_contents()
            $options = array(
                'http' => array (
                    'method' => 'POST',
                    'content' => http_build_query($data)
                ),
                /* If in chroot, like me */
                "ssl"=>array(
                    "cafile" => "/cacert.pem",
                    "verify_peer"=> true,
                    "verify_peer_name"=> true
                )
            );

            // Talk to Google
            $context  = stream_context_create($options);
            $verify = file_get_contents($url, false, $context);
            $captcha_success=json_decode($verify, true);

            // Is Captcha successfull ?
            if ( false == $captcha_success['success'])
            { 
                // Prepare array to return
                $return['status'] = false;

                // Save errors from Google in array
                foreach ( $captcha_success['error-codes'] as $key => $val ) {
                    $return['errors'][] = $val;
                }

                // Return our array
                return $return;
            }
            elseif ( true == $captcha_success['success']) 
            {
                // Prepare array to return
                $return['status'] = true;
                $return['hostname'] = $captcha_success['hostname'];
                $return['challenge_ts'] = $captcha_success['challenge_ts'];

                return $return;
            }

        // If all else fails
        return false;

    }
}

And some HTML

<html>
<head><title>DEMO - ReCaptcha PHP Class - ASBRA AB</title></head>
<body>

<?php // Initiate a New Class Object
    require_once('asbra-class-recap.php');
    $asbraRecap = new asbraRecap();
    $asbraRecap->google_secret_key = '6Led02MUAAAAAGqsXPr1sx5xZGFKf8Oj3-EVL-lP';
    $asbraRecap->google_site_key = '6Led02MUAAAAACweP4BxEIFP_UR011tItvXm3BoT';
?>

<?php // If Captcha is Posted & Verified
    if(isset($_POST["g-recaptcha-response"])) : if ($result = $asbraRecap->verify_recaptcha()) : if ($result['status'] == true) : ?>

        <h2>En Människa Verifierad!</h2>

    <?php else : ?>

        <h2>Verifiering av en människa misslyckades</h2>

    <?php endif; endif; endif; ?>

<form method="POST">
    <div id="asbra_recaptcha"></div> <br>
    <input type="submit" value="Submit">
</form>

<?php // need som java
    echo $asbraRecap->include_java(); ?>

</body>
</html>

The End!

By Nimpen J. Nordström

System Developer and Network Security Enthusiast

Leave a Reply

Your email address will not be published. Required fields are marked *