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

牽著老婆滿街逛

嚴以律己,寬以待人. 三思而后行.
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>
            欧美一级成年大片在线观看| 欧美freesex8一10精品| 国产乱子伦一区二区三区国色天香| 国产日韩欧美在线播放| 亚洲第一精品在线| 亚洲校园激情| 一区二区三区四区国产精品| 蜜臀久久99精品久久久久久9| 久久久精品久久久久| 1024精品一区二区三区| 欧美jizz19hd性欧美| 欧美精品一区二| 在线亚洲伦理| 亚洲永久免费视频| 在线成人免费观看| 亚洲精品视频啊美女在线直播| 欧美亚男人的天堂| 久久精品免费播放| 欧美成人精品h版在线观看| 99国产精品久久久久老师| 亚洲一区二区三区乱码aⅴ| 国内精品久久久久久久影视麻豆| 蜜桃av噜噜一区| 欧美午夜在线视频| 免费成人高清视频| 国产精品成人一区| 欧美大片第1页| 国产精品久久久久久久浪潮网站| 久久性天堂网| 国产精品国产三级国产专区53 | 国产在线欧美| 亚洲激情视频在线| 国模吧视频一区| 在线天堂一区av电影| 伊人天天综合| 亚洲影视在线| 一区二区三区 在线观看视频| 欧美综合第一页| 亚洲免费一级电影| 欧美成人午夜激情在线| 久久久久.com| 国产精品色午夜在线观看| 亚洲电影欧美电影有声小说| 国产精品一二一区| 最近看过的日韩成人| 狠狠色丁香久久综合频道| 洋洋av久久久久久久一区| 亚洲电影免费观看高清完整版在线| 亚洲一本大道在线| 亚洲少妇诱惑| 欧美日韩三级| 91久久在线播放| 尤物yw午夜国产精品视频明星| 亚洲午夜久久久久久久久电影院 | 午夜亚洲性色视频| 欧美三级电影精品| 亚洲伦理网站| 99在线精品观看| 美国十次成人| 欧美成人自拍视频| 国产在线精品一区二区夜色| 亚洲在线一区二区三区| 亚洲欧美视频在线观看| 欧美性猛交xxxx免费看久久久| 欧美激情亚洲一区| 亚洲精品乱码久久久久久蜜桃麻豆 | 欧美一级一区| 国产欧美大片| 亚洲一区二区三区视频播放| 亚洲综合国产激情另类一区| 欧美国产一区二区在线观看| 亚洲国产精品一区二区第一页 | 日韩亚洲一区二区| 免费成人av在线看| 亚洲国产网站| 9色porny自拍视频一区二区| 欧美日韩大陆在线| 亚洲图片激情小说| 午夜一区在线| 国产综合久久久久久鬼色| 久久久久欧美| 亚洲国产精品视频| 亚洲精品一区二区三区福利| 亚洲一区二区三区精品在线观看| 国产精品久久久久久久7电影| 亚洲欧美一区二区激情| 久久精精品视频| 国产综合色产| 欧美大片网址| 亚洲一区三区视频在线观看| 久久久精品国产免费观看同学| 亚洲福利专区| 国产精品成人观看视频免费| 久久xxxx| 亚洲精品在线观| 欧美在线不卡视频| 亚洲精品黄色| 国产日韩欧美成人| 欧美不卡视频| 亚洲欧美日韩一区在线| 欧美国产精品一区| 欧美一区二区三区成人| 亚洲黄色免费电影| 国产精品黄页免费高清在线观看| av成人免费| 欧美电影打屁股sp| 欧美一级视频免费在线观看| 亚洲国产色一区| 国产精品天天摸av网| 免费观看日韩| 午夜在线不卡| 99精品黄色片免费大全| 久久久久久亚洲精品杨幂换脸 | 国产欧美69| 欧美日韩另类综合| 另类酷文…触手系列精品集v1小说| 一区二区欧美视频| 久久人人爽国产| 亚洲欧美美女| 在线亚洲美日韩| 亚洲精品国产精品国自产在线 | 国产亚洲福利| 欧美美女操人视频| 久久久噜噜噜久久中文字免| 亚洲免费视频成人| 亚洲人成77777在线观看网| 国产精品麻豆va在线播放| 久久女同互慰一区二区三区| 午夜精品久久久99热福利| 亚洲日本免费电影| 亚洲国产第一页| 久久最新视频| 久久精品91| 欧美中文在线字幕| 午夜日韩视频| 性色av一区二区三区红粉影视| 亚洲麻豆av| 亚洲精选视频免费看| 91久久线看在观草草青青| 国色天香一区二区| 国产精品永久免费在线| 国产精品va在线| 欧美www在线| 欧美黄色日本| 欧美日韩视频第一区| 欧美日韩国产专区| 欧美日韩影院| 欧美日本中文字幕| 欧美黄色aaaa| 国产精品国产福利国产秒拍| 国产精品久久久久7777婷婷| 国产精品久久久久久亚洲调教 | 欧美激情1区2区3区| 久久看片网站| 欧美成人性网| 欧美日韩国产综合新一区| 欧美日韩亚洲一区二| 国产精品草莓在线免费观看| 欧美午夜宅男影院| 国产精品久久一卡二卡| 国产亚洲欧洲| 亚洲国产成人久久| 在线亚洲伦理| 欧美在线欧美在线| 久久久久国色av免费看影院| 国产精品99久久久久久有的能看 | 亚洲人成久久| 亚洲深夜福利视频| 午夜精品美女自拍福到在线| 久久久噜噜噜久久中文字幕色伊伊| 噜噜噜久久亚洲精品国产品小说| 免费成人高清| 亚洲精品中文字幕女同| 西西裸体人体做爰大胆久久久| 午夜久久久久久| 欧美第一黄网免费网站| 国产精品日韩精品| 在线播放国产一区中文字幕剧情欧美| 亚洲电影在线播放| 亚洲视频在线视频| 蜜臀va亚洲va欧美va天堂| 亚洲美女精品一区| 欧美一区二区三区日韩视频| 欧美福利一区二区| 国产欧美一区二区精品性 | 欧美亚男人的天堂| 亚洲成人在线视频播放| 亚洲桃花岛网站| 久久在线免费观看| 一区二区三区产品免费精品久久75| 午夜一级久久| 欧美特黄一级| 亚洲欧洲一区二区在线播放| 一区二区三区视频在线播放| 久久久久国产精品www| 亚洲黄色在线观看| 久久国产精品电影| 欧美日韩国产三级| 亚洲成人在线网| 久久久久欧美|