在加载之前编辑<head>中的<script>标记并运行脚本

时间:2015-07-14 23:52:31

标签: javascript jquery bigcommerce html-head

我在一个电子商务平台上,我可以编辑&lt; head&gt; ,但是注入头部的一些东西对于用户来说是遥不可及的。因此,即使我们可以编辑&lt; head&gt; ,也会出现无法通过传统方法无法删除的注入。
&#xA; PS:我可以放这些注入的JS脚本标记之前或之后的脚本,它们与我的脚本一起生成并填充。因此,如果我将脚本放在“标记注入行”之前,我的脚本将在注入标记之前运行。

&#xA;&#xA;
&#xA;&#xA;

问题

&#xA;&#xA;

问题是,这个平台开始注入分析和垃圾邮件,基本上是把客户信息抬起来卖给第三方。所以我想禁用他们糟糕的脚本。

&#xA;&#xA;
 &lt; script type =“text / javascript”async =“”src =“/ some.JS.file .min.js“&gt;&lt; / script&gt;&#xA;&lt; script type =”text / javascript“async =”“src =”/ another.JS.file.min.js“&gt;&lt; / script&gt ;&#xA;  
&#xA;&#xA;
&#xA;&#xA;

问题

&#xA;&#xA; < p>是否可以使用javascript或jquery编写一个脚本,在运行之前编辑标签? 我可以在注入标记之前插入此自定义脚本。我错了 - 不需要的&lt; script&gt; 标记总是预先添加到第一个未注释的&lt; script&gt; 标记,因此在标记运行之前,没有任何javascript可用于破解标记。

&#xA;&#xA;
&#xA;&#xA; < h3>我到目前为止所做的事情&#xA;&#xA;

我发现这个不完整且无法解决来自这个问题

&#xA;&#xA;

当我运行完整的脚本时为我自己的网站输入了正确的详细信息,我收到了很多错误很难知道从哪里开始,因为我不知道所有XHR的内容是什么或它做了什么,以及一些错误是我以前从未见过的。

&#xA;&#xA;

当我运行这部分时,我有点理解:

&#xA;&#xA; < pre> doc = document.implementation.createHTMLDocument(“”+(d ocument.title || “”));&#xA;&#xA; scripts = doc.getElementsByTagName(“script”);&#xA; //随意修改脚本&#xA; []。forEach.call(脚本,函数(脚本) ){&#xA; if(script.getAttribute(“src”)==“/ some.JS.file.min.js”&#xA; || script.getAttribute(“src”)==“/ another。 JS.file.min.js“){&#xA;&#xA; script.removeAttribute(”src“);&#xA;}&#xA;});&#xA; &#xA;&#xA;

编辑更新:

&#xA;&#xA;

他们的脚本在我的脚本之后插入。也就是说,我可以在脚本标记之前或之后将脚本插入&lt; head&gt; 。我们现在正在寻找新的平台,但我仍然需要在此期间解决这个问题,因为我们需要几个月才能切换。我希望有一些我不知道可以在运行之前编辑HTML脚本标记的JavaScript,如果这个脚本在它们运行之前运行的话。

&#xA;&#xA;

编辑2:< / h3>&#xA;&#xA;

Nit的答案 window.bcanalytics = function() {}; 效果很好,通过打破 window.bcanalytics.push 打破了大部分内容,但不知何故,其中一些仍然存在。

&#xA;&#xA;

在此块中:

&#xA;&#xA;
 &lt; script type =“text / javascript”&gt;& #xA;&#xA;(function(){&#xA; window.bcanalytics ||(window.bcanalytics = []),window.bcanalytics.methods = [“debug”,“identify”,“track”,& #xA;“trackLink”,“trackForm”,“trackClick”,“trackSubmit”,“page”,“pageview”,“ab”,“别名”,“ready”,“group”,&#xA;“on” ,“一次”,“关闭”,“初始化”],window.bcanalytics.factory = function(a){&#xA; return function()&#xA; {&#xA; var b = Array.prototype.slice .call(arguments);&#xA;返回b.unshift(a),window.bcanalytics.push(b),&#xA; window.bcanalytics&#xA;}&#xA;};&#xA; for( var i = 0; i&lt; window.bcanalytics.methods.length; i ++)&#xA; {&#xA; var method = window.bcanalytics.methods [i];&#xA; window.bcanalytics [method] = window.bcanalytics.factory(method)&#xA;}&#xA; window.bcanalytics.load = function(){&#xA; var a = document.createElement(“脚本“);&#XA; a.type =“text / javascript”,&#xA; 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];&#xA; //此行仍然运行并加载analytics.min.js&#xA; //此行仍然运行并加载analytics.min.js&#xA ; //此行仍然运行并加载analytics.min.js&#xA; b.parentNode.insertBefore(a,b)&#xA; // ^^^此行仍然运行并加载analytics.min.js&#xA; //此行仍然运行并加载analytics.min.js&#xA; / /此行仍然运行并加载analytics.min.js&#xA; },window.bcanalytics.SNIPPET_VERSION =“2.0.8”,window.bcanalytics.load();&#xA; 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-邮资“:”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“:”co ntrol“,”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 “}});&#XA;})();&#XA;&LT; /脚本&GT;&#XA;  
&#XA;&#XA;

<代码>窗口.bcanalytics.load 设法生存并加载analytics.min.js(根据网络选项卡),但我无法判断脚本是否运行。

&#xA; &#xA;

另外,我已经发现这些讨厌的HTML行:

&#xA;&#xA;
 &lt; script type =“text / javascript”defer = “”async =“”src =“http://tracker.boostable.com/boost.bigcommerce.js”&gt;&lt; / script&gt;&#xA;&lt; script type =“text / javascript”async =“”defer =“”src =“http://cdn5.bigcommerce.com/r-2b2d3f12176a8a1ca3cbd41bddc9621d2657d707/javascript/jirafe/beacon_api.js”&gt;&lt; / script&gt;&#xA;&lt; script type =“text / javascript“async =”“src =”http://cdn5.bigcommerce.com/r-2b2d3f12176a8a1ca3cbd41bddc9621d2657d707/app/assets/js/vendor/bigcommerce/analytics.min.js“&gt;&lt; / script&gt;&#xA ;&lt; script type =“text / javascript”async =“”src =“http://www.google-analytics.com/plugins/ua/ecommerce.js”&gt;&lt; / script&gt;&#xA; < / code> 
&#xA;&#xA;

始终预先添加到第一个未注释的&lt; script&gt; 开始标记,所以遗憾的是,没有任何具有创造性破坏性的方法下面的方法是可行的,因为我尝试在这些标签之前插入的任何脚本都会自动找到在它之前附加的讨厌的不需要的行。

&#xA;

5 个答案:

答案 0 :(得分:5)

假设违规代码与您链接的问题类似,我只会尝试打破违规代码,以免执行。
从这里开始,答案依赖于另一个问题的代码,因为你没有提供任何代码。

违规代码依赖于分析,分析在脚本开头的页面上确保:

(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
})();

要破坏整个脚本并阻止其运行,您只需为window.analytics分配一个与使用的方法冲突的值。
因此,例如,您可以在简单地分配以下内容的违规脚本之前运行脚本:

window.analytics = function () {};

由于类型错误,导致违规脚本失败。

答案 1 :(得分:3)

如果你知道你至少可以让你的脚本首先运行,那么一个(尽管是hacky)解决方案就是绝对&#34;垃圾&#34;下一个脚本的JS环境,所以它有一些问题。例如:

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

一旦敌方脚本尝试使用其中一个功能,它就会被废弃。这些只是我头脑中的一些常见方法...找出它使用哪些,并核对那些。当然,在您自己的页面上为事件所需的任何东西都可能是一个问题。

答案 2 :(得分:3)

如何注入脚本?如果通过类似document.createElement之类的内容,您可以尝试劫持该功能并在元素名称为script时将其禁用:

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

答案 3 :(得分:3)

由于脚本正在插入服务器端,因此您将无法禁用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>

答案 4 :(得分:1)

与其他人一样,我建议破坏敌对脚本的js环境,然后在需要时将其恢复。

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

var restore = {
  getElementById: document.getElementById
};
document.getElementById = null;

然后如果您以后需要使用document.getElementById,则可以将其还原:

document.getElementById = restore.getElementById;

我还想注意,根据我的意思,删除实际的脚本标签是不可能的:

  • 如果你在敌对脚本之前放入一个脚本,那么它们将不会被加载到DOM中,所以它看不到要删除的内容。
  • 如果您在恶意脚本之后放入脚本,则已经加载了恶意脚本。