场景痛点

下载的模板将通用JS加密并强行注入外链,解密代价高且代码仍被混淆。

虽然可通过打断点或注释loadS...(函数名就不具体指出了)函数解决,但若以后函数名也被混淆就又得重新找。

因此研究直接重写document.createElement,无需解密即可拦截加密脚本中的恶意外链,一劳永逸。

技术方案
const nativeCreateElement = document.createElement;
const blockedUrls = ['xxx.com/js.js', 'yyy.com/malware.js']; // 自行增减需要拦截的URL列表
document.createElement = function(tagName) {
    const element = nativeCreateElement.call(document, tagName);
    if (tagName.toLowerCase() === 'script') {
        // 拦截script.src = '...'
        Object.defineProperty(element, 'src', {
            set(url) {
                if (blockedUrls.some(blockedUrl => url.includes(blockedUrl))) {
                    console.log('[拦截] 阻断外链:', url);
                    return;
                }
                element.setAttribute('src', url);
            },
            get() {
                return element.getAttribute('src');
            }
        });
        // 拦截script.setAttribute('src', '...')
        const originalSetAttr = element.setAttribute;
        element.setAttribute = function(name, value) {
            if (name === 'src' && blockedUrls.some(blockedUrl => value.includes(blockedUrl))) {
                console.log('[拦截] 阻断setAttribute:', value);
                return;
            }
            originalSetAttr.call(this, name, value);
        };
    }
    return element;
};
使用方式

1、直接在被加密脚本上方添加上方代码,并在blockedUrls中自行增减需要拦截恶意外链JS

2、保存修改,回到浏览器CTRL+F5强制刷新或清楚浏览器缓存

3、浏览器F12,观察控制台是否有拦截提示或网络界面恶意外链JS是否真的没有被加载

无需解密拦截加密脚本中的恶意外链,重写document.createElement的安全实践

核心优势

1、无需解密:直接拦截DOM API调用,对加密脚本透明

2、双重防护:覆盖src属性赋值和setAttribute两种注入方式

3、精准拦截:仅针对特定域名规则,不影响其他正常脚本

注意事项

1、这种拦截方式应该在页面最早加载的脚本中执行

2、可能会与某些框架的脚本加载机制冲突

3、不能拦截通过innerHTML或document.write等方式插入的脚本

4、通过其他方式插入的脚本可以把该代码喂给AI补充完善

THE END

本站部分文章搜集整理于互联网或者网友提供,如有侵权请联系站长

如若转载,请注明出处:https://www.htmlbk.com/web/2542.html

温馨提示:该文档最后一次修改时间为2025-06-25 18:07:55,请注意相关的内容是否还可用!