虫虫的技术博客 技术 生活

Wednesday, August 3, 2016

记一次网络劫持问题排查与解决

问题爆露:用户反馈登录超时,一直登录不上站酷
我们自己测试登录正常,大部分用户登录也正常,远程到用户的机器上去
监控浏览器发送的ajax请求,看发送的数据及返回接收的数据,发现在回来的数据中嵌入了一段js代码
< script charset = "utf-8" async = "true" src = "http://t.5txs.cn/rb/i7.js"></script>
再回到我们的服务器上监控,看返回给用户的内容是没有这些脚本的
那猜测就是用户的运营商劫持了网站的返回数据强行插入广告
html页面返回的话,这段脚本会在页面的右下角加载出来广告
JSONP请求会因为这段脚本导致请求失败
到现在就遇到难点了,
等等
也没有找到现成的可行的解决方案
想过投诉,想过报案,想过让用户去投诉他们的网络运营商,也想过各种技术方案,最终还是只能通过技术方案来缓解这个问题
之前想过技术解决方案,也总是觉着这个事,再改变技术实现,改框架等等,实现起来有点困难,有点不值
后来跟多个同事沟通,王杰,刘越,芦传,许立志,梁鹏,刘强,等等,最终强哥给了一个思路,自己实现jsonp,改写里面的处理逻辑,
之前王杰也提过这样的想法,但我认为jsonp是一个标准化的东西,是不可改的东西,这点评估有一定的失误,只是因为对jsonp的底层不是很了解
经过强哥的角读,对jsonp的实现有一定的了解之后,再想这个问题,用技术来实现,就不是不可实现的了。
然后看了jQuery的ajax在线文档,决定试一下
写了demo方法,然后在error的方法里面是有data的,这个可以输出responseText,看到是服务器端返回的内容,看到这心里就踏实了。。
然后就开始实现,
又想到这些异常不知道占了多少的比例,所以就要加上错误的时候,往后台发个日志请求,用以记录该问题的覆盖面积,以及可以统计出用户的所在地范围,进而看是否能统计出是哪些运营商。。。

实现代码如下(未完成)


function removeHtmlAd(data, successCallback, errorCallback) {
};
function removeJSONAd(data, successCallback, errorCallback) {
};
function removeJSONPAd(data, successCallback, errorCallback) {
        var respText = data.responseText;
        if (!endWith(trim(respText), "\\)")) {
                var respTextScriptTemp = respText
                                .substring(respText.lastIndexOf(")") + 1)
                logThis(respTextScriptTemp);
                var respTextTemp = respText.substring(respText.indexOf("\(") + 1,
                                respText.lastIndexOf("\)"));
                data = JSON.parse(respTextTemp);
                successCallback(data);
        } else {
                errorCallback(data);
        }
};
function logThis(scriptStr) {
        var url = "http://log.zcool.com.cn/error.gif?type=ad&script=" + scriptStr;
        new Image().src = url;
};
function trim(str) {
        return str.replace(/(^\s*)|(\s*$)/g, "");
}
function ltrim(str) {
        return str.replace(/(^\s*)/g, "");
}
function rtrim(str) {
        return str.replace(/(\s*$)/g, "");
}
function startWith(oStr, str) {
        var reg = new RegExp("^" + str);
        return reg.test(oStr);
}
function endWith(oStr, str) {
        var reg = new RegExp(str + "$");
        return reg.test(oStr);
}

Popular Posts

Copyright © 虫虫的成长历程 | Powered by Blogger Design by PWT | Blogger Theme by NewBloggerThemes.com