页面上的广告可以读取我的密码吗?

信息安全 密码 Web应用程序
2021-09-02 22:05:12

免责声明:我的网络开发/安全知识很少,所以请像在与“外行”交谈一样回答。

我听说网络广告需要能够运行自己的 JavaScript,这样才能验证“真实用户”正在查看它们。正如StackOverflow 上的这一事件所表明的那样,他们基本上可以自由支配。

我还知道 JavaScript可用于捕获网页上的击键

因此,在像goodreads这样的情况下,他们在页面上有广告,并且在标题上有用户/传递文本框,是否有什么措施可以防止广告读取击键来记录我的凭据?是否根本无法从广告中读取击键?

如果我在登录页面上看到广告,我是否应该认为该页面不安全,无法输入我的凭据?

2个回答

没有什么可以阻止广告读取您的密码。

广告(或任何其他脚本,如分析或 JavaScript 库)可以访问主要的 JavaScript 范围,并且能够读取许多敏感内容:财务信息、密码、CSRF 令牌等。

好吧,除非它们被加载到沙盒 iframe 中。

在沙盒 iframe中加载广告会给它可以访问的 JavaScript 范围添加安全限制,因此它无法做讨厌的事情。

不幸的是,大多数第三方脚本都没有沙盒。这是因为它们中的一些需要访问主范围才能正常工作,因此它们几乎从未被沙盒化。


作为开发人员,我能做什么?

由于任何第三方脚本都可能危及您所有个人数据的安全性,因此所有敏感页面(如登录表单或结帐页面)都应加载到它们自己的来源(子域很好)。

使用另一个源允许我们从同源策略中获利:在主源上运行的脚本无法访问受保护源上的任何内容。

注意:如果可以轻松审查第三方,也可以使用内容安全策略子资源完整性,但如果您使用它们,大多数广告网络将无法再工作。

这取决于网站如何加载广告。

对于 goodreads,它们的 HTML 包含来自广告提供商的 javascript。具体来说,read 返回的 HTML 文档的第 81-145 行https://www.goodreads.com/

<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>

因此,广告商的 javascript 代码在与网站本身相同的执行上下文中运行,并且可以做网站可以做的所有事情,包括观察您与网站的所有交互。

如果他们通过嵌入来自不同来源的 iframe 来加载广告,则广告商的代码将在其自己的执行上下文中运行,并且浏览器将阻止对周围网站的访问,因为这违反了同源政策。

一般来说,判断网站是否隔离了广告商代码的唯一方法是检查网站的代码。