青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

牽著老婆滿街逛

嚴以律己,寬以待人. 三思而后行.
GMail/GTalk: yanglinbo#google.com;
MSN/Email: tx7do#yahoo.com.cn;
QQ: 3 0 3 3 9 6 9 2 0 .

騰訊的網站如何檢測到你的 QQ 已經登錄?

轉載自:http://www.lovelucy.info/tencent-sso.html

在 QQ 已經登錄的情況下,手動輸入網址打開 QQ 郵箱 或者 QQ 空間 等騰訊網站,可以看到網頁已經檢測到本地 QQ 客戶端已經登錄,于是用戶可以很方便地一鍵登錄網站而不必再輸入用戶名密碼。這實際上是典型的異構系統單點登錄 SSO(single-sign-on)技術。網頁怎么會知道我登錄的 QQ 號碼?騰訊是如何實現的呢?

Qzone_AutoLogin

QQMail_AutoLogin

網上有很多猜測,比如——

  • QQ 登錄時在本地某地方存登錄 ID 信息(Cookie 或文件),用 js 讀,然后去服務器認證。但是現在的瀏覽器一般有沙箱功能,js 無法讀到登錄 ID;而且在清空 Cookie 后依然起作用。
  • 以 IP、CPU ID、硬盤 ID 等硬件設備 hash 做唯一標識,QQ 登錄時在服務器記錄此信息,js 驗證。感覺這樣依賴環境過多,QQ 不太可能采用此方法。
  • QQ 啟動某端口監聽,js 連接此端口。但是用 netstat 查看后,QQ 并沒有監聽端口。

有這么一個神奇的鏈接,http://xui.ptlogin2.qq.com/cgi-bin/qlogin 你一點開,它就檢測到你登錄了 QQ。通過查看頁面源代碼,我們可以發現一個關于 ptlogin 的 js 文件,這段代碼中,描述了使用 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 的相關動態鏈接庫。

Tencent_SSO_plugin

np 插件一般命名都會加np前綴 如 QQ 的這個 npSSOAxCtrlForPTLogin.dll,只要按照標準的寫法,放在瀏覽器會加載的地方,用的時候寫個標簽就可以在 js 里面調用了。于是跨瀏覽器(無視 IE)的插件開發變得相當可行。運行在 NPAPI 插件中的代碼擁有當前用戶的所有權限,不在沙箱中運行,所以它的擴展程序在被 Chrome 網上應用店接受前要求人工審核。

有點不懷好意的想法開始萌生,我自己的網站能否借用這個插件來檢測用戶的 QQ 登錄呢?寫個頁面測試一下。

<!DOCTYPE html>
            <html>
            <head>
            <meta charset="utf-8">
            <title>Tencent SSO Testing</title>
            </head>
            <body>
            <script>
            var g_vOptData;
            var mylocation= "xui.ptlogin2.qq.com/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();
             
            try {
            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) {
            return
            }
            try
            {
            var T = Y.GetArray("PTALIST");
            var c = T.GetSize();
            var X = "";
            for (var d = 0; d < c; d++)
               {
                var E = T.GetData(d);
                var a = E.GetDWord("dwSSO_Account_dwAccountUin");
                var J = "";
                var O = E.GetByte("cSSO_Account_cAccountType");
                var b = a;
                if (O == 1)
                {
                 try
                 {
                  J = E.GetArray("SSO_Account_AccountValueList");
                  b = J.GetStr(0)
                 } catch(Z) {}
                }
                var Q = 0;
                try {
                Q = E.GetWord("wSSO_Account_wFaceIndex")
                } catch(Z) {
                Q = 0
                }
                var S = "";
                try {
                S = E.GetStr("strSSO_Account_strNickName")
                } catch(Z) {
                S = ""
                }
                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
                }
                N += B
                }
                var M = {
                 uin: a,
                 name: b,
                 type: O,
                 face: Q,
                 nick: S,
                 key: N
                };
                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) {}
              } else
              {
              try {
               var M = pt.sso;
               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) {}
              }
             
            }
            </script>
            </body>
            </html>

本地打開此頁面,create ActiveXObject 失敗。騰訊必然在 dll 中就對域名進行了限制,網頁是無法篡改的。于是修改本地host文件,加一條:

127.0.0.1 xui.ptlogin2.qq.com

再用 xui.ptlogin2.qq.com 這個域名去訪問本地的這個 html,果然,可以正常拿到 QQ 相關信息。

TencentSsoTesting

好吧,這個截圖被我打碼打得沒啥意義了

PS. Chrome 瀏覽器自帶的開發者工具有一個功能可以格式化被壓縮的 js 代碼,十分好用。廢話不多說,有圖說明一切——

pretty_print_js_google_chrome

參考鏈接:
http://1.lanz.sinaapp.com/?p=152
http://taurus-ly.com/articles/2012/02/153.html

posted on 2014-02-24 14:15 楊粼波 閱讀(1055) 評論(0)  編輯 收藏 引用

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲欧洲一区二区天堂久久| 欧美三区在线观看| 国产午夜久久| 久久精品视频免费观看| 久久精品在线视频| 欧美日韩视频一区二区三区| 亚洲久久一区| 亚洲免费观看高清完整版在线观看熊| 欧美亚洲一区| 亚洲免费一区二区| 国产一区二区久久久| 欧美不卡在线视频| 欧美国产综合| 欧美一区二区私人影院日本| 久久久精品网| 一区二区三区.www| 午夜精品成人在线视频| 亚洲高清影视| 中国成人黄色视屏| 狠久久av成人天堂| 亚洲免费久久| 激情久久中文字幕| 亚洲美女黄网| 国产亚洲综合精品| 亚洲精品国产精品乱码不99| 欧美性色综合| 欧美国产在线观看| 国产精品少妇自拍| 欧美成在线观看| 国产精品女人毛片| 欧美激情性爽国产精品17p| 欧美午夜激情在线| 亚洲国产岛国毛片在线| 国产伦精品一区二区三区免费迷| 欧美国产在线电影| 好吊色欧美一区二区三区四区| 亚洲精品视频一区| 激情偷拍久久| 亚洲综合视频在线| 99精品欧美一区| 久久精品中文字幕免费mv| 亚洲一区二区av电影| 老司机一区二区| 久久精品人人爽| 欧美视频中文在线看| 亚洲成人在线网| 黄色工厂这里只有精品| 亚洲午夜一区二区三区| 99国产精品| 毛片av中文字幕一区二区| 久久精品国产一区二区三区| 欧美日韩一区二区在线播放| 亚洲国产精品美女| 亚洲福利专区| 久久男女视频| 久久久久免费视频| 国产亚洲精品一区二555| 一本到高清视频免费精品| 日韩写真视频在线观看| 欧美成人国产| 亚洲国产精品女人久久久| 亚洲国产美女| 免费不卡在线观看| 亚洲高清电影| 亚洲美女免费精品视频在线观看| 欧美xart系列高清| 欧美日韩在线视频一区二区| 亚洲激情国产| 亚洲最新色图| 欧美日韩一区二区欧美激情| 国产亚洲精久久久久久| 久久精品亚洲精品| 国产一级一区二区| 久久精品1区| 免费在线观看精品| 亚洲区第一页| 欧美日韩一级黄| 国产精品99久久久久久白浆小说| 亚洲一区二区久久| 国产精品欧美精品| 欧美专区在线| 欧美国产日韩一区二区三区| 亚洲伦理在线| 国产精品久久久久一区二区| 亚洲欧美日韩一区二区三区在线观看 | 欧美一级专区| 国产三级欧美三级日产三级99| 性欧美大战久久久久久久久| 久久乐国产精品| 亚洲激情国产精品| 欧美日韩免费一区| 亚洲欧美日韩国产综合| 浪潮色综合久久天堂| 亚洲美女精品成人在线视频| 国产精品男女猛烈高潮激情| 久久本道综合色狠狠五月| 欧美黄色大片网站| 亚洲欧美日本国产有色| 狠狠色综合日日| 欧美日韩国产欧| 香蕉乱码成人久久天堂爱免费 | 亚洲精品国精品久久99热| 欧美日韩一区二区视频在线观看| 欧美亚洲网站| 亚洲欧洲一区二区在线播放| 欧美一级网站| 亚洲三级毛片| 国产亚洲精品成人av久久ww| 欧美国产另类| 久久狠狠亚洲综合| 一本色道久久99精品综合| 免费看亚洲片| 亚洲男女毛片无遮挡| 亚洲激情视频在线播放| 国产精品专区一| 欧美日韩国产片| 久久久综合网| 午夜欧美大片免费观看| 亚洲免费高清| 亚洲国产福利在线| 老司机精品视频一区二区三区| 亚洲综合色在线| 日韩视频国产视频| 亚洲人成人一区二区三区| 久久久另类综合| 香蕉成人伊视频在线观看| av不卡在线观看| 亚洲国产小视频| 精品动漫3d一区二区三区| 国产精品素人视频| 欧美日韩系列| 欧美日韩伦理在线免费| 91久久精品美女| 影音先锋中文字幕一区二区| 欧美女激情福利| 欧美freesex8一10精品| 久久久噜噜噜久久中文字免| 欧美一区二区三区的| 亚洲一区激情| 亚洲一区二区在线播放| 亚洲夜晚福利在线观看| 中文国产亚洲喷潮| 亚洲在线视频网站| 亚洲欧美日韩国产另类专区| 午夜一区在线| 性8sex亚洲区入口| 久久国产一区二区| 久久精品国产成人| 久久嫩草精品久久久精品一| 久久乐国产精品| 美女尤物久久精品| 欧美aa在线视频| 欧美精品激情在线| 国产精品v亚洲精品v日韩精品 | 性刺激综合网| 欧美一区影院| 久久人人97超碰人人澡爱香蕉| 久久久久免费| 久久先锋影音| 欧美日韩国产综合久久| 欧美日韩天天操| 国产伦精品一区二区三区免费| 国产手机视频一区二区| 伊人激情综合| 99视频精品| 欧美一级淫片播放口| 欧美99在线视频观看| 亚洲精品视频在线观看免费| 亚洲精品孕妇| 亚洲欧美在线视频观看| 久久精品二区三区| 欧美人与性动交α欧美精品济南到| 国产精品草莓在线免费观看| 狠狠综合久久| 亚洲一区视频| 久久在线免费观看| 亚洲精品一二区| 欧美在线免费播放| 欧美高清在线观看| 国产日韩欧美三级| 亚洲精品欧洲| 久久精品青青大伊人av| 亚洲精品国精品久久99热| 午夜精品视频在线观看| 免费成人网www| 国产乱子伦一区二区三区国色天香| 亚洲高清一二三区| 久久精品人人做人人综合| 亚洲美女精品成人在线视频| 久久久久久网站| 国产精品一区二区久激情瑜伽| 亚洲电影在线观看| 欧美在线在线| 99国产精品国产精品毛片| 亚洲午夜三级在线| 美女主播精品视频一二三四| 亚洲视频在线观看| 欧美日韩黄色大片| 亚洲国产精品激情在线观看| 欧美中文字幕视频|