123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455 |
- (function(window, undifined) {
- var httphijack = function() {},
-
- mCheckMap = {},
-
- mCheckID = 0;
-
- var whiteList = [
- 'test.iamberry.com',
- 'w.iamberry.com',
- 'res.wx.qq.com',
- 'static.iamberry.com',
- 's.iamberry.com',
- 'h5.iamberry.com'
- ];
-
- var blackList = [
- '192.168.1.0'
- ];
-
- var keywordBlackList = [
- 'xss',
- 'embed_v3',
- '_embed_v3',
- '_embed_v3_dc',
- '_embed_v3_hd_l',
- '_embed_v3_hd_c',
- '_embed_v3_hd_r',
- '_embed_v3_frmc',
- '_embed_v3_main',
- '_embed_v3_ft',
- 'BAIDU_SSP__wrapper',
- 'BAIDU_DSPUI_FLOWBAR',
- '_embed_v3_hd'
- ];
-
- function triggerIIE() {
- var i = 0,
- obj = null;
- for (obj in document) {
- if (/^on./.test(obj)) {
- interceptionInlineEvent(obj, i++);
- }
- }
- }
-
- function interceptionInlineEvent(eventName, eventID) {
- var isClick = (eventName == 'onclick');
- document.addEventListener(eventName.substr(2), function(e) {
- scanElement(e.target, isClick, eventName, eventID);
- }, true);
- }
-
- function scanElement(elem, isClick, eventName, eventID) {
- var
- flag = elem['isScan'],
-
- code = "",
- hash = 0;
-
- if (!flag) {
- flag = elem['isScan'] = ++mCheckID;
- }
- hash = (flag << 8) | eventID;
- if (hash in mCheckMap) {
- return;
- }
- mCheckMap[hash] = true;
-
- if (elem.nodeType != Node.ELEMENT_NODE) {
- return;
- }
- if (elem[eventName]) {
- code = elem.getAttribute(eventName);
- if (code && blackListMatch(keywordBlackList, code)) {
-
- elem[eventName] = null;
- console.log('拦截可疑内联事件:' + code);
- hijackReport('拦截可疑内联事件', code);
- }
- }
-
- if (isClick && elem.tagName == 'A' && elem.protocol == 'javascript:') {
- var code = elem.href.substr(11);
- if (blackListMatch(keywordBlackList, string)) {
-
- elem.href = 'javascript:void(0)';
- console.log('拦截可疑事件:' + code);
- hijackReport('拦截可疑javascript:代码', code);
- }
- }
-
- scanElement(elem.parentNode);
- }
-
-
- function interceptionStaticScript() {
-
- var MutationObserver = window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver;
-
-
- var observer = new MutationObserver(function(mutations) {
- mutations.forEach(function(mutation) {
-
- var nodes = mutation.addedNodes;
-
- for (var i = 0; i < nodes.length; i++) {
- var node = nodes[i];
-
- if (node.tagName === 'SCRIPT' || node.tagName === 'IFRAME') {
-
- if (node.tagName === 'IFRAME' && node.srcdoc) {
- node.parentNode.removeChild(node);
- console.log('拦截到可疑iframe', node.srcdoc);
- hijackReport('拦截可疑静态脚本', node.srcdoc);
- } else if (node.src) {
-
- if (!whileListMatch(whiteList, node.src)) {
- node.parentNode.removeChild(node);
-
- console.log('拦截可疑静态脚本:', node.src);
- hijackReport('拦截可疑静态脚本', node.src);
- }
- }
- }
- }
- });
- });
-
-
-
- observer.observe(document, {
- subtree: true,
- childList: true
- });
- }
-
- function interceptionDynamicScript() {
-
- document.addEventListener('DOMNodeInserted', function(e) {
- var node = e.target;
- if (/xss/i.test(node.src) || /xss/i.test(node.innerHTML)) {
- node.parentNode.removeChild(node);
- console.log('拦截可疑动态脚本:', node);
- hijackReport('拦截可疑动态脚本', node.src);
- }
- }, true);
- }
-
- function resetCreateElement() {}
-
- function resetDocumentWrite(window) {
- var old_write = window.document.write;
- window.document.write = function(string) {
- if (blackListMatch(keywordBlackList, string)) {
- console.log('拦截可疑模块:', string);
- hijackReport('拦截可疑document-write', string);
- return;
- }
-
- old_write.apply(document, arguments);
- }
- }
-
- function resetSetAttribute(window) {
-
- var old_setAttribute = window.Element.prototype.setAttribute;
-
- window.Element.prototype.setAttribute = function(name, value) {
-
- if (this.tagName == 'SCRIPT' && /^src$/i.test(name)) {
- if (!whileListMatch(whiteList, value)) {
- console.log('拦截可疑模块:', value);
- hijackReport('拦截可疑setAttribute', value);
- return;
- }
- }
-
- old_setAttribute.apply(this, arguments);
- };
- }
-
- function defenseIframe() {
-
- installHook(window);
- }
-
- function installHook(window) {
-
- resetSetAttribute(window);
-
- resetDocumentWrite(window);
-
- var MutationObserver = window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver;
-
-
- var observer = new MutationObserver(function(mutations) {
- mutations.forEach(function(mutation) {
-
- var nodes = mutation.addedNodes;
-
- for (var i = 0; i < nodes.length; i++) {
- var node = nodes[i];
-
- if (node.tagName == 'IFRAME') {
- installHook(node.contentWindow);
- }
- }
- });
- });
- observer.observe(document, {
- subtree: true,
- childList: true
- });
- }
-
- function lockCallAndApply() {
-
- Object.defineProperty(Function.prototype, 'call', {
- value: Function.prototype.call,
-
- writable: false,
-
- configurable: false,
- enumerable: true
- });
-
- Object.defineProperty(Function.prototype, 'apply', {
- value: Function.prototype.apply,
- writable: false,
- configurable: false,
- enumerable: true
- });
- }
-
- function redirectionIframeHijack() {
- var flag = 'iframe_hijack_redirected';
-
-
- if (self != top) {
- var
-
- parentUrl = document.referrer,
- length = whiteList.length,
- i = 0;
- for (; i < length; i++) {
-
- var reg = new RegExp(whiteList[i], 'i');
-
- if (reg.test(parentUrl)) {
- return;
- }
- }
- var url = location.href;
- var parts = url.split('#');
- if (location.search) {
- parts[0] += '&' + flag + '=1';
- } else {
- parts[0] += '?' + flag + '=1';
- }
- try {
- console.log('页面被嵌入iframe中:', parentUrl);
- hijackReport('页面被嵌入iframe中', parentUrl);
- top.location.href = parts.join('#');
- } catch (e) {}
- }
- }
-
- function hijackReport(name, value) {
- var img = document.createElement('img'),
- hijackName = name,
- hijackValue = value.toString(),
- curDate = new Date().getTime();
-
- img.src = 'http://www.reportServer.com/report/?msg=' + hijackName + '&value=' + hijackValue + '&time=' + curDate;
- }
-
- function whileListMatch(whileList, value) {
- var length = whileList.length,
- i = 0;
- for (; i < length; i++) {
-
- var reg = new RegExp(whiteList[i], 'i');
-
- if (reg.test(value)) {
- return true;
- }
- }
- return false;
- }
-
- function blackListMatch(blackList, value) {
- var length = blackList.length,
- i = 0;
- for (; i < length; i++) {
-
- var reg = new RegExp(blackList[i], 'i');
-
- if (reg.test(value)) {
- return true;
- }
- }
- return false;
- }
-
-
-
-
- httphijack.init = function() {
-
- triggerIIE();
-
- interceptionStaticScript();
-
-
-
- lockCallAndApply();
-
- defenseIframe();
-
- redirectionIframeHijack();
- }
- window.httphijack = httphijack;
- })(window);
|