HEX
Server: nginx/1.18.0
System: Linux iZj6c1ieg2jrpk1z5tzi19Z 6.3.9-1.el7.elrepo.x86_64 #1 SMP PREEMPT_DYNAMIC Wed Jun 21 22:18:40 EDT 2023 x86_64
User: www (1001)
PHP: 8.2.4
Disabled: passthru,exec,system,putenv,chroot,chgrp,chown,shell_exec,popen,proc_open,pcntl_exec,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,imap_open,apache_setenv
Upload Files
File: /www/wwwroot/www.cytocare.cn/wp-content/plugins/online-contact-widget/classes/captcha.class.php
<?php

/**
 * Author: wbolt team
 * Author URI: https://www.wbolt.com
 */

class OCW_Captcha extends OCW_Base
{


  private static $result = null;


  public static function result()
  {
    return self::$result;
  }

  public static function opt($key = null)
  {
    /*[
            'type' => 'none',
            'google' => [
                'public' => '',
                'private' => '',
                'score' => 0.5,
            ],
        ]*/
    return OCW_Admin::opt('items_data.msg.captcha');
  }

  public static function init()
  {
    add_action('wp_ajax_owc_recaptcha', array(__CLASS__, 'wp_ajax_wb_recaptcha'));
    add_action('wp_ajax_nopriv_owc_recaptcha', array(__CLASS__, 'wp_ajax_wb_recaptcha'));
  }


  public static function wp_ajax_wb_recaptcha()
  {
    $op = self::param('op');
    if (!$op) {
      $op = self::param('op', '', 'g');
    }
    if (!$op || !in_array($op, ['captcha', 'verify'])) {
      return;
    }

    switch ($op) {
      case 'captcha':
        require_once __DIR__ . '/image_captcha.php';
        header("Content-type: image/gif");
        $font = ONLINE_CONTACT_WIDGET_PATH . '/assets/fonts/consolas-webfont.ttf';
        $imagecode = new OCW_Imagecode(90, 39, 4, '', $font); //
        $imagecode->imageout();
        break;
      case 'verify':
        $ret = ['code' => 0, 'desc' => 'success'];

        self::verify();
        if (self::$result) {
          //ret['data']['score']
          $ret = self::$result;
        }
        header('content-type:text/json;charset=utf-8');
        echo json_encode($ret);
        break;
    }
    exit();
  }

  public static function verify()
  {
    $cnf = self::opt('captcha');
    if (!$cnf || !is_array($cnf)) {
      return false;
    }
    if (!isset($cnf['type'])) {
      return false;
    }
    $state = false;
    switch ($cnf['type']) {
      case 'google':
        $state = self::google($cnf);
        break;
      default:
        $state = self::base($cnf);
        break;
    }
    return $state;
  }

  public static function base($cnf)
  {
    $result = ['code' => 1, 'desc' => 'fail2'];
    do {
      // 验证码验证
      if (!isset($_POST['ocw_captcha']) || empty($_POST['ocw_captcha'])) {
        $result['desc'] = __('验证码不能为空', 'wb-ocw');
        break;
      }
      $captcha = strtolower(trim(sanitize_text_field($_POST['ocw_captcha'])));
      session_start();
      $session_captcha = strtolower($_SESSION['ocw_captcha']);
      if ($captcha != $session_captcha) {
        $result['desc'] = __('验证码错误,请重新输入', 'wb-ocw');
        break;
      }
      $result['code'] = 0;
      $result['desc'] = 'success';
    } while (0);

    self::$result = $result;

    $result = apply_filters('ocw_captcha_verify_result', $result);

    return !$result['code'];
  }

  public static function google($cnf)
  {
    $result = ['code' => 1, 'desc' => 'fail'];
    do {
      if (!isset($_POST['ocw_captcha']) || empty($_POST['ocw_captcha'])) {
        $result['desc'] = 'empty recaptcha token';
        break;
      }
      if (!isset($cnf['google']) || !is_array($cnf['google'])) {
        $result['desc'] = 'empty recaptcha config';
        break;
      }
      $config = $cnf['google'];
      if (!isset($config['private']) || empty($config['private'])) {
        $result['desc'] = 'empty recaptcha private key';
        break;
      }

      $body = ['secret' => $config['private'], 'response' => trim(sanitize_text_field($_POST['ocw_captcha']))];
      $api = 'https://www.recaptcha.net/recaptcha/api/siteverify';
      $param = array(
        'timeout' => 5,
        'verifyssl' => false,
        'headers' => array(
          'user-agent' => 'Wordpress ' . get_bloginfo('version') . ' / wbolt.com'
        ),
        'body' => $body
      );
      $http = wp_remote_post($api, $param);
      if (is_wp_error($http)) {
        $result['desc'] = $http->get_error_message();
        break;
      }
      $body = wp_remote_retrieve_body($http);
      //error_log($body."\n",3,__DIR__.'/log.txt');
      $data = json_decode($body);
      $result['data'] = $data;
      if (!$data || !$data->success) {
        $result['desc'] = 'recaptcha fail';
        break;
      }
      $score = isset($config['score']) ? floatval($config['score']) : 0.5;
      if (!isset($data->score) || $data->score < $score) {
        $result['desc'] = __('reCAPTCHA验证失败,请稍后再试', 'wb-ocw');
        break;
      }
      $result['code'] = 0;
      $result['desc'] = 'success';
    } while (0);

    self::$result = $result;

    $result = apply_filters('ocw_captcha_verify_result', $result);


    return !$result['code'];
  }
}