Отредактируйте тег <script> в <head>, прежде чем он загрузит и запустит script

Я на платформе электронной коммерции, где я могу редактировать <head>, однако некоторые вещи, которые вводятся в голову, недоступны для пользователей. Поэтому, даже если мы можем редактировать <head>, есть инъекции, которые недоступны и, следовательно, неустранимы с помощью традиционного метода.
PS: я могу поместить script до или после этих введенных тегов JS script, которые генерируются и заполняются вместе с моими скриптами. И поэтому мой script будет запускаться перед введенными тегами, если я поместил свой script перед их "линией вставки тегов".


Проблема

Проблема в том, что эта платформа начала внедрять аналитику и спам в голову, в основном подталкивая информацию наших клиентов и продавая ее третьим лицам. Поэтому я хочу отключить их дерьмовые скрипты.

<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 или jquery написать script, который будет редактировать теги перед их запуском? Я могу вставить этот пользовательский script перед тем, как теги будут введены. Я ошибался - теги нежелательного <script> всегда относятся к первому некомментированному тегу <script>, и поэтому нет javascript будет работать, чтобы взломать теги перед их запуском.


Что я пробовал до сих пор

Я нашел этот неполный и не рабочий ответ из этого SO-вопроса.

Когда я запускаю полный script с правильными деталями, введенными для моего собственного сайта, я получаю так много ошибок, трудно понять, с чего начать, поскольку я понятия не имею, что все вещи XHR это то, что он делает, и некоторые из ошибок - это те, которые я никогда раньше не видел.

Когда я запускаю только эту часть, которую я несколько понимаю:

doc = document.implementation.createHTMLDocument(""+(document.title || ""));

scripts = doc.getElementsByTagName("script");
//Modify scripts as you please
[].forEach.call( scripts, function( script ) {
    if(script.getAttribute("src") == "/some.JS.file.min.js"
       || script.getAttribute("src") == "/another.JS.file.min.js") {

        script.removeAttribute("src");
    }
});

ИЗМЕНИТЬ ОБНОВЛЕНИЕ:

Их script вставлен ПОСЛЕ моих скриптов. То есть, я могу вставить script в <head> перед тегами script или после. Сейчас мы изучаем новые платформы, но мне все же нужно решить это, тем более, что за несколько месяцев до того, как мы переключимся. Я надеялся, что есть какой-то JavaScript, о котором я не знаю, который может редактировать теги HTML script до их запуска, если этот script выполняется до их выполнения.

ИЗМЕНИТЬ 2:

Ответ на Nit 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>

window.bcanalytics.load удается выжить и загрузить analytics.min.js(в соответствии с вкладкой "Сеть" ), хотя я не могу сказать, выполняется ли script или нет.

Кроме того, я понял, что эти надоедливые строки HTML:

<script type="text/javascript" defer="" async="" src="http://tracker.boostable.com/boost.bigcommerce.js"></script>
<script type="text/javascript" async="" defer="" src="http://cdn5.bigcommerce.com/r-2b2d3f12176a8a1ca3cbd41bddc9621d2657d707/javascript/jirafe/beacon_api.js"></script>
<script type="text/javascript" async="" src="http://cdn5.bigcommerce.com/r-2b2d3f12176a8a1ca3cbd41bddc9621d2657d707/app/assets/js/vendor/bigcommerce/analytics.min.js"></script>
<script type="text/javascript" async="" src="http://www.google-analytics.com/plugins/ua/ecommerce.js"></script>

всегда относятся к первому некомментированному тегу <script>, поэтому, к сожалению, ни один из творчески деструктивных методов ниже не будет работать, поскольку любой script, который я пытаюсь вставить перед этими тегами, автоматически обнаружит отвратительные нежелательные перед ним добавлены строки.

Ответ 1

Предполагая, что код нарушения похож на код, с которым вы связаны, я просто попытаюсь сломать нарушивший код, чтобы он не выполнялся.
Отсюда ответ зависит от кода с другого вопроса, так как вы его не предоставили.

Оскорбительный код зависит от аналитики, которая обеспечивается на странице в начале script:

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

Чтобы разбить весь script и предотвратить его запуск, просто присвойте window.analytics значение, которое будет конфликтовать с используемыми методами.
Так, например, вы можете запустить script перед нарушением script, который просто присваивает следующее:

window.analytics = function () {};

Это приведет к ошибке script, вызванной ошибкой типа.

Ответ 2

Если вы знаете, что можете по крайней мере сначала запустить свои сценарии, одно (хотя и взломанное) решение - это просто "уничтожить" среду JS для следующего script, поэтому у него есть некоторые проблемы. Например:

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

Как только противник script пытается использовать одну из этих функций, он просто дерьмо. Это всего лишь некоторые распространенные методы с моей головы... узнайте, какие из них используют, и nuke те. Разумеется, проблема с nuking в том, что вам нужно для событий на вашей собственной странице, может быть проблемой.

Ответ 3

Как вставляются скрипты? Если это произойдет через что-то вроде document.createElement, вы можете попытаться захватить эту функцию и отключить ее, если имя элемента script:

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

Ответ 4

Поскольку скрипты вставлены на сервер, вы не сможете отключить запуск скриптов в вашем JavaScript. Однако, если вы можете вводить любой произвольный текст до и после вставленных скриптов, вы можете попробовать прокомментировать теги script, вставив это в первую очередь:

  <!--

... тогда это после:

  -->

Если скрипты будут введены между ними, он, надеюсь, заставит анализатор 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 better ways to do this, but is just an illustration
</script>

Ответ 5

Как и другие, я бы предложил саботировать среду js для недружественного script, а затем восстановить его обратно, когда вам это нужно.

Например, если script полагается на document.getElementById, вы можете сделать это

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

а затем, если вам нужно использовать document.getElementById позже, вы можете восстановить его:

document.getElementById = restore.getElementById;

Я также хотел заметить, что удаление фактических тегов script, насколько я могу судить, невозможно:

  • Если вы разместите script перед враждебными сценариями, то они еще не будут загружены в DOM, поэтому он не сможет ничего удалить.
  • Если вы введете script после враждебных сценариев, уже будут загружены неактивные скрипты.