web-dev-qa-db-fra.com

Les annonces sur une page peuvent-elles lire mon mot de passe?

Clause de non-responsabilité: J'ai peu de connaissances en développement Web/sécurité, veuillez donc répondre comme si vous parliez à un "profane".

J'ai entendu dire que les publicités Web doivent pouvoir exécuter leur propre JavaScript afin qu'elles puissent vérifier qu'elles sont vues par de "vrais utilisateurs". Comme cet incident sur StackOverflow le montre, ils ont fondamentalement droit à la liberté.

Je sais également que JavaScript peut être utilisé pour capturer les frappes sur une page Web .

Donc, dans un cas comme goodreads , où ils ont des annonces sur la page et des zones de texte utilisateur/passe dans l'en-tête, y a-t-il quelque chose en place pour empêcher l'annonce de lire les frappes pour enregistrer mes informations d'identification? La lecture des touches n'est-elle tout simplement pas possible à partir d'une annonce?

Si je vois des annonces sur une page de connexion, dois-je supposer que la page n'est pas sécurisée pour entrer mes informations d'identification?

250
scohe001

Rien n'empêche les publicités de lire vos mots de passe.

Les annonces (ou tout autre script comme les bibliothèques d'analyse ou JavaScript) ont accès à la portée principale de JavaScript et sont capables de lire de nombreuses informations sensibles: informations financières, mots de passe, jetons CSRF, etc.

Eh bien, à moins qu'ils ne soient chargés dans un iframe en bac à sable.

Le chargement d'une annonce dans un iframe en bac à sable ajoutera des restrictions de sécurité à la portée JavaScript à laquelle il a accès, il ne sera donc pas en mesure de faire des choses désagréables.

Malheureusement, la plupart des scripts tiers ne sont pas mis en sandbox. En effet, certains d'entre eux nécessitent un accès à la portée principale pour fonctionner correctement, donc ils ' re presque jamais bac à sable.


En tant que développeur, que puis-je faire?

Étant donné que tout script tiers pourrait compromettre la sécurité de toutes vos données personnelles, toutes les pages sensibles (comme les formulaires de connexion ou les pages de paiement) devraient être chargées sur leur propre origine (un sous-domaine est très bien).

L'utilisation d'une autre origine nous permet de profiter de la même politique d'origine : les scripts exécutés sur l'origine principale ne peuvent accéder à rien sur l'origine protégée.

Remarque: Politique de sécurité du conten et Intégrité de la sous-ressource pourrait également être utilisé si le tiers peut être facilement examiné, mais la plupart des réseaux publicitaires ne pourraient plus fonctionner si vous les avez utilisés.

222
Benoit Esnard

Cela dépend de la façon dont le site Web charge les annonces.

Dans le cas de goodreads, leur code HTML contient du javascript du fournisseur d'annonces. Plus précisément, les lignes 81 à 145 du document HTML renvoyées par https://www.goodreads.com/ lis:

<script>
  //<![CDATA[
    var gptAdSlots = gptAdSlots || [];
    var googletag = googletag || {};
    googletag.cmd = googletag.cmd || [];
    (function() {
      var gads = document.createElement("script");
      gads.async = true;
      gads.type = "text/javascript";
      var useSSL = "https:" == document.location.protocol;
      gads.src = (useSSL ? "https:" : "http:") +
      "//securepubads.g.doubleclick.net/tag/js/gpt.js";
      var node = document.getElementsByTagName("script")[0];
      node.parentNode.insertBefore(gads, node);
    })();
    // page settings
  //]]>
</script>
<script>
  //<![CDATA[
    googletag.cmd.Push(function() {
      googletag.pubads().setTargeting("sid", "osid.bd63050e605ccee9f21515a2dedfdaea");
    googletag.pubads().setTargeting("grsession", "osid.bd63050e605ccee9f21515a2dedfdaea");
    googletag.pubads().setTargeting("surface", "desktop");
    googletag.pubads().setTargeting("signedin", "false");
    googletag.pubads().setTargeting("gr_author", "false");
    googletag.pubads().setTargeting("author", []);
      googletag.pubads().enableAsyncRendering();
      googletag.pubads().enableSingleRequest();
      googletag.pubads().collapseEmptyDivs(true);
      googletag.pubads().disableInitialLoad();
      googletag.enableServices();
    });
  //]]>
</script>
<script>
  //<![CDATA[
    ! function(a9, a, p, s, t, A, g) {
      if (a[a9]) return;

      function q(c, r) {
        a[a9]._Q.Push([c, r])
      }
      a[a9] = {
      init: function() {
        q("i", arguments)
      },
      fetchBids: function() {
        q("f", arguments)
      },
      setDisplayBids: function() {},
        _Q: []
      };
      A = p.createElement(s);
      A.async = !0;
      A.src = t;
      g = p.getElementsByTagName(s)[0];
      g.parentNode.insertBefore(A, g)
    }("apstag", window, document, "script", "//c.Amazon-adsystem.com/aax2/apstag.js");

    apstag.init({
      pubID: '3211', adServer: 'googletag', bidTimeout: 4e3
    });
  //]]>
</script>

Par conséquent, le code javascript de l'annonceur s'exécute dans le même contexte d'exécution que le site Web lui-même et peut faire tout ce que le site Web peut, y compris en observant toutes vos interactions avec le site Web.

S'ils avaient à la place chargé les annonces en incorporant une iframe d'une autre origine, le code de l'annonceur se serait exécuté dans son propre contexte d'exécution et le navigateur aurait bloqué l'accès au site Web environnant en violation de la même politique d'origine.

En général, la seule façon de savoir si le site Web a isolé le code de l'annonceur est d'inspecter le code du site Web.

29
meriton