首页 > 技术分享 > PHPcms
收藏

深究PHPSSO通信失败的原因及解决办法

12/19 16:55
大潇博客 原创文章,转载请标明出处

最近遇到了phpsso显示通信失败的问题,有四个项目同时使用一个phpsso,无奈有两个项目无论怎么设置或配置,依旧通信失败,此时显然已经不是配置或设置的问题了,仔细看了phpcms对于phpsso验证的代码,终于发现了其中的端倪。

首先需要知道,phpsso是pc团队开发的单点登录系统,所以它可以作为独立的系统运行,这样就可以直接在项目的/phpsso_server/目录中找后台控制器和模板,根据路径查询到/phpsso_server/phpcms/modules/admin/applications.php文件为后台“应用管理”的控制器,通信失败也就出自这里,打开文件可知/phpsso_server/phpcms/modules/admin/templates/applications_list.tpl.php文件为显示通信信息的模板,打开模板,在最下方有这么一段ajax方法
这个方法就是获取通信信息的唯一途径,它请求的是模板控制器中的check_status方法,我们来看一下这个方法代码:大致说下这个方法:拿到缓存文件信息,根据模板所传的appid参数,在缓存中获取phpsso后台添加的各个应用的配置参数,拿到需要的参数后经过pc自定义的“sys_auth”加密方法(加密详解请百度)进行加密,然后把被设置项目的url地址和加密后的参数拼接成新的url,调用这个接口进行验证。

事实上,基本所有的phpcms验证接口(深度二开除外)都是根目录下/api/phpsso.php文件,打开这个文件,将近200行的代码读起来也是比较烦的,所以我们不用去管下面的,只看前30代码即可,代码如下:

代码解读:根据后台设置的phpsso参数,实例化member模块下的client类,然后拿到刚才传过来的参数,用client类中的sys_auth方法解密,用解密后得到的参数进行匹配,如果匹配成功,返回1并退出,表示通信成功,另外一种可能就是解密不成功,返回0并退出,表示通信失败。

综上所述,phpsso的通信流程已大致知晓,所以在面对通信失败时,翻来覆去的修改配置可能已经是徒劳了,我在各种修改配置的道路上几乎已经崩溃,但在查看源代码时我发现,加密阶段一切正常,接口调用参数接收也正常,但经过解密处理,也就是上文提到的member模块下的client类中的sys_auth方法,却返回了空,也就意味着解密失败。

随后我想到了网上各种流传的phpcms由于auth_key可泄露的原因导入sql被注入,服务器被植入shell等问题,最近一段时间pc团队针对这个问题进行了安全方面的升级,解密返回空很有可能是加密和解密方法已经不一致了,于是我下载了最新的加密和加密文件(注意:加密函数在/phpsso_server/phpcms/libs/functions/global.func.php文件中),替换了原来的文件,果不其然,通信成功。


总结:如果遇到phpsso通信失败的问题,在确认设置无误后,不妨查看一下phpcms的版本信息,如果版本不一样,那么可能就是phpsso的加密和phpcms的解密方法不一致了。

网上查询了很多关于通信失败的原因及解决办法,均没有提及此点,所有很多东西,还得自己动手去思考。

打赏

阅读排行

大家都在搜

博客维护不易,感谢你的肯定
扫码打赏,建议金额1-10元
  • 15601023311