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

牽著老婆滿街逛

嚴以律己,寬以待人. 三思而后行.
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>
            国产亚洲欧美aaaa| 亚洲电影在线免费观看| 久久久久.com| 国产一级精品aaaaa看| 午夜欧美不卡精品aaaaa| 久久国产精品久久久久久| 国产亚洲永久域名| 老牛嫩草一区二区三区日本 | 亚洲国产一区在线| 精品成人一区二区| 欧美日韩直播| 欧美自拍偷拍| 亚洲精选中文字幕| 香港久久久电影| 亚洲国产乱码最新视频| 国产精品成人观看视频免费| 久久激情视频免费观看| 亚洲理论电影网| 久久综合久久综合九色| 艳女tv在线观看国产一区| 国产欧美在线观看| 欧美日韩国产综合网| 久久免费99精品久久久久久| 一本久久青青| 欧美激情第3页| 亚洲人成网站在线观看播放| 亚洲一区二区三区在线看| 曰韩精品一区二区| 国产精品每日更新| 欧美黄色小视频| 久久免费一区| 欧美伊人久久久久久午夜久久久久 | 99成人精品| 欧美成人黄色小视频| 久久九九99视频| 性伦欧美刺激片在线观看| 亚洲日韩欧美视频| 亚洲成色777777在线观看影院| 国产精品成av人在线视午夜片| 毛片一区二区三区| 久久婷婷国产综合国色天香| 午夜日韩av| 亚洲一区二区三区精品视频 | 麻豆成人在线播放| 久久美女性网| 久久精品成人欧美大片古装| 午夜天堂精品久久久久| 亚洲淫性视频| 亚洲男人第一av网站| 亚洲一区一卡| 亚洲欧美激情一区二区| 亚洲制服少妇| 亚洲一区三区在线观看| 亚洲影院色在线观看免费| 亚洲视频导航| 午夜日韩视频| 久久国产免费| 蜜桃视频一区| 免费av成人在线| 欧美激情黄色片| 亚洲激情网址| aⅴ色国产欧美| 亚洲自拍偷拍视频| 久久精品人人爽| 欧美成人免费全部观看天天性色| 欧美成人按摩| 国产精品v欧美精品v日本精品动漫| 欧美日韩高清一区| 国产精品青草综合久久久久99| 国产日韩欧美综合一区| 在线播放亚洲| 99精品视频免费全部在线| 亚洲免费影视| 久久综合亚州| 亚洲美女精品一区| 午夜精品福利一区二区三区av| 欧美国产三区| 亚洲精品美女久久7777777| 国产亚洲精品一区二区| 亚洲国产91| 亚洲永久免费| 另类天堂视频在线观看| 91久久综合| 亚洲一级黄色片| 免费在线观看成人av| 国产精品成人观看视频国产奇米| 国产一区二区三区视频在线观看| 亚洲高清在线| 欧美一级专区免费大片| 欧美1区视频| 亚洲一区国产| 欧美精品一区在线发布| 国产亚洲福利| 亚洲桃色在线一区| 欧美成人在线免费观看| 亚洲一级免费视频| 欧美黄色影院| 国内精品伊人久久久久av影院| 一区二区三区久久久| 久久这里只有| 亚洲作爱视频| 美女久久一区| 激情欧美一区二区三区| 亚洲主播在线| 91久久精品国产91久久| 久久久久久久国产| 国产女优一区| 亚洲免费小视频| av成人老司机| 欧美激情综合网| 亚洲国产一区二区视频| 久久国产欧美| 亚洲免费网址| 国产精品欧美一区喷水| 亚洲综合视频网| 99re6这里只有精品| 欧美二区在线播放| 亚洲激情在线视频| 欧美.www| 裸体一区二区| 亚洲人成人99网站| 欧美99久久| 久久综合九色综合久99| 韩国一区电影| 女同一区二区| 久久久在线视频| 在线看成人片| 欧美高清你懂得| 欧美激情综合五月色丁香| 99视频精品| 亚洲一区二区网站| 国产色视频一区| 久久人人超碰| 久久一区二区三区av| 在线观看一区视频| 欧美激情精品久久久久久变态| 亚洲精品一区二区三区99| 91久久久久久久久| 欧美日韩在线不卡一区| 亚洲图中文字幕| 亚洲欧美在线高清| 在线观看日韩精品| 亚洲精品久久久久中文字幕欢迎你 | 亚洲精品中文在线| aaa亚洲精品一二三区| 国产伦精品一区二区三区高清| 久久精品色图| 你懂的亚洲视频| 亚洲欧美视频| 久久久精品一区| av成人免费在线观看| 午夜精品福利一区二区蜜股av| 亚洲国产高潮在线观看| 99精品久久久| 激情综合视频| 亚洲精选在线| 国产亚洲欧美一区| 亚洲黄色影院| 国产一区二区日韩精品欧美精品| 美女性感视频久久久| 欧美日韩中文字幕在线| 久久综合999| 欧美视频中文字幕在线| 久久综合国产精品| 欧美午夜精品久久久久久人妖| 欧美资源在线观看| 欧美激情一区| 久久久97精品| 欧美午夜一区二区三区免费大片| 香蕉乱码成人久久天堂爱免费| 麻豆精品网站| 欧美一级夜夜爽| 欧美日韩伦理在线| 免费观看成人鲁鲁鲁鲁鲁视频| 国产精品av久久久久久麻豆网| 女生裸体视频一区二区三区| 国产精品综合av一区二区国产馆| 欧美激情第10页| 国内视频一区| 午夜精品久久久久影视| 中国成人黄色视屏| 欧美成人一区二免费视频软件| 久久精品视频在线播放| 国产精品v日韩精品v欧美精品网站| 欧美成人情趣视频| 国产综合在线视频| 午夜精品久久久久久久久久久| 一区二区三区欧美在线观看| 玖玖玖免费嫩草在线影院一区| 久久国产精品久久国产精品| 欧美日韩大陆在线| 亚洲日本一区二区三区| 亚洲国产成人av好男人在线观看| 香蕉久久夜色精品国产使用方法| 亚洲一区二区精品| 中国女人久久久| 一区二区三区精密机械公司| 欧美激情第4页| 亚洲国产免费| 亚洲精品老司机|