Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 编辑a<;脚本>;在<;头>;在加载和运行脚本之前_Javascript_Jquery_Bigcommerce_Html Head - Fatal编程技术网

Javascript 编辑a<;脚本>;在<;头>;在加载和运行脚本之前

Javascript 编辑a<;脚本>;在<;头>;在加载和运行脚本之前,javascript,jquery,bigcommerce,html-head,Javascript,Jquery,Bigcommerce,Html Head,我在一个电子商务平台上,在那里我可以编辑,但是有些东西被注入大脑是用户够不着的。因此,尽管我们可以编辑,但仍有一些注射无法触及,因此无法通过传统方法移除。 PS:我可以将脚本放在这些注入的JS脚本标记之前或之后,这些标记与我的脚本一起生成和填充。因此,如果我将脚本放在它们的“标记注入行”之前,我的脚本将在注入的标记之前运行。 问题 问题是,这个平台开始向头部注入分析和垃圾邮件,基本上窃取我们的客户信息并将其出售给第三方。所以我想禁用他们糟糕的脚本 <script type="text/j

我在一个电子商务平台上,在那里我可以编辑
,但是有些东西被注入大脑是用户够不着的。因此,尽管我们可以编辑
,但仍有一些注射无法触及,因此无法通过传统方法移除。
PS:我可以将脚本放在这些注入的JS脚本标记之前或之后,这些标记与我的脚本一起生成和填充。因此,如果我将脚本放在它们的“标记注入行”之前,我的脚本将在注入的标记之前运行。


问题 问题是,这个平台开始向头部注入分析和垃圾邮件,基本上窃取我们的客户信息并将其出售给第三方。所以我想禁用他们糟糕的脚本

<script type="text/javascript" async="" src="/some.JS.file.min.js"></script>
<script type="text/javascript" async="" src="/another.JS.file.min.js"></script>
编辑更新: 他们的脚本在我的脚本之后插入。也就是说,我可以在脚本标记之前或之后将脚本插入
。我们现在正在寻找新的平台,但同时我仍然需要解决这个问题,因为我们需要几个月才能切换。我希望有一些JavaScript我不知道,可以编辑HTML脚本标签之前,他们运行,如果这个脚本运行之前,他们这样做

编辑2:
window.bcanalytics=function(){}
工作得很好,通过破坏
window.bcanalytics.push来破坏大部分功能,但不知何故,有些功能仍然存在

在该区块中:

    <script type="text/javascript">

(function() {
    window.bcanalytics || (window.bcanalytics = []), window.bcanalytics.methods = ["debug", "identify", "track", 
        "trackLink", "trackForm", "trackClick", "trackSubmit", "page", "pageview", "ab", "alias", "ready", "group", 
        "on", "once", "off", "initialize"], window.bcanalytics.factory = function(a) {
        return function() 
        {
            var b = Array.prototype.slice.call(arguments);
            return b.unshift(a), window.bcanalytics.push(b), 
            window.bcanalytics
        }
    };
    for (var i = 0; i < window.bcanalytics.methods.length; i++) 
    {
        var method = window.bcanalytics.methods[i];
        window.bcanalytics[method] = window.bcanalytics.factory(method)
    }
    window.bcanalytics.load = function() {
        var a = document.createElement("script");
        a.type = "text/javascript", 
        a.async = !0, a.src = "http://cdn5.bigcommerce.com/r-2b2d3f12176a8a1ca3cbd41bddc9621d2657d707/app/assets/js/vendor/bigcommerce/analytics.min.js";
        var b = document.getElementsByTagName("script")[0];
// This line still runs and loads analytics.min.js
// This line still runs and loads analytics.min.js
// This line still runs and loads analytics.min.js
        b.parentNode.insertBefore(a, b)
// ^^^ This line still runs and loads analytics.min.js
// This line still runs and loads analytics.min.js
// This line still runs and loads analytics.min.js
    }, window.bcanalytics.SNIPPET_VERSION = "2.0.8", window.bcanalytics.load();
    bcanalytics.initialize({"Fornax": {"host": "https:\/\/analytics.bigcommerce.com","cdn": "http:\/\/cdn5.bigcommerce.com\/r-2b2d3f12176a8a1ca3cbd41bddc9621d2657d707\/app\/assets\/js\/vendor\/bigcommerce\/fornax.min.js","defaultEventProperties": {"storeId": 729188,"experiments": {"shipping.eldorado.ng-shipment.recharge-postage": "on","shipping.eldorado.label_method": "on","cp2.lightsaber": "on","PMO-272.cp1_new_product_options": "on","cart.limit_number_of_unique_items": "control","cart.auto_remove_items_over_limit": "control","BIG-15465.limit_flash_messages": "control","BIG-15230.sunset_design_mode": "control","bigpay.checkout_authorizenet.live": "on","bigpay.checkout_authorizenet.live.employee.store": "control","bigpay.checkout_authorizenet.test": "on","bigpay.checkout_authorizenet.test.employee.store": "control","bigpay.checkout_stripe.live": "on","bigpay.checkout_stripe.live.employee.store": "control","bigpay.checkout_stripe.test": "on","bigpay.checkout_stripe.test.employee.store": "control","sessions.flexible_storage": "on","PMO-439.ng_payments.phase1": "control","PMO-515.ng_payments.phase2": "control","PROJECT-331.pos_manager": "control","PROJECT-453.enterprise_apps": "control","shopping.checkout.cart_to_paid": "legacy_ui","onboarding.initial_user_flow.autoprovision": "on","faceted_search.enabled": "off","faceted_search.displayed": "off","themes.previewer": "enabled"}},"defaultContext": {"source": "Bigcommerce Storefront"},"anonymousId": "24a35a36-7153-447e-b784-c3203670f644"}});
})();
</script>

总是在第一个未注释的
开始标记前面加上前缀,因此不幸的是,下面的创造性破坏性方法都不起作用,因为我尝试在这些标记前面插入的任何脚本都会自动找到附加在它前面的讨厌的不需要的行。

如果您知道至少可以让脚本首先运行,那么(尽管有点骇人听闻)解决方案是在下一个脚本中完全“丢弃”JS环境,因此它存在一些问题。例如:

//trash it
document.getElementById=null;
document.querySelector=null;
document.querySelectorAll=null;
window.console=null;
window.alert=null;
document.getElementsByTagName=null;
document.getElementsByClassName=null;

一旦敌人的脚本尝试使用其中一个函数,它就会失败。这些只是我脑海中的一些常见方法……找出它使用的是哪些函数,然后对它们进行核爆。当然,对自己页面上的事件进行核爆可能是个问题。

假设有问题的代码与问题类似如果您链接到,我只会尝试破坏有问题的代码,使其无法执行。
从这里开始,答案依赖于另一个问题的代码,因为您没有提供任何代码

违规代码依赖于分析,这在脚本开头的页面上得到了保证:

(function(){
    window.analytics||(window.analytics=[]),window.analytics.methods=["debug","identify","track","trackLink","trackForm","trackClick","trackSubmit","page","pageview","ab","alias","ready","group","on","once","off","initialize"],window.analytics.factory=function(a){return function(){var b=Array.prototype.slice.call(arguments);return b.unshift(a),window.analytics.push(b),window.analytics}};for(var i=0;i<window.analytics.methods.length;i++){var method=window.analytics.methods[i];window.analytics[method]=window.analytics.factory(method)}window.analytics.load=function(){var a=document.createElement("script");a.type="text/javascript",a.async=!0,a.src="http://cdn2.bigcommerce.com/r6cb05f0157ab6c6a38c325c12cfb4eb064cc3d6f/app/assets/js/analytics.min.js";var b=document.getElementsByTagName("script")[0];b.parentNode.insertBefore(a,b)},window.analytics.SNIPPET_VERSION="2.0.8",window.analytics.load();
    //The rest of the script
})();

这将导致有问题的脚本由于类型错误而失败。

脚本是如何注入的?如果是通过类似于
document.createElement
的方式注入的,则可以尝试劫持该函数,并在元素名称为
script
时禁用该函数:

var origCreate = document.createElement;
document.createElement = function (name) {
  if (name.toLowerCase() !== 'script') {
    origCreate.call(document, name);
  }
};

和其他人一样,我建议破坏js环境以获取恶意脚本,然后在需要时将其恢复

例如,如果脚本依赖于
document.getElementById
,则可以执行此操作

var restore = {
  getElementById: document.getElementById
};
document.getElementById = null;
然后,如果以后需要使用
document.getElementById
,可以将其还原回:

document.getElementById = restore.getElementById;

我还想指出,据我所知,删除实际的脚本标记是不可能的:

  • 如果在恶意脚本之前放入脚本,那么它们还不会加载到DOM中,因此它看不到任何要删除的内容
  • 如果在恶意脚本之后插入脚本,则恶意脚本将已加载

由于脚本是在服务器端插入的,您将无法在JavaScript中禁用脚本的运行。但是,如果您能够在插入脚本之前和之后插入任意文本,您可以通过先插入以下内容来尝试注释脚本标记:

<!-- 如果在这些脚本之间注入脚本,则可能会导致HTML解析器忽略这些脚本

更新

听起来您只需要禁用其中一些内容,因此对所有内容进行注释将不起作用。但是,如果劫持之前/之后起作用,您可能会将注入的脚本包装在DOM元素中,解析该内容,删除不需要的脚本,然后注入脚本以使其运行:

在之前注入类似的内容:

<style id="hijack" type="text/html">

……这之后:

-->
</style>
<script>
  var hijackedWrapper = document.getElementById('hijack');
  var scripts = hijackedWrapper.textContent;
  scripts = scripts.replace('<script src="http://some.domain.com/foo.js"></s' + 'cript>', '');
  document.write(scripts); // There's better ways to do this, but is just an illustration
</script>

var jackedWrapper=document.getElementById('jacket');
var scripts=jackedwrapper.textContent;
脚本=脚本。替换(“”,”);
document.write(脚本);//有更好的方法可以做到这一点,但这只是一个例子

您无法阻止脚本运行。浏览器将在看到关闭标签后立即运行脚本。是时候移动到更体面的平台/服务器了无法“卸载”他们的脚本(如果是你的)会在脚本之后加载。但是,你可以尝试破坏他们的代码以阻止其工作。我建议抛弃这个坏系统,使用一个不会损害用户隐私的系统。但是,如果脚本是在脚本之后插入的,那么可以,如果不能,那么不能。@AndreBulatov回答如果没有合法的方法来禁用它们,那么它们实际上是你唯一的选择。这是一个很好的概念,但问题是,我需要停止加载实际的JS文件。它们会在渲染中造成严重的挂起。如果你让它们断开,那也很好。只要其中一个脚本尝试使用上述任何函数,它就会立即停止停止并将控制返回页面“挂起”无论脚本是否崩溃,它都应该消失loaded@chiliNUT这就是说,他所说的延迟可能与下载和加载脚本所需的时间有关,即使脚本被破坏,它仍然会存在。这不是一个坏的解决方案,但它仍然不是“一样好”。我一定喜欢这个词……
<style id="hijack" type="text/html">
</style>
<script>
  var hijackedWrapper = document.getElementById('hijack');
  var scripts = hijackedWrapper.textContent;
  scripts = scripts.replace('<script src="http://some.domain.com/foo.js"></s' + 'cript>', '');
  document.write(scripts); // There's better ways to do this, but is just an illustration
</script>