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

牽著老婆滿街逛

嚴以律己,寬以待人. 三思而后行.
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>
            久久午夜精品| 欧美成人免费小视频| 久久国产精品99国产| 亚洲午夜激情网站| 亚洲欧美国产一区二区三区| 亚洲一区二区三区中文字幕在线| 99re成人精品视频| 中文国产成人精品久久一| 亚洲一区二区免费| 久久久精品国产一区二区三区| 久久精品亚洲一区| 欧美成人免费va影院高清| 亚洲第一精品夜夜躁人人躁| 欧美.www| 在线观看一区二区视频| 久久久精品国产一区二区三区 | 国产在线日韩| 欲香欲色天天天综合和网| 亚洲茄子视频| 亚洲免费在线视频一区 二区| 亚洲砖区区免费| 欧美不卡一卡二卡免费版| 亚洲人体一区| 久久久久久亚洲精品不卡4k岛国| 男女激情视频一区| 国产久一道中文一区| 亚洲春色另类小说| 午夜在线一区二区| 亚洲精品一区二区三区蜜桃久 | 国产亚洲一本大道中文在线| 亚洲第一黄网| 午夜精品久久久久久久蜜桃app| 欧美xxx在线观看| 亚洲性感激情| 欧美日韩国产999| 亚洲国产裸拍裸体视频在线观看乱了中文| 中日韩美女免费视频网站在线观看| 久久久精品国产免费观看同学| 一区二区三区|亚洲午夜| 久久午夜电影| 国内精品视频在线播放| 国产精品高潮呻吟| 在线精品亚洲一区二区| 欧美怡红院视频一区二区三区| 亚洲欧洲一区二区在线播放| 久久岛国电影| 国产欧美婷婷中文| 午夜天堂精品久久久久| 最新中文字幕一区二区三区| 久久综合九色欧美综合狠狠| 国产日韩欧美在线视频观看| 一区二区三区四区国产| 最近看过的日韩成人| 久久人人97超碰精品888| 国产亚洲精品自拍| 性色一区二区| 亚洲一区二区在线| 国产精品亚洲视频| 午夜精品影院| 午夜欧美电影在线观看| 国产欧美一区二区精品婷婷 | 亚洲欧美日韩一区| 日韩视频免费大全中文字幕| 欧美精品在线一区二区三区| 日韩视频免费看| 日韩一级片网址| 国产精品久久久久999| 小辣椒精品导航| 欧美在线黄色| 亚洲国产你懂的| 亚洲激情婷婷| 欧美手机在线视频| 亚洲欧美综合| 久久精品最新地址| 亚洲品质自拍| 亚洲午夜激情免费视频| 国产一区二区久久| 亚洲福利av| 国产精品福利网站| 久久久久www| 免费日韩视频| 亚洲免费在线观看| 久久av二区| 亚洲人体大胆视频| 亚洲视频久久| 在线精品国产成人综合| 亚洲精品一区中文| 国产日韩精品久久| 亚洲国产精品免费| 国产伦精品一区二区三区免费迷 | 国产精品无码永久免费888| 久久精彩免费视频| 欧美69视频| 欧美在线黄色| 欧美高清在线精品一区| 国产美女一区| 亚洲午夜激情免费视频| 国产一区二区久久| 亚洲九九九在线观看| 国产精品一区二区视频| 欧美国产在线观看| 国产精品毛片a∨一区二区三区|国| 久久久久久网址| 欧美视频一区二区三区四区| 久久综合99re88久久爱| 欧美特黄一级大片| 欧美电影资源| 国产一区二区三区久久| 日韩午夜在线| 亚洲欧洲一区二区三区| 久久不见久久见免费视频1| 在线视频欧美日韩| 欧美顶级大胆免费视频| 久久亚洲春色中文字幕久久久| 欧美午夜宅男影院| 亚洲精品色婷婷福利天堂| 国内激情久久| 亚洲欧美日韩在线高清直播| 9久草视频在线视频精品| 久久中文字幕一区| 久久久久九九视频| 国产日韩在线看片| 亚洲一区三区电影在线观看| 亚洲日韩欧美视频一区| 久久蜜桃精品| 久久久久久日产精品| 国产欧美视频一区二区| 亚洲婷婷国产精品电影人久久| 亚洲欧洲综合另类在线| 久久米奇亚洲| 欧美jizzhd精品欧美喷水 | 欧美视频一二三区| 最新日韩中文字幕| 夜夜精品视频| 欧美日韩国产高清视频| 亚洲精品乱码| 中文av字幕一区| 国产精品久久久久久久久借妻| 亚洲人永久免费| 国产精品99久久久久久www| 欧美人成在线视频| 亚洲精品网站在线播放gif| 国产精品99久久久久久久久久久久 | 国产精品美女久久久久久久| 亚洲精品偷拍| 亚洲一区二区毛片| 国产伦精品一区二区三| 欧美在线视频免费播放| 免费不卡视频| 日韩视频在线观看国产| 欧美国产日韩一区二区三区| 日韩视频一区二区| 亚洲欧美日本国产有色| 国产一区二区三区高清在线观看| 久久精品一区二区三区四区| 亚洲第一毛片| 欧美性天天影院| 国产精品国色综合久久| 亚洲图片欧美日产| 欧美在线视频二区| 欧美精品二区| 悠悠资源网久久精品| 狠狠88综合久久久久综合网| 亚洲欧美日韩国产一区二区三区 | 久久亚洲国产精品日日av夜夜| 亚洲视频播放| 精品9999| 日韩午夜在线电影| 国产日产欧美精品| 久久久亚洲精品一区二区三区| 欧美一级成年大片在线观看| 在线精品在线| 亚洲主播在线播放| 亚洲精品欧美在线| 99精品热视频| 久久九九久久九九| 国产欧美一级| 亚洲一区二区免费看| 欧美一区二区在线看| 亚洲国产精品精华液2区45| 国产精品久久久久婷婷| 美日韩免费视频| 午夜精品一区二区三区四区 | 午夜久久福利| 亚洲黄一区二区三区| 国产日韩欧美夫妻视频在线观看| 欧美激情成人在线| 欧美一区二区黄| 一区二区日韩欧美| 亚洲精品乱码久久久久久日本蜜臀 | 欧美制服丝袜第一页| 99国产精品久久久| 欧美黄色片免费观看| 久久精品国语| 午夜视频一区在线观看| 亚洲天堂av综合网| 一本色道久久88亚洲综合88| 亚洲国产高清自拍| 在线观看欧美日本| 樱桃视频在线观看一区|