美文网首页
dns挟持h5页面出现广告

dns挟持h5页面出现广告

作者: it之承影含光 | 来源:发表于2018-04-09 16:43 被阅读0次

    内嵌或者浏览器打开的h5页面出现广告,基本上是动态创建script来加载脚本的:document.createElement

    最直接的方式是禁用动态添加脚本

    /**
     1. 禁用动态添加脚本,防止广告加载
     */
    (function () {
        var createElement = document.createElement;
        document.createElement = function (tag) {
            switch (tag) {
                case 'script':
                    console.log('禁用动态添加脚本,防止广告加载');
                    break;
                default:
                    return createElement.apply(this, arguments);
            }
        }
    })();
    

    有时我们也需要动态添加脚本,这个就不适合了,所以优化下代码:

    /**
    * 禁用动态添加脚本,防止广告加载
    *
    * @param valid bool? true(valid)|false(invalid)|other(off)
    * @param rule array 配置允许(valid)|不允许(invalid)的脚本规则:支持regex、string、function
    */
    (function (valid, rule) {
        if (typeof Element === 'undefined') console.log('IE8以下浏览器无效');
        var origin = new RegExp('^' + location.origin),
            Ele = Element;
        each(['appendChild', 'insertBefore', 'insertAfter'], proxy);
    
        function proxy(prop) {
            var proxy_obj = Ele.prototype[prop];
            Ele.prototype[prop] = function (elem) {
                if (!elem.children.length) {
                    var tag = elem.tagName.toLowerCase();
                    if (tag == 'script' && isBanScript(elem)) {
                        console.log('禁用脚本:' + elem.src);
                        var substitute = document.createElement('script');
                        substitute.innerHTML = '// 禁用脚本:' + elem.src;
                        elem = substitute;
                    }
                }
                return proxy_obj.apply(this, arguments);
            };
        }
    
        function isBanScript(script) {
            if (origin.test(script.src)) return false;
            return valid === each(rule, match);
    
            function match(val) {
                var type = typeof val;
                if (type === 'string') {
                    if (script.src == val) return true;
                } else if (type === 'function') {
                    if (val(script)) return true;
                } else {
                    if (val.test(script.src)) return true;
                }
                return false;
            }
        }
    
        function each(arr, fn) {
            if (arr) {
                for (var i = 0, n = arr.length; i < n; i++) {
                    if (fn.call(arr[i], arr[i], i) === true) return false;
                }
            }
            return true;
        }
    })(true, []);
    //表示有效的脚本规则列表
    

    遇到的问题:直接把html的标签写成如下,不加上段js代码在chrome测试和移动端中也没有广告

    <html xmlns="http://www.w3.org/1999/xhtml">
    <html>
    

    参考
    https://blog.csdn.net/u013172064/article/details/66971257

    相关文章

      网友评论

          本文标题:dns挟持h5页面出现广告

          本文链接:https://www.haomeiwen.com/subject/hwrnhftx.html