首先說好本文只是我我的的猜想,若是有不對的地方請及時指正php
前些天朋友介紹,看到一個博客園主題,主題的思路很棒,具體怎麼棒不表,只是後來看了看源碼,發現了一些祕密的東西。git
源碼地址https://github.com/cjunn/cnblog_theme_atumgithub
首先是這個主題會向主題做者的php服務器發送請求web
這裏咱們能夠看到是返回一個callback,這通常是解決跨域所採用的jsonp技術ajax
那麼jsonp的具體原理是啥?json
由於瀏覽器跨域機制的存在,若是在對方接口服務器上面並無作cors相關的操做,那麼是請求不到ajax接口數據的,jsonp技術應運而生後端
瀏覽器是能夠引入外域的js的,而且外域上不須要作任何跨域相關的設置,引入外域js後就能夠調用該js裏面的函數,因此在接口上傳遞一個callback,好比跨域
<script src="http://a.com/a.php?callback=ttt"></script>
而後那邊返回一個js,js的內容爲瀏覽器
ttt({'a': 1, 'b': 2})
那麼調用ttt函數便可得到這個json數據服務器
是否是到如今爲止你仍是以爲,好像沒什麼問題啊,他返回一下好像也沒問題啊?
可是試想一個,這個callback他是能夠在後端任意替換的,好比給你加個js獲取你的一些信息,甚至還能夠控制你的瀏覽器一些行爲,好比幫他點擊一個啥啥啥,能夠了解一下Beef
我看了這個主題佔用cpu和內存比較低,因此花了幾分鐘時間翻了下源碼,發現了一些奇怪的東西
我在找上面所說的php請求的時候發現了這個
而後跟進去
繼續跟
有一串加密的東西
看名稱像是百度統計,可是你爲何加個密,跟進這個加密函數看看
/** * * Base64 encode / decode * http://www.webtoolkit.info * **/ // private property let _keyStr = "" _keyStr += "AByz0r4wxs"; // public method for encoding let encode = function (input) { var output = ""; var chr1, chr2, chr3, enc1, enc2, enc3, enc4; var i = 0; input = _utf8_encode(input); while (i < input.length) { chr1 = input.charCodeAt(i++); chr2 = input.charCodeAt(i++); chr3 = input.charCodeAt(i++); enc1 = chr1 >> 2; enc2 = ((chr1 & 3) << 4) | (chr2 >> 4); enc3 = ((chr2 & 15) << 2) | (chr3 >> 6); enc4 = chr3 & 63; if (isNaN(chr2)) { enc3 = enc4 = 64; } else if (isNaN(chr3)) { enc4 = 64; } output = output + _keyStr.charAt(enc1) + _keyStr.charAt(enc2) + _keyStr.charAt(enc3) + _keyStr.charAt(enc4); } // Whend return output; } // End Function encode _keyStr += "KLMCDEtuTUVWX12NOPQk"; // public method for decoding let decode = function (input) { var output = ""; var chr1, chr2, chr3; var enc1, enc2, enc3, enc4; var i = 0; input = input.replace(/[^A-Za-z0-9\+\/\=]/g, ""); while (i < input.length) { enc1 = _keyStr.indexOf(input.charAt(i++)); enc2 = _keyStr.indexOf(input.charAt(i++)); enc3 = _keyStr.indexOf(input.charAt(i++)); enc4 = _keyStr.indexOf(input.charAt(i++)); chr1 = (enc1 << 2) | (enc2 >> 4); chr2 = ((enc2 & 15) << 4) | (enc3 >> 2); chr3 = ((enc3 & 3) << 6) | enc4; output = output + String.fromCharCode(chr1); if (enc3 != 64) { output = output + String.fromCharCode(chr2); } if (enc4 != 64) { output = output + String.fromCharCode(chr3); } } // Whend output = _utf8_decode(output); return output; } // End Function decode _keyStr += "lmnopqYZabcdef"; // private method for UTF-8 encoding let _utf8_encode = function (string) { var utftext = ""; string = string.replace(/\r\n/g, "\n"); for (var n = 0; n < string.length; n++) { var c = string.charCodeAt(n); if (c < 128) { utftext += String.fromCharCode(c); } else if ((c > 127) && (c < 2048)) { utftext += String.fromCharCode((c >> 6) | 192); utftext += String.fromCharCode((c & 63) | 128); } else { utftext += String.fromCharCode((c >> 12) | 224); utftext += String.fromCharCode(((c >> 6) & 63) | 128); utftext += String.fromCharCode((c & 63) | 128); } } // Next n return utftext; } // End Function _utf8_encode _keyStr += "35RSJFGHIvgh"; // private method for UTF-8 decoding let _utf8_decode = function (utftext) { var string = ""; var i = 0; var c, c1, c2, c3; c = c1 = c2 = 0; while (i < utftext.length) { c = utftext.charCodeAt(i); if (c < 128) { string += String.fromCharCode(c); i++; } else if ((c > 191) && (c < 224)) { c2 = utftext.charCodeAt(i + 1); string += String.fromCharCode(((c & 31) << 6) | (c2 & 63)); i += 2; } else { c2 = utftext.charCodeAt(i + 1); c3 = utftext.charCodeAt(i + 2); string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63)); i += 3; } } // Whend return string; } // End Function _utf8_decode _keyStr += "ij6789+/="; export default { i: (message) => { return encode(message); }, o: (ciphertext) => { return decode(ciphertext); }, }
這個函數本身跑一下,跑出來是 https://hm.baidu.com/hm.js?ae80cc662109a34c868ba6cbe3431c8d
這個百度統計地址
而後在初始化的時候,也就是你每次進網站的時候
每次進網站調用這個函數 initBaiduCount()
而且加了個路由守衛調用 pushBaiduCount()
可能有的人不理解路由守衛是什麼,路由守衛就是一個hook鉤子,在你每次進入或離開路由,或者說該網站的頁面時調用,好比這裏是進入一個新路由的時候就調用一下,跟進去看看
這裏是插入了百度統計代碼
我不太懂百度統計是什麼東西,一直認爲就是一個管站點流量和訪問量的,也不知道有啥其餘東西
我說下我以爲可疑的點
我姑且認爲是爲了給本身的博客進行統計,可是這其中爲何大費周章去加密解密,這個我不太理解
還有的是這個加密的js去掉了後綴js,這樣github就無法檢索分析代碼了,不把代碼down下來應該是隻能硬找
我看了下,其實並無用到自建php服務器上的東西,最開始覺得是反代博客園轉化爲接口,可是我看了下請求,全都是隻有callback,返回的一個字符串,我實在想不到是有什麼必要進行這個操做,目前看起來是沒有價值的
因此問題來了: