You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

104 lines
3.0 KiB

<?php
// (c) Copyright by authors of the Tiki Wiki CMS Groupware Project
//
// All Rights Reserved. See copyright.txt for details and a complete list of authors.
// Licensed under the GNU LESSER GENERAL PUBLIC LICENSE. See license.txt for details.
// $Id$
class Captcha_ReCaptcha20 extends Laminas\Captcha\ReCaptcha
{
protected $_RESPONSE = 'g-recaptcha-response';
/**
* Validate captcha
*
* @see Zend_Validate_Interface::isValid()
* @param mixed $value
* @param array|null $context
* @return boolean
*/
public function isValid($value, $context = null)
{
if (! is_array($value) && ! is_array($context)) {
$this->error(self::MISSING_VALUE);
return false;
}
if (empty($value[$this->_RESPONSE])) {
$this->error(self::MISSING_VALUE);
return false;
}
if (! extension_loaded('curl')) {
$this->error('reCAPTCHA 2 requires the PHP CURL extension');
return false;
}
// Google request was cached
if (in_array($value[$this->_RESPONSE], $_SESSION['recaptcha_cache'])) {
return true;
}
//set POST variables
$url = 'https://www.google.com/recaptcha/api/siteverify';
$fields = [
'secret' => urlencode($this->getPrivkey()),
'response' => urlencode($value[$this->_RESPONSE]),
'remoteip' => urlencode($_SERVER['REMOTE_ADDR']),
];
$fields_string = '';
foreach ($fields as $k => $v) {
$fields_string .= $k . '=' . $v . '&';
}
rtrim($fields_string, '&');
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $fields_string);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$result = @json_decode(curl_exec($ch), true);
if (! is_array($result)) {
$this->error(self::ERR_CAPTCHA);
return false;
}
if ($result['success'] == false) {
$this->error(self::BAD_CAPTCHA);
return false;
}
// Cache google respnonse to avoid second resubmission on ajax form
$_SESSION['recaptcha_cache'][] = $value[$this->_RESPONSE];
return true;
}
/**
* Render captcha
*
* @return string
*/
public function render()
{
TikiLib::lib('header')->add_css('.g-recaptcha-response {display:none !important;}');
return '<div class="g-recaptcha" data-sitekey="' . $this->getPubkey() . '" id="antibotcode"></div>';
}
/**
* Render captcha though Ajax
*
* @return string
*/
public function renderAjax()
{
static $id = 1;
TikiLib::lib('header')->add_js("
grecaptcha.render('g-recaptcha{$id}', {
'sitekey': '{$this->getPubkey()}'
});
", 100);
return '<div id="g-recaptcha' . $id . '"></div>';
}
}