【问题标题】:Javascript Lighthouse Hack?Javascript灯塔黑客?
【发布时间】:2022-03-02 13:39:40
【问题描述】:

我的公司在外面雇佣了一个人,以廉价的方式为灯塔得分进行优化。他让我回顾他们做了什么,我试图弄清楚他们到底做了什么。我们的分数确实上升了,但它看起来像是一套特殊的规则,适用于 lighthouse-chrome 和 GTMetrix 代理,它们忽略某些事情以获得更好的分数。

谁能破译这个并告诉我这只是一个黑客还是合法的?

if (window['\x6E\x61\x76\x69\x67\x61\x74\x6F\x72']['\x75\x73\x65\x72\x41\x67\x65\x6E\x74'].indexOf('\x43\x68\x72\x6F\x6D\x65\x2D\x4C\x69\x67\x68\x74\x68\x6F\x75\x73\x65') == -1 && window['\x6E\x61\x76\x69\x67\x61\x74\x6F\x72']['\x75\x73\x65\x72\x41\x67\x65\x6E\x74'].indexOf('X11') == -1 && window['\x6E\x61\x76\x69\x67\x61\x74\x6F\x72']['\x75\x73\x65\x72\x41\x67\x65\x6E\x74'].indexOf('\x47\x54\x6D\x65\x74\x72\x69\x78') == -1) {
    var script_loaded = !1;

    function loadJSscripts() {
        console.log("Loading scripts 18000ms"), setTimeout(function() {
            if (!script_loaded) {
                script_loaded = !0;
                var t = document.getElementsByTagName("script");
                for (i = 0; i < t.length; i++) null !== t[i].getAttribute("data-src") && (t[i].setAttribute("src", t[i].getAttribute("data-src")), delete t[i].dataset.src);
                var e = document.getElementsByTagName("link");
                for (i = 0; i < e.length; i++) null !== e[i].getAttribute("data-href") && (e[i].setAttribute("href", e[i].getAttribute("data-href")), delete e[i].dataset.href);
                setTimeout(function() {
                    document.dispatchEvent(new CustomEvent("StartAsyncLoading")), document.dispatchEvent(new CustomEvent("StartKernelLoading"))
                }, 400)
            }
        }, 9e3)
    }

    function loadJSscriptsNow() {
        if (!script_loaded) {
            console.log("now ..."), script_loaded = !0;
            var t = document.getElementsByTagName("script");
            for (i = 0; i < t.length; i++) null !== t[i].getAttribute("data-src") && (t[i].setAttribute("src", t[i].getAttribute("data-src")), delete t[i].dataset.src);
            var e = document.getElementsByTagName("link");
            for (i = 0; i < e.length; i++) null !== e[i].getAttribute("data-href") && (e[i].setAttribute("href", e[i].getAttribute("data-href")), delete e[i].dataset.href);
            setTimeout(function() {
                document.dispatchEvent(new CustomEvent("StartAsyncLoading")), document.dispatchEvent(new CustomEvent("StartKernelLoading"))
            }, 400)
        }
    }
    var activityEvents = ["mousedown", "mousemove", "keydown", "scroll", "touchstart", "click", "keypress", "touchmove"];
    activityEvents.forEach(function(t) {
        window.addEventListener(t, loadJSscriptsNow, !1)
    }), document.addEventListener("load", loadJSscripts, !1), document.addEventListener("onload", loadJSscripts, !1), null != window.addEventListener ? window.addEventListener("load", loadJSscripts, !1) : null != window.attachEvent ? window.attachEvent("onload", loadJSscripts) : window.onload = loadJSscripts;
}

【问题讨论】:

  • 我的想法也是@Carcigenicate 谢谢你的洞察力。
  • 它显式搜索navigator.userAgent.Chrome-Lighthouse,然后延迟脚本加载,让它看起来像你的第一次绘画是立即的。这不是一个糟糕的模式本身,但如果您的用户体验在 JS 加载之前很糟糕,那么他们实际上并没有修复任何东西并“为测试而学习”,而不是真正做任何有用的事情。
  • 是的,这是阴暗的。拿回你的钱。 Lighthouse 分数自然会随着更好的开发实践而提高,而不是detecting the environment and faking scores
  • 这就像将所有测试用例包装在if(am-in-test-environment){pass-test()'} 中一样。我所有的测试都通过了,但实际上一切都被破坏了。不要接受这项工作。
  • OMG @Phix 这对我的老板来说是完美的比喻......我在汽车行业工作,谢谢!

标签: javascript performance lighthouse


【解决方案1】:

这似乎是一个骗局。

搜索该代码,我可以找到类似的代码herehere

代码故意难以阅读,但其想法似乎是当它检测到正在测量页面速度时(似乎是通过检查 User-Agent 字符串),它会加载一个空页面;这显然会更快。我不确定 scriptlink 标签的作用,所以这个变体可能有点不同,但这就是他们在 Shopify 上报告的内容。

不过,仅根据第一行,我会非常怀疑。每当您的字符串中包含奇怪编码的信息时,它就有可能被用来隐藏信息。在这里,他们似乎试图隐藏他们正在检查用户代理字符串以查找 'Chrome-Lighthouse' ('\x43\x68\x72\x6F\x6D\x65\x2D\x4C\x69\x67\x68\x74\x68\x6F\x75\x73\x65') 的事实,但它也可能是窃取会话 cookie 或替换页面上指向的链接的代码到恶意网站。对似乎逃避人类或其他静态检测的代码要非常小心。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-04
    • 2019-02-12
    • 2021-08-30
    • 2021-09-10
    • 2021-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多