123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229 |
- <?php
- /**
- * 极验行为式验证安全平台,php 网站主后台包含的库文件
- *@author Tanxu
- */
- require_once dirname(dirname(__FILE__)) . '/plugin/config.php';
- class GeetestLib{
- const GT_SDK_VERSION = 'php_2.15.7.6.1';
- public function __construct() {
- $this->challenge = "";
- }
- /**
- *判断极验服务器是否down机
- *
- * @return
- */
- public function register() {
- $url = "http://api.geetest.com/register.php?gt=" . CAPTCHA_ID;
- $this->challenge = $this->send_request($url);
- if (strlen($this->challenge) != 32) {
- return 0;
- }
- return 1;
- }
- public function validate($challenge, $validate, $seccode) {
- if ( ! $this->check_validate($challenge, $validate)) {
- return FALSE;
- }
- $data = array(
- "seccode"=>$seccode,
- "sdk"=>self::GT_SDK_VERSION,
- );
- $url = "http://api.geetest.com/validate.php";
- $codevalidate = $this->post_request($url, $data);
- if (strlen($codevalidate) > 0 && $codevalidate == md5($seccode)) {
- return TRUE;
- } else if ($codevalidate == "false"){
- return FALSE;
- } else {
- return $codevalidate;
- }
- }
- private function check_validate($challenge, $validate) {
- if (strlen($validate) != 32) {
- return FALSE;
- }
- if (md5(PRIVATE_KEY.'geetest'.$challenge) != $validate) {
- return FALSE;
- }
- return TRUE;
- }
- private function send_request($url){
- if(function_exists('curl_exec')){
- $ch = curl_init();
- curl_setopt ($ch, CURLOPT_URL, $url);
- curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
- $data = curl_exec($ch);
- curl_close($ch);
- }else{
- $opts = array(
- 'http'=>array(
- 'method'=>"GET",
- 'timeout'=>2,
- )
- );
- $context = stream_context_create($opts);
- $data = file_get_contents($url, false, $context);
- }
- return $data;
- }
- /**
- *解码随机参数
- *
- * @param $challenge
- * @param $string
- * @return
- */
- private function decode_response($challenge,$string) {
- if (strlen($string) > 100) {
- return 0;
- }
- $key = array();
- $chongfu = array();
- $shuzi = array("0"=>1,"1"=>2,"2"=>5,"3"=>10,"4"=>50);
- $count = 0;
- $res = 0;
- $array_challenge = str_split($challenge);
- $array_value = str_split($string);
- for ($i=0; $i < strlen($challenge); $i++) {
- $item = $array_challenge[$i];
- if (in_array($item, $chongfu)) {
- continue;
- }else{
- $value = $shuzi[$count % 5];
- array_push($chongfu, $item);
- $count++;
- $key[$item] = $value;
- }
- }
- for ($j=0; $j < strlen($string); $j++) {
- $res += $key[$array_value[$j]];
- }
- $res = $res - $this->decodeRandBase($challenge);
- return $res;
- }
- /**
- *
- * @param $x_str
- * @return
- */
- private function get_x_pos_from_str($x_str) {
- if (strlen($x_str) != 5) {
- return 0;
- }
- $sum_val = 0;
- $x_pos_sup = 200;
- $sum_val = base_convert($x_str,16,10);
- $result = $sum_val % $x_pos_sup;
- $result = ($result < 40) ? 40 : $result;
- return $result;
- }
- /**
- *
- * @param full_bg_index
- * @param img_grp_index
- * @return
- */
- private function get_failback_pic_ans($full_bg_index,$img_grp_index) {
- $full_bg_name = substr(md5($full_bg_index),0,9);
- $bg_name = substr(md5($img_grp_index),10,9);
- $answer_decode = "";
- // 通过两个字符串奇数和偶数位拼接产生答案位
- for ($i=0; $i < 9; $i++) {
- if ($i % 2 == 0) {
- $answer_decode = $answer_decode . $full_bg_name[$i];
- }elseif ($i % 2 == 1) {
- $answer_decode = $answer_decode . $bg_name[$i];
- }
- }
- $x_decode = substr($answer_decode, 4 , 5);
- $x_pos = $this->get_x_pos_from_str($x_decode);
- return $x_pos;
- }
- /**
- * 输入的两位的随机数字,解码出偏移量
- *
- * @param challenge
- * @return
- */
- private function decodeRandBase($challenge) {
- $base = substr($challenge, 32, 2);
- $tempArray = array();
- for ($i=0; $i < strlen($base); $i++) {
- $tempAscii = ord($base[$i]);
- $result = ($tempAscii > 57) ? ($tempAscii - 87) : ($tempAscii -48);
- array_push($tempArray,$result);
- }
- $decodeRes = $tempArray['0'] * 36 + $tempArray['1'];
- return $decodeRes;
- }
- /**
- * 得到答案
- *
- * @param validate
- * @return
- */
- public function get_answer($validate) {
- if ($validate) {
- $value = explode("_",$validate);
- $challenge = $_SESSION['challenge'];
- $ans = $this->decode_response($challenge,$value['0']);
- $bg_idx = $this->decode_response($challenge,$value['1']);
- $grp_idx = $this->decode_response($challenge,$value['2']);
- $x_pos = $this->get_failback_pic_ans($bg_idx ,$grp_idx);
- $answer = abs($ans - $x_pos);
- if ($answer < 4) {
- return 1;
- }else{
- return 0;
- }
- }else{
- return 0;
- }
- }
- public function post_request($url, $postdata = null){
- $data = http_build_query($postdata);
- if(function_exists('curl_exec')){
- $ch = curl_init();
- curl_setopt($ch, CURLOPT_URL, $url);
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
- if(!$postdata){
- curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
- curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
- }else{
- curl_setopt($ch, CURLOPT_POST, 1);
- curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
- }
- $data = curl_exec($ch);
- curl_close($ch);
- }else{
- if($postdata){
- $url = $url.'?'.$data;
- $opts = array(
- 'http' => array(
- 'method' => 'POST',
- 'header'=> "Content-type: application/x-www-form-urlencoded\r\n" . "Content-Length: " . strlen($data) . "\r\n",
- 'content' => $data
- )
- );
- $context = stream_context_create($opts);
- $data = file_get_contents($url, false, $context);
- }
- }
- return $data;
- }
- }
- ?>
|