当前位置:首页 > CMS教程 > Discuz > 列表

关于discuz ucenter 在解密的时候 ,用uc_authcode或_authcode解不开

发布:smiling 来源: PHP粉丝网  添加日期:2015-09-30 11:10:37 浏览: 评论:0 

关于discuz ucenter 在解密的时候,用uc_authcode或_authcode解不开密码.

吐槽:针对于discuz和ucenter这个东西,个人感觉太复杂,也太垃圾,现在好多网上去搜索的时候基本都是单点登陆,但是这个单点登陆局限性太大,所以我们要做双向登陆就会出现一些问题,下面说一下为何解不开密码.

问题1:为何找不到Example_auth这个cookie名称.

答:每个应用discuz ucenter的时候,都会生成_auth,而前面的Example的意思是说明,除非你自己定义cookie名称叫Example_auth,而当我们去输出cookie的时候,会找到这样的名称:****_auth,这里的星号代表是生成的信息,所以不用去管他,直接将****_auth对应的字符进行解密即可.

问题2:按照问题1中的所说还是解不开密码,返回是空的.

答:这是因为秘钥不对应导致的,这里说明一下,我们在根目录创建的config.inc.php里面有个全局变量UC_KEY这是个秘钥,但是当我们去网站根目录的bbs\config文件夹下面找到配置文件config_ucenter.php中海油一个UC_KEY,但是我们发现,都是UC_KEY但是实际值却不一样,根据他的命名 ,UC_KEY可以很明显的看出是ucenter的秘钥,但是却一样啊。所以说,discuz和ucenter很垃圾啊。

都吧我给搞晕了,这里先不管他,到底是什么key,暂时我们不动他就可以,然后我们找到根目录下的api/uc.php中的synlogin这个方法,然后我们可以看到这句话dsetcookie('auth', authcode("$member[password]\t$member[uid]", 'ENCODE'), $cookietime);这里我就不说是多少行了,代码都被我给弄乱了。我们追踪authcode这个方法,发现这个方法在根目录下的bbs\source\function\function_core.php这个文件里面。因为authcode这个字符串实际就是加密的cookie信息。

然后我们找到authcode这个方法,可以看到$key = md5($key != '' ? $key : getglobal('authkey'));实际上如果你仔细的话,可以看到authcode这个方法在调用的时候根本就没有变量,所以,这里的key是空的,所以使用了getglobal这个东西,但是这个getglobal返回过来的根本不是谁的key(UC和discuz的key都不是这个),呢我们就不管他,你可以使用bug测试,看看这个key到底是哪个秘钥,实际上就是这里出的问题,但是为了保证其不修改人家代码的原则,我们自己修改自己的代码即可。直接在uc.php中的synlogin()方法中添加即可,如下:

if(($member = getuserbyuid($uid, 1))) {

$key = "111111111111111111";//自己定义key,然后在解密的时候直接用这个key就可以了.

dsetcookie('auth', authcode("$member[password]\t$member[uid]", 'ENCODE',  $key) , $cookietime );}

我们在我们自己的页面获取cookie,代码如下:

  1. Yii::import('application.vendor.*'); 
  2.   include_once 'ucenter.php'
  3.   $model = new LoginForm; 
  4.   $key = "111111111111111111";//使用上面自己定义的key就可以了 
  5.  $mm = uc_authcode($_COOKIE['b7R7_2132_auth'], 'DECODE',$key); //phpfensi.com 
  6. print_r($mm); 

至于这里为何有包含的文件,这里我就不说了,在我的博客中有详细介绍yii与discuz双向登陆、注册、退出代码实例。然后我们这里用的uc_authcode方法,在根目录uc_client\client.php文件中。我们可以看出和authcode的代码基本一样,上面我们说过时UC_KEY不一致导致的,这里$key = md5($key ? $key : UC_KEY);可以看到还是有UC_KEY,然后我们去吧这句话替换成如下:

md5("这里是UC_kEY");如果你不知道是哪个KEY,你就自己试试,反正就2个UC_KEY,然后得到的结果就是分2段.

前面是用户密码,后面是用户id这里没有用户名,我们可以根据用户id获取对应的用户名即可。然后我们呢就可以随意操作了。

tips:博客中有关于yii与discuz互通的信息,以及yii与discuz之间通信的步骤代码都会详细记录,不懂的可以发消息给我,经过本人1周多的时间研究把这部分给弄出来了,在此,感谢我的文件mmm.txt呵呵,在测试代码追踪中,mmm.txt记录了我的追踪过程,mmm.txt经过删除,新生成不下上百遍。

Tags: discuz解密 uc_authcode _authcode

分享到: