JavaScript防流量劫持【前端安全】
在网页开发的访问过程中,http是我们主要的访问协议。我们知道http是一种无状态的连接。即没有验证通讯双方的身份,也没有验证信息的完整性,所以很容易受到篡改
1、iframe嵌套展示原来正常网页
2、在原html中插入js,再通过js脚本安插广告
3、直接返回一个带广告的HTML
if (window.self != window.top) {
var url = location.href;
top.location = url;
}
var avoidIframeNest = {
whiteList : [],
init: function(whiteList){
if(Object.prototype.toString.call(whiteList) == "[object Array]"){
this.whiteList = whiteList;
}
this.redirect();
},
redirect: function(){
if(self != top){
var parentUrl = document.referrer;
//是否在白名单内
for(var i = 0 ,length = this.whiteList.length ; i < length ; ++ i){
var reg = new RegExp(this.whiteList[i],'i');
if(reg.test(parentUrl)){
return;
}
}
//页面跳转
var url = location.href;
top.location = url;
}
}
}
var avoidIframeNest = {
whiteList : [],
init: function(whiteList){
if(Object.prototype.toString.call(whiteList) == "[object Array]"){
this.whiteList = whiteList;
}
this.redirect();
},
redirect: function(){
if(self != top){
var parentUrl = document.referrer;
//是否在白名单内
for(var i = 0 ,length = this.whiteList.length ; i < length ; ++ i){
var reg = new RegExp(this.whiteList[i],'i');
if(reg.test(parentUrl)){
return;
}
}
//判断URL是否带指定参数
var iframeDomain = this.getUrlParam('iframe_domain');
if(iframeDomain && parentUrl.indexOf(iframeDomain) != -1){
return;
}
//页面跳转
var url = location.href;
top.location = url;
}
},
getUrlParam : function(key) {
var regStr = "^.*[\\?|\\&]" + key + "\\=([^\\&]*)",
url = location.href;
reg = new RegExp(regStr,'i');;
var ret = url.match(reg);
if (ret != null) {
return decodeURIComponent(ret[1]);
} else {
return "";
}
}
}
avoidIframeNest.init(['baidu.com']);
var validInsertImg = {
httpReg : /^http:\/\/(.*\.baidu\.com|.*\.netwin\.com)\//,
//验证非法图片
validIllegalityImg : function(src){
var httpReg = this.httpReg;
return !httpReg.test(src);
},
init : function(){
this.monitor();
},
monitor: function(){
var MutationObserver = window.MutationObserver ||
window.WebKitMutationObserver ||
window.MozMutationObserver;
var mutationObserverSupport = !!MutationObserver;
//html5监控变化属性
if(!mutationObserverSupport){
this.mutationListen(MutationObserver);
}else{
this.insertedListen();
}
},
insertedListen : function(){
var that = this;
document.addEventListener('DOMNodeInserted', function(e) {
var dom = e ? e.srcElement : document.documentElement;
if (!dom.outerHTML) {
return;
}
var imgList = (dom.nodeName.toUpperCase() == 'IMG') ? [dom] : dom.getElementsByTagName('img');
if (!imgList || imgList.length == 0) {
return;
}
for (var i = 0; i < imgList.length; i++) {
that.removeNode(imgList[i]);
}
});
},
mutationListen: function(MutationObserver){
var that = this;
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];
that.removeNode(node);
}
})
})
observer.observe(document, {
subtree: true,
childList: true
});
},
//删除node
removeNode : function(node){
if(node.nodeName.toUpperCase() == 'IMG'){
var src = node.src;
if(this.validIllegalityImg(src)){
node.parentNode.removeChild(node);
console.log('拦截可疑静态脚本:', node.src);
}
}
}
}
validInsertImg.init();
body = document.getElementsByTagName('body')[0];
var img = document.createElement('img');
img.setAttribute('src','http://m.baidu.com/img/b')
body.appendChild(img);
var img1 = document.createElement('img');
img1.setAttribute('src','/YTRYTRY/A.PNG')
body.appendChild(img1);
原创声明
本站部分文章基于互联网的整理,我们会把真正“有用/优质”的文章整理提供给各位开发者。本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。