在 QQ 已经登录的情况下,手动输入网址打开 QQ 邮箱 或者 QQ 空间 等腾讯网站,可以看到网页已经检测到本地 QQ 客户端已经登录,于是用户可以很方便地一键登录网站而不必再输入用户名密码。
这实际上是典型的异构系统单点登录 SSO(single-sign-on)技术。&网页怎么会知道我登录的 QQ 号码?&腾讯是如何实现的呢?
网上有很多猜测,比如:
QQ 登录时在本地某地方存登录 ID 信息(Cookie 或文件),用 js 读,然后去服务器认证。但是现在的浏览器一般有沙箱功能,js 无法读到登录 ID;而且在清空 Cookie 后依然起作用。
以 IP、CPU ID、硬盘 ID 等硬件设备 hash 做唯一标识,QQ 登录时在服务器记录此信息,js 验证。感觉这样依赖环境过多,QQ 不太可能采用此方法。
QQ 启动某端口***,js 连接此端口。但是用 netstat 查看后,QQ 并没有***端口。
有这么一个神奇的链接,你一点开,它就检测到你登录了 QQ。通过查看页面源代码,我们可以发现一个文件,这段代码中,描述了使用 ActivexObject 浏览器插件的过程,于是一切了然。
可是 ActiveX 是 IE 的插件呀,我们使用 Chrome 或者 FireFox 也是可以直接登录的,这是怎么回事呢?
原来,QQ 使用了历史很悠久的 NPAPI(Netscape Plugin Application Programming Interface)接口。NPAPI 几乎支持所有主流浏览器,包括 FireFox、Chrome、Opera(IE 从 5.5 后停止支持 NPAPI,转而使用 ActiveX)。
打开 chrome://plugins/ 我们可以发现自动登录的有关插件,而在路径 C:\Program Files (x86)\Common Files\Tencent\TXSSO 下就可以找到关于 SSO 的相关动态链接库。
np 插件一般命名都会加np前缀 如 QQ 的这个 npSSOAxCtrlForPTLogin.dll,只要按照标准的写法(),放在浏览器会加载的地方,用的时候写个标签就可以在 js 里面调用了。于是跨浏览器(无视 IE)的插件开发变得相当可行。运行在 NPAPI 插件中的代码拥有当前用户的所有权限,不在沙箱中运行,所以它的扩展程序在被 Chrome 网上应用店接受前要求人工审核。(不过今年年底Chrome将完全移除对NPAPI的支持,转而推广自己的NACL)@
有点不怀好意的想法开始萌生,我自己的网站能否借用这个插件来检测用户的 QQ 登录呢?
由于本地打开此页面,create ActiveXObject 会加载失败。腾讯在 dll 中就对域名进行了限制,网页是无法篡改的。须改本地host文件,加一条:
127.0.0.1 xui.
&!DOCTYPE html&
&meta charset="utf-8"&
&title&Tencent SSO Testing&/title&
var g_vOptD
var mylocation= "xui./cgi-bin1/qlogintest.html";
var pt = {
ishttps: false,
low_login: 0,
keyindex: 9,
init: function()
pt.ishttps = /^https/.test(mylocation);
//if (navigator.mimeTypes["application/nptxsso"]) {
var B = document.createElement("embed");
B.type = "application/nptxsso";
B.style.width = "0px";
B.style.height = "0px";
document.body.appendChild(B);
pt.sso = B
pt.init();
if (window.ActiveXObject)
q_hummerQtrl = new ActiveXObject("SSOAxCtrlForPTLogin.SSOForPTLogin2");
var A = q_hummerQtrl.CreateTXSSOData();
q_hummerQtrl.InitSSOFPTCtrl(0, A);
g_vOptData = q_hummerQtrl.CreateTXSSOData()
hummer_loaduin();
} catch(B) {
alert(/create ActiveXObject failed/)
function hummer_loaduin()
if (window.ActiveXObject)
var Y = q_hummerQtrl.DoOperation(1, g_vOptData);
if (null == Y) {
var T = Y.GetArray("PTALIST");
var c = T.GetSize();
var X = "";
for (var d = 0; d & d++)
var E = T.GetData(d);
var a = E.GetDWord("dwSSO_Account_dwAccountUin");
var J = "";
var O = E.GetByte("cSSO_Account_cAccountType");
if (O == 1)
J = E.GetArray("SSO_Account_AccountValueList");
b = J.GetStr(0)
} catch(Z) {}
var Q = 0;
Q = E.GetWord("wSSO_Account_wFaceIndex")
} catch(Z) {
var S = "";
S = E.GetStr("strSSO_Account_strNickName")
} catch(Z) {
var F = E.GetBuf("bufGTKey_PTLOGIN");
var G = E.GetBuf("bufST_PTLOGIN");
var N = "";
var A = G.GetSize();
for (var W = 0; W & A; W++) {
var B = G.GetAt(W).toString("16");
if (B.length == 1) {
B = "0" + B
var str = "QQinfo\r\n"+
"uin:" + M['uin']+"\r\n"+
"name:"+M['name']+"\r\n"+
"type:"+M['type']+"\r\n"+
"face:"+M['face']+"\r\n"+
"nick:"+M['nick']+"\r\n"+
"key:"+M['key']+"\r\n";
alert(str);
q_aUinList[d] = M
} catch(Z) {}
var M = pt.
var L = M.InitPVA();
if (L != false)
var I = M.GetPVACount();
for (var W = 0; W & I; W++)
var C = M.GetUin(W);
var D = M.GetAccountName(W);
var K = M.GetFaceIndex(W);
var U = M.GetNickname(W);
var P = M.GetGender(W);
var V = M.GetUinFlag(W);
var f = M.GetGTKey(W);
var R = M.GetST(W);
var str = "QQinfo\r\n"+
"uin:" + C +"\r\n"+
"name:"+D+"\r\n"+
"face:"+K +"\r\n"+
"nick:"+U+"\r\n"+
"key:"+f+"\r\n";
alert(str);
} catch(Z) {}
Views(...) Comments()版本灰度更新至2.7.0.4218,本次更新包含2.6及2.7版本内容。
版本灰度更新至2.7.0.4218,本次更新包含2.6及2.7版本内容。
最新版本的TGP增加了“我的皮肤,对线提醒,天赋推荐”三项新功能。让我们一起来看看新功能的独到之处吧
功能直通车
新游关注榜
腾讯游戏平台
腾讯游戏特权礼包
腾讯游戏福利 TGP
游戏加速 LOL助手 LOL官方盒子 CF助手
免费网络加速
腾讯游戏平台
腾讯游戏特权礼包
腾讯游戏福利 TGP
游戏加速 LOL助手 LOL官方盒子 CF助手
免费网络加速
腾讯游戏平台
腾讯游戏特权礼包
腾讯游戏福利 TGP
游戏加速 LOL助手 LOL官方盒子 CF助手
免费网络加速
腾讯游戏平台
腾讯游戏特权礼包
腾讯游戏福利 TGP
游戏加速 LOL助手 LOL官方盒子 CF助手
免费网络加速
腾讯游戏平台
腾讯游戏特权礼包
腾讯游戏福利 TGP
游戏加速 LOL助手 LOL官方盒子 CF助手
免费网络加速
腾讯游戏平台
腾讯游戏特权礼包
腾讯游戏福利 TGP
游戏加速 LOL助手 LOL官方盒子 CF助手
免费网络加速
腾讯游戏平台
腾讯游戏特权礼包
腾讯游戏福利 TGP
游戏加速 LOL助手 LOL官方盒子 CF助手
免费网络加速
腾讯游戏特权礼包
腾讯游戏福利
免费网络加速
腾讯游戏特权礼包
腾讯游戏福利
免费网络加速
腾讯游戏特权礼包
腾讯游戏福利
免费网络加速
腾讯游戏特权礼包
腾讯游戏福利
免费网络加速
扫一扫下载掌上TGP新闻资料载入中……
新品测试表