web-dev-qa-db-fra.com

Empêcher le proxy du réseau mobile d'injecter du JavaScript

J'utilise une connexion Internet basée sur un réseau mobile et le code source est en cours de réécriture lors de la présentation du site à l'utilisateur final. 

Dans l'hôte local, mon site Web a l'air d'aller bien, mais lorsque je navigue sur le site à partir du serveur distant via la connexion réseau mobile, le site a une mauvaise apparence. 

Vérification du code source J'ai constaté qu'un élément de code JavaScript est en train d'être injecté dans mes pages, ce qui désactive certaines CSS qui font que le site a l'air mauvais.

Je ne veux pas de compression d'image ou de bande passante à la place de mon CSS bien conçu. 

Comment puis-je empêcher ou empêcher le fournisseur de réseau mobile (Vodafone dans ce cas) d’injecter son code JavaScript dans le code source de son proxy?

43
Masud Rahman

Vous pouvez l'utiliser sur vos pages. Il compresse toujours et met tout en ligne mais il ne cassera pas les scripts comme jquery car il échappera à tout ce qui est basé sur les standards W3C.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

Sur votre serveur, vous pouvez définir le contrôle cahce

"Cache-Control: no-transform"

Ceci arrêtera TOUTES LES modifications et présentera votre site tel quel!

Référence docs ici

http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.5

http://stuartroebuck.blogspot.com/2010/08/official-way-to-bypassing-data.html

Le site Web présente une erreur JavaScript sur iPad/iPhone en 3G mais pas en WiFi

41
ppumkin

Vous n'êtes certainement pas le premier. Malheureusement, de nombreux fournisseurs de services Internet sans fil utilisent cette approche grossière et importune de la compression. Il vient de Bytemobile .

Ce qu’il fait, c’est de faire en sorte que le proxy recompresse par défaut toutes les images que vous récupérez plus petites (ce qui aggrave considérablement la qualité de l’image). Ensuite, il injecte grossièrement dans votre document un script qui ajoute une option permettant de charger la bonne image pour chaque image recompressée. Malheureusement, comme le script est un JS horriblement écrit du style des années 1990, il occupe votre espace-noms, détourne vos gestionnaires d’événements et risque fort de gâcher vos propres scripts.

Je ne connais pas de moyen d'arrêter l'injection elle-même, à moins d'utiliser HTTPS. Mais ce que vous pourriez faire, c'est détecter ou saboter le script. Par exemple, si vous ajoutez un script près de la fin du document (entre l'inclusion du script 1.2.3.4 et le déclencheur de script inline) pour neutraliser le hook onload utilisé:

<script type="text/javascript">
    bmi_SafeAddOnload= function() {};
</script>

alors le script ne serait pas exécuté, vos événements et votre DOM resteraient ainsi seuls. D'autre part, le script initial aurait toujours jeté de la malbouffe dans votre espace de noms et tous les problèmes de marquage qu'il entraînerait seraient toujours présents. En outre, l'utilisateur sera bloqué avec les images recompressées, incapable d'obtenir les originaux.

Vous pouvez simplement essayer d'informer l'utilisateur:

<script type="text/javascript">
    if ('bmi_SafeAddOnload' in window) {
        var el= document.createElement('div');
        el.style.border= 'dashed red 2px';
        el.appendChild(document.createTextNode(
            'Warning. Your wireless ISP is using an image recompression system '+
            'that will make pictures look worse and which may stop this site '+
            'from working. There may be a way for you to disable this feature. '+
            'Please see your internet provider account settings, or try '+
            'using the HTTPS version of this site.'
        ));
        document.body.insertBefore(el, document.body.firstChild);
    }
</script>
33
bobince

Je suis surpris que personne n'ait encore répondu à cette question. La vraie solution est:

UTILISEZ HTTPS!

C’est le seul moyen d’empêcher les fournisseurs de services Internet (ou toute autre personne) d’inspecter l’ensemble de votre trafic, d’observer vos visiteurs et de modifier votre site Web en vol.

Avec l'avènement de Let's Encrypt , l'obtention d'un certificat est maintenant gratuite et facile. Il n'y a vraiment aucune raison de ne pas utiliser HTTPS de nos jours.

Vous devez également utiliser une combinaison de redirections et HSTS pour conserver tous vos utilisateurs sur HTTPS.

10
Cam Jackson

Votre fournisseur a peut-être activé une fonctionnalité de Bytemobile Unison appelée "personnalisation sans client". Essayez d'accéder à l'URL fixe http://1.2.3.50/ups/ - s'il est configuré, vous vous retrouverez sur une page qui vous proposera de désactiver toutes les fonctionnalités que vous n'aimez pas. Y compris l'injection Javascript.

Bonne chance! Alex.

8
Alexander Janssen

Si vous écrivez vous-même vos sites Web, l'ajout d'un en-tête a fonctionné pour moi:

PHP:
    Header("Cache-Control: no-transform");
C#:
    Response.Cache.SetNoTransforms();
VB.Net:
    Response.Cache.SetNoTransforms()

Assurez-vous de l'utiliser avant que des données aient été envoyées au navigateur.

7
Russell Harkins

J'ai trouvé un truc. Il suffit d'ajouter:

<!--<![-->

Après:

<html>

Plus d'informations (en allemand):

http://www.programmierer-forum.de/bmi-speedmanager-und-co-deaktivieren-als-webmaster-t292182.htm#3889392

5
mgutt

BMI js, ce n’est pas seulement sur Vodafone. Verginmedia UK et T-Mobile UK vous offrent également cette fonctionnalité supplémentaire activée par défaut et gratuitement. ; -) Dans T-mobile, il s’appelle "accélérateur de haut débit mobile" Vous pouvez visiter: http://accelerator.t-mobile.co.uk Ou http://1.2.3.50/ pour le configurer.

Au cas où ce qui précède ne vous concerne pas ou pour une raison quelconque, ce n'est pas une optionvous pourriez éventuellement configurer votre proxy local (Polipo w/Tor) Il existe également un module complémentaire pour Firefox appelé "blocksite". ou en tant qu’approche plus radicale, réinitialisez la connexion TCP à 1.2.3.0/24:80 sur votre pare-feu . Malheureusement, cela ne résoudra pas les dégâts.

Drôle de support pour T-mobile et Verginmedia Mobile/large bande n'est pas au courant de cette fonctionnalité! (2011.10.11)

1
pawciobiel

PHP: En-tête ("Cache-Control: no-transform"); Merci! Je suis heureux d'avoir trouvé cette page. 

Ce script Injector gâchait le code source de ma page php, ce qui me faisait penser que j'avais commis une erreur dans mon codage php lors de l'affichage du code source de la page. Même si le script a été bloqué avec firefox NoScript add on. Mon code était encore foiré… .. Eh bien, après ce dilemme irritant, je voulais m'en débarrasser complètement et ne pas simplement le bloquer avec des add ons adblock ou noscript firefox ou juste sur ma page php. 

  1. STOP http: // 1.2.3.4 Complètement dans Firefox : Obtenez l’ajout sur: Modifier En-têtes .
  2. Aller à la modification d'en-tête ajouter des options ... maintenant sur l'onglet en-tête.
  3. Sélectionnez une action: choisissez Ajouter.
  4. Pour le nom d’en-tête, entrez: cache-control
  5. Pour le type de valeur d'en-tête dans: no-transform
  6. Pour le commentaire, tapez: Bloc 1.2.3.4
  7. Cliquez sur Ajouter ... Cliquez ensuite sur Démarrer.

Le script 1.2.3.4 ne sera plus injecté! Ouais!

Je ne vois plus que 1.2.3.4 soit bloqué par NoScript. parce que ce n'est pas là. Ouais.

Mais je vais quand même ajouter: PHP: Header ("Cache-Control: no-transform"); sur mes pages php.

1
Bob

Si vous l'obtenez sur un site que vous possédez ou que vous développez, vous pouvez simplement remplacer la fonction en la définissant sur null. C'est ce qui a bien fonctionné pour moi. 

bmi_SafeAddOnload = null;

Pour ce qui est de l’obtenir sur les autres sites que vous visitez, vous pourrez probablement ouvrir la console devtools et y entrer simplement et l’effacer si une page prend beaucoup de temps à se charger. Je n'ai pas encore testé cela.

0
jaredwilli

Ok rien ne fonctionne pour moi. Ensuite, je remplace l’URL de l’image toutes les secondes car, lorsque mon DOM est mis à jour, le problème se pose de nouveau. Une autre solution consiste à utiliser uniquement le style d'arrière-plan à inclure automatiquement dans les pages. Rien n'est propre.

setInterval(function(){ imageUpdate(); }, 1000);

function imageUpdate() {
    console.log('######imageUpdate');
    var image = document.querySelectorAll("img");
    for (var num = 0; num < image.length; num++) {
        if (stringBeginWith(image[num].src, "http://1.1.1.1/bmi/***yourfoldershere***")) {
            var str=image[num].src;
            var res=str.replace("http://1.1.1.1/bmi/***yourfoldershere***", "");
            image[num].src = res;
            console.log("replace"+str+" by "+res);
            /*
            other solution is to Push img src in data-src and Push after dom loading all your data-src in your img src
            var data-str=image[num].data-src;
            image[num].src = data-str;
            */
            }
        }
}

function stringEndsWith(string, suffix) {
    return string.indexOf(suffix, string.length - suffix.length) !== -1
}
function stringBeginWith(string, prefix) {
    return string.indexOf(prefix, prefix.length-string.length) !== -1
}
0
Falkenj80