Javascript oprește browserul de publicitate pentru a opri adaosurile de publicitate (Programare, Javascript, Angularjs, Browser Addons)

Niraj Chauhan a intrebat.

Există vreo modalitate de a opri add-on-urile din browser să injecteze cod HTML?

Am un site web construit în angularjs, dar din cauza unor add-on-uri de browser, traseul meu este încurcat, acesta este fragmentul HTML care provoacă unele erori în angularjs:

<script async="" src="http://b.scorecardresearch.com/beacon.js"></script>
<script type="text/javascript" async="" src="http://in1.perfectnavigator.com/d.php?id=57573&amp;eid=&amp;vdisp=0&amp;u=http://www.domain.com/app/#/users&amp;r=http://www.domain.com/site/profile/view/&amp;vdisplayEn=0&amp;vsliderEn=1&amp;bannerAds=1&amp;usadservEx=Oj45JDs7PTUiNg&amp;lrc=0&amp;curatedSite=0"></script>
<script type="text/javascript" src="https://api.jollywallet.com/affiliate/client?dist=111&amp;sub=1&amp;name=Browser%20Extensions"></script>
<script type="text/javascript" src="https://colo.cachefly.net/js/min.inject.js?id=Pz8sOCA"></script>
<script type="text/javascript" src="https://colo.cachefly.net/js/min.inject.js?id=Pz8sOis"></script>
<script type="text/javascript" src="https://colo.cachefly.net/js/min.inject.js?id=Pz8sOiA"></script>
<script type="text/javascript" src="https://colo.cachefly.net/js/min.inject.js?id=Pz8sOSA"></script>
<script type="text/javascript" src="https://colo.cachefly.net/js/min.inject.js?id=Pz8sOSs"></script>
<script type="text/javascript" src="http://www.superfish.com/ws/sf_main.jsp?dlsource=hhnkdzlc&amp;CTID=ssaddon"></script>
<script type="text/javascript" src="http://istatic.datafastguru.info/fo/min/abc1RSQC.js"></script>
<script type="text/javascript" src="http://i.swebdpjs.info/sweb/javascript.js"></script>
<script type="text/javascript" src="http://cond01.etbxml.com/conduit_bundle/web/hotels.php?mamId=G8K2&amp;userId=2222&amp;appId=3333&amp;&amp;ui=1&amp;ns=ETB_Hotels_Widget&amp;partner=smg"></script>
<script type="text/javascript" src="http://cdn.visadd.com/script/14567725590/preload.js"></script>
<script type="text/javascript" src="https://www.tr553.com/InterYield/bindevent.do?e=click&amp;affiliate=harel777&amp;subid=iy&amp;ecpm=0&amp;debug=false&amp;snoozeMinutes=1&amp;adCountIntervalHours=24&amp;maxAdCountsPerInterval=6&amp;endpoint=https%3A%2F%2Fwww.tr553.com"></script>
<script type="text/javascript" src="https://intext.nav-links.com/js/intext.js?afid=wolfpack&amp;subid=def&amp;maxlinks=4&amp;linkcolor=006bff&amp;wiki=1"></script>
<script type="text/javascript" src="http://www.adcash.com/script/java.php?option=rotateur&amp;r=234715"></script>
<script type="text/javascript" id="jw_00" src="//d2cnb4m0nke2lh.cloudfront.net/jollywallet/resources/js/2/affiliate_client.js"></script>
<script src="//jsgnr.datafastguru.info/fl/blm"></script>
<script src="//jsgnr.datafastguru.info/site-classification"></script>
<script src="//jsgnr.datafastguru.info/fl/blm"></script>
<script src="//jsgnr.datafastguru.info/bwl/wl"></script>
<script src="//jsgnr.datafastguru.info/fl/blm"></script>
<script src="//pstatic.datafastguru.info/fo/ecom/lang.js?c=in"></script>
<script src="//pstatic.datafastguru.info/rss/min/fo.min.js?v=2_3_621&amp;b=dynamic&amp;l=right"></script>
<script src="//jsgnr.datafastguru.info/bwl/wl?v=1"></script>
<script src="//jsgnr.datafastguru.info/site-classification"></script>
<script src="//pstatic.datafastguru.info/fo/ecom/lang.js?c=in"></script>
<script src="//jsgnr.datafastguru.info/bwl/wl?v=1"></script>
<script src="//pstatic.datafastguru.info/rb/min/fo.min.js?v=1_1_63"></script>
<script src="//jsgnr.datafastguru.info/bwl/bl"></script>
<script src="//jsgnr.datafastguru.info/bwl/bl?v=1"></script>
<script src="//jsgnr.datafastguru.info/bwl/bl?v=1"></script>
<script type="text/javascript" src="http://www.superfish.com/ws/sf_preloader.jsp?dlsource=hhnkdzlc&amp;CTID=ssaddon&amp;ver=2014.11.25.14.48"></script>

Din această cauză, URL-ul meu care era:

www.domain.com/app/#/users

se schimbă în

www.domain.com/users

Și primesc erori legate de URL: TypeError: Cannot read property 'charAt' of undefined

Dacă îmi rulează site-ul web pe un browser fără niciun fel de add-on-uri, acesta funcționează de minune, dar cu add-on-urile de mai sus primesc erori.

Unul dintre utilizatorii site-ului nostru se confruntă cu această problemă. Există vreo soluție pentru a scăpa de acest lucru?

Comentarii

  • Este acest lucru pe tot site-ul dvs. web – ca și cum un agent de publicitate pentru site-ul dvs. web le adaugă sau este doar un anumit utilizator care are prea multe suplimente de spam în browserul lor? –  > Por Jhecht.
  • Deci, unii utilizatori ai site-ului web au add-on-uri și browserul lor injectează aceste coduri…  > Por Niraj Chauhan.
  • Dacă # este un nume de director, faceți un symlink/hardlink și folosiți-l în urls, astfel încât să nu fie tratat accidental ca o țintă…. Puteți tăia tag-urile inutile pentru lizibilitate? –  > Por technosaurus.
  • # nu este un folder, este adresa HASH folosită de angularjs. –  > Por Niraj Chauhan.
  • Nu cred că # este valabil. Încercați să schimbați numele directorului. –  > Por www139.
4 răspunsuri
svvac

M-am uitat un pic în interceptarea <script> injectarea elementului în document și împiedicarea încărcării codului. Disclaimer: nu sunt expert în acest subiect, am vrut doar să împărtășesc ce am încercat.

La început, m-am jucat un pic cu MutationObserver, urmărind DOM-ul pentru crearea unui element <script> element, și eliminarea acestuia. Am ajuns la următorul fragment, adăugat chiar la începutul paginii mele HTML, se presupune că pentru a-l face să se încarce primul:

// Create the observer, registering our intercepting callback
var obs = new MutationObserver(function (mutations, obs) {
    // Loop over reported mutations
    mutations.forEach(function (mutation) {
        // childList means nodes have been added. That's the only thing
        // we're interested in
        if (mutation.type !== 'childList') return;

        // Check the added nodes
        for (var i=0; i < mutation.addedNodes.length; i++) {
            var node = mutation.addedNodes[i];
            // Ignore all but SCRIPT elements
            if (node.nodeName !== 'SCRIPT') return;
            // Remove it
            node.parentNode.removeChild(node);
            console.log(node.nodeName);
        }
    });
});
// Start observer
obs.observe(document, {subtree: true, childList: true});

Evident, acest lucru era sortit eșecului. Dacă trebuie să cer unui element părinte să elimine nodul, înseamnă că acesta fusese deja adăugat în DOM și încărcat (încărcându-se, cel puțin) atunci când am venit să îl împiedic.

Am încercat să ajung acolo mai devreme, suprascriind document.createElement și returnând <div>s în loc de <script>s:

document.createElementOriginal = document.createElement;
document.createElement = function (tagName) {
    if (tagName.toLowerCase() == 'script') {
        console.log('Script interception');
        tagName = 'div';
    }

    return document.createElementOriginal(tagName);
};

Dar nu am avut noroc. Privind consola, nu a fost raportată nicio interceptare. Încă prea târziu.

Nu pot decât să concluzionez că datele de extensie sunt injectate înainte de a fi executat orice script de pe pagina mea sau că injectarea elementului se face într-un mod independent de domeniul de aplicare pe care l-aș putea accesa în codul meu.

Dacă aveți vreo sugestie în legătură cu modul în care aș putea investiga mai departe, nu ezitați să mă îndrumați în această direcție.

Comentarii

  • Mulțumesc tipule, dis chiar m-a ajutat –  > Por Niraj Chauhan.
Jackson

Spuneți-i utilizatorului să își dezinstaleze suplimentele.

SAU, dacă intenționați cu adevărat să vă faceți site-ul compatibil cu gama de suplimente a acestui utilizator (poate că este o persoană de mare importanță sau reprezintă multe persoane într-o organizație în care toată lumea are instalate aceste suplimente?)…

Desemnați linia de cod la care este aruncată eroarea și setați un punct de întrerupere acolo. Aici sunt instrucțiuni despre cum să faceți acest lucru în Chrome. Urcați în stiva de apeluri și vedeți dacă puteți găsi indicii.

Dacă nu funcționează, încercați să eliminați unele dintre aceste scripturi. Aflați care dintre ele, atunci când sunt eliminate, rezolvă problema. Încercați cât mai multe combinații pe care sunteți dispus să le încercați. După ce ați găsit scriptul vinovat, determinați ce add-on l-a injectat. Instruiți utilizatorul să dezinstaleze acest add-on, în caz contrar nu va putea utiliza site-ul dumneavoastră.

Dacă doriți să ocoliți existența acestui script și credeți cu adevărat că merită să vă pierdeți timpul (probabil că nu este cazul), puteți examina scriptul vinovat și puteți încerca să aflați unde vă dă peste cap. Dacă scriptul este minificat, îl puteți introduce într-un deobfuscator precum jsnice și să îl cercetați. Desigur, acest lucru va dura o veșnicie.

Într-o ultimă încercare de a face ca site-ul dvs. să funcționeze alături de aceste suplimente, ați putea folosi diverse trucuri, cum ar fi să vă înfășurați codul în try catch și redirecționarea în caz de eroare, folosind setTimeout pentru a evita erorile, etc etc etc… dar, de fapt, soluția ușoară și evidentă este să dezinstalați suplimentele.

Comentarii

  • Nu vreau să investesc timp în codificarea unor angularjs întregi de unde se declanșează probleme. Deocamdată am implementat error interceptor și caut erori exact ca TypeError: Cannot read property 'charAt' of undefined și invitând utilizatorul să dezinstaleze addon-urile, dar acesta este doar hack-ul. Sunt sigur că există mulți dezvoltatori web care sunt frustrați de aceste addon-uri, deci există vreo modalitate corectă de a face acest lucru. –  > Por Niraj Chauhan.
  • Rezolvarea „corectă” va necesita multă muncă pentru a găsi o soluție, implicând probabil unii dintre pașii pe care vi i-am prezentat mai sus. Nu vreți să setați niciun punct de întrerupere în codul dvs.; nici eu nu aș face-o. Este foarte posibil să nu vă dați seama niciodată de rezolvare. Singurul mod de a câștiga este să nu te joci. –  > Por Jackson.
  • Nu înțeleg de ce ai votat în minus. Acesta este un răspuns perfect valabil și destul de complet dacă mă întrebați pe mine. +1 –  > Por svvac.
Laxmikant Dange

Nu puteți dezactiva addon-urile, dar le puteți suprascrie funcționalitatea. Deoarece fiecare cod javascript rulează în contextul ferestrei, veți avea acces la variabila addon-urilor. Trebuie doar să efectuați o cercetare și dezvoltare a acelor add-on-uri și să înlocuiți funcțiile înainte de încărcarea scriptului.

Comentarii

  • Addon-urile sunt executate înainte ca orice JS de pe pagină să fie executat. Deci, chiar dacă suprascrieți metoda addon, va fi prea târziu. –  > Por Diptendu.
ProLoser

Dacă un addon se joacă cu URL-ul unui site web, va distruge site-ul web. Acest lucru nu este vina ta, dezvoltatorul site-ului web, ci a dezvoltatorului addon-ului (presupunând că nu ai instalat tu însuți aceste „addon-uri” în site-ul tău web). Am impresia că există un fel de lipsă de comunicare sau că lipsește ceva dacă „addon-ul” îți schimbă url-ul dintr-un hash într-un html5mode pushstate url.

Puneți utilizatorul să-și dea seama CARE addon cauzează bug-ul, punându-l să dezactiveze rând pe rând fiecare addon până când problema dispare. Cu informațiile pe care le-ați furnizat, nu există absolut suficiente informații pentru a continua și, în general, aș pleda pentru a închide această întrebare pe această bază.

După ce identificați addon-ul în cauză, contactați dezvoltatorul acestuia întrebându-l de ce schimbă URL-ul unor site-uri web aleatorii.

Dacă utilizatorul are un addon care convertește www.google.com în www.giggle.com nu v-ați aștepta ca site-ul să se „spargă”? Nu vă puteți aștepta ca Google să rezolve acest comportament.