请选择 进入手机版 | 继续访问电脑版
 找回密码
 立即注册

手机号码,快捷登录

今天遇到一个问题,discuzX3* 升级成https 的时候发现UCenter 一直通信失败

查找了一下目前大家的解决方案基本都是通用的方法,修改密钥同步啥的,正常来说可以,但是改https后这个方法不管用

我们先手看下具体问题

打开Discuz论坛目录下的uc_server/model/misc.php 文件,找到 (大约69行左右),插入下面代码。


  1. if(substr($url,0,5)=='https'){
  2.             //var_dump($url);
  3.             $ch = curl_init($url);
  4.             curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

  5.             if($post){
  6.                 curl_setopt($ch, CURLOPT_POST, 1);
  7.                 curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
  8.             }

  9.             if($cookie){
  10.                 curl_setopt($ch, CURLOPT_COOKIE, $cookie);
  11.             }
  12.             curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
  13.             return curl_exec($ch);
  14.         }
复制代码

此方法我用了以后并不生效,仔细查看代码后发现,问题出在最后curl 与 https 的上面。当请求https的数据时,会要求证书,这时候,加上下面这两个参数,规避ssl的证书检查

  1. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); // https请求 不验证证书
  2. curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); // https请求 不验证hosts
复制代码

发现上述代码缺少了不验证host 。添加上以后果断好使。


下面完整代码

  1. <?php

  2. /*
  3.         [UCenter] (C)2001-2099 Comsenz Inc.
  4.         This is NOT a freeware, use is subject to license terms
  5.         $Id: misc.php 1127 2011-12-14 04:24:58Z svn_project_zhangjie $
  6. */

  7. !defined('IN_UC') && exit('Access Denied');

  8. define('UC_ARRAY_SEP_1', 'UC_ARRAY_SEP_1');
  9. define('UC_ARRAY_SEP_2', 'UC_ARRAY_SEP_2');

  10. class miscmodel
  11. {

  12.     var $db;
  13.     var $base;

  14.     function __construct(&$base)
  15.     {
  16.         $this->miscmodel($base);
  17.     }

  18.     function miscmodel(&$base)
  19.     {
  20.         $this->base = $base;
  21.         $this->db = $base->db;
  22.     }

  23.     function get_host_by_url($url)
  24.     {
  25.         $m = parse_url($url);
  26.         if (!$m['host']) {
  27.             return -1;
  28.         }
  29.         if (!preg_match("/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/", $m['host'])) {
  30.             $ip = @gethostbyname($m['host']);
  31.             if (!$ip || $ip == $m['host']) {
  32.                 return -2;
  33.             }
  34.             return $ip;
  35.         } else {
  36.             return $m['host'];
  37.         }
  38.     }

  39.     function check_url($url)
  40.     {
  41.         return preg_match("/(https?){1}:\/\/|www\.([^\["']+?)?/i", $url);
  42.     }

  43.     function check_ip($url)
  44.     {
  45.         return preg_match("/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/", $url);
  46.     }

  47.     function dfopen2($url, $limit = 0, $post = '', $cookie = '', $bysocket = FALSE, $ip = '', $timeout = 15, $block = TRUE, $encodetype = 'URLENCODE')
  48.     {
  49.         $__times__ = isset($_GET['__times__']) ? intval($_GET['__times__']) + 1 : 1;
  50.         if ($__times__ > 2) {
  51.             return '';
  52.         }
  53.         $url .= (strpos($url, '?') === FALSE ? '?' : '&') . "__times__=$__times__";
  54.         return $this->dfopen($url, $limit, $post, $cookie, $bysocket, $ip, $timeout, $block, $encodetype);
  55.     }

  56.     function dfopen($url, $limit = 0, $post = '', $cookie = '', $bysocket = FALSE, $ip = '', $timeout = 15, $block = TRUE, $encodetype = 'URLENCODE')
  57.     {
  58.         $return = '';
  59.         $matches = parse_url($url);
  60.         $scheme = $matches['scheme'];
  61.         $host = $matches['host'];
  62.         $path = $matches['path'] ? $matches['path'] . ($matches['query'] ? '?' . $matches['query'] : '') : '/';
  63.         $port = !empty($matches['port']) ? $matches['port'] : ($matches['scheme'] == 'https' ? 443 : 80);
  64. //本段解决,UC通信失败,https
  65.         if(substr($url,0,5)=='https'){
  66.             $ch = curl_init($url);
  67.             curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  68.             if($post){
  69.                 curl_setopt($ch, CURLOPT_POST, 1);
  70.                 curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
  71.             }
  72.             if($cookie){
  73.                 curl_setopt($ch, CURLOPT_COOKIE, $cookie);
  74.             }
  75.             curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
  76.             curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
  77.             return curl_exec($ch);
  78.         }
  79.         if ($post) {
  80.             $out = "POST $path HTTP/1.0\r\n";
  81.             $header = "Accept: */*\r\n";
  82.             $header .= "Accept-Language: zh-cn\r\n";
  83.             $boundary = $encodetype == 'URLENCODE' ? '' : ';' . substr($post, 0, trim(strpos($post, "\n")));
  84.             $header .= $encodetype == 'URLENCODE' ? "Content-Type: application/x-www-form-urlencoded\r\n" : "Content-Type: multipart/form-data$boundary\r\n";
  85.             $header .= "User-Agent: $_SERVER[HTTP_USER_AGENT]\r\n";
  86.             $header .= "Host: $host:$port\r\n";
  87.             $header .= 'Content-Length: ' . strlen($post) . "\r\n";
  88.             $header .= "Connection: Close\r\n";
  89.             $header .= "Cache-Control: no-cache\r\n";
  90.             $header .= "Cookie: $cookie\r\n\r\n";
  91.             $out .= $header . $post;
  92.         } else {
  93.             $out = "GET $path HTTP/1.0\r\n";
  94.             $header = "Accept: */*\r\n";
  95.             $header .= "Accept-Language: zh-cn\r\n";
  96.             $header .= "User-Agent: $_SERVER[HTTP_USER_AGENT]\r\n";
  97.             $header .= "Host: $host:$port\r\n";
  98.             $header .= "Connection: Close\r\n";
  99.             $header .= "Cookie: $cookie\r\n\r\n";
  100.             $out .= $header;
  101.         }

  102.         $fpflag = 0;
  103.         if (!$fp = @fsocketopen(($scheme == 'https' ? 'ssl' : $scheme) . '://' . ($scheme == 'https' ? $host : ($ip ? $ip : $host)), $port, $errno, $errstr, $timeout)) {
  104.             $context = array(
  105.                 'http' => array(
  106.                     'method' => $post ? 'POST' : 'GET',
  107.                     'header' => $header,
  108.                     'content' => $post,
  109.                     'timeout' => $timeout,
  110.                 ),
  111.             );
  112.             $context = stream_context_create($context);
  113.             $fp = @fopen($scheme . '://' . ($scheme == 'https' ? $host : ($ip ? $ip : $host)) . ':' . $port . $path, 'b', false, $context);
  114.             $fpflag = 1;
  115.         }

  116.         if (!$fp) {
  117.             return '';
  118.         } else {
  119.             stream_set_blocking($fp, $block);
  120.             stream_set_timeout($fp, $timeout);
  121.             @fwrite($fp, $out);
  122.             $status = stream_get_meta_data($fp);
  123.             if (!$status['timed_out']) {
  124.                 while (!feof($fp) && !$fpflag) {
  125.                     if (($header = @fgets($fp)) && ($header == "\r\n" || $header == "\n")) {
  126.                         break;
  127.                     }
  128.                 }

  129.                 $stop = false;
  130.                 while (!feof($fp) && !$stop) {
  131.                     $data = fread($fp, ($limit == 0 || $limit > 8192 ? 8192 : $limit));
  132.                     $return .= $data;
  133.                     if ($limit) {
  134.                         $limit -= strlen($data);
  135.                         $stop = $limit <= 0;
  136.                     }
  137.                 }
  138.             }
  139.             @fclose($fp);
  140.             return $return;
  141.         }
  142.     }

  143.     function array2string($arr)
  144.     {
  145.         $s = $sep = '';
  146.         if ($arr && is_array($arr)) {
  147.             foreach ($arr as $k => $v) {
  148.                 $s .= $sep . addslashes($k) . UC_ARRAY_SEP_1 . $v;
  149.                 $sep = UC_ARRAY_SEP_2;
  150.             }
  151.         }
  152.         return $s;
  153.     }

  154.     function string2array($s)
  155.     {
  156.         $arr = explode(UC_ARRAY_SEP_2, $s);
  157.         $arr2 = array();
  158.         foreach ($arr as $k => $v) {
  159.             list($key, $val) = explode(UC_ARRAY_SEP_1, $v);
  160.             $arr2[$key] = $val;
  161.         }
  162.         return $arr2;
  163.     }
  164. }

  165. ?>
复制代码



分享至 : QQ空间
收藏

0 个回复

您需要登录后才可以回帖 登录 | 立即注册