【问题标题】:Subresource Integrity: How to show only warning but not block resource?子资源完整性:如何仅显示警告而不显示阻止资源?
【发布时间】:2019-08-17 00:44:17
【问题描述】:

我想为子资源完整性属性进行软集成,所以请确保我没有破坏应用程序,只是为了显示警告 我需要修复一些地方。

有没有办法这样做?

【问题讨论】:

    标签: html subresource-integrity


    【解决方案1】:

    安全方法

    如果您需要某种灵活性,那么您应该使用fallback mechanism - 从另一个 URL 加载所需的资源。与仅入侵一个资源相比,同时入侵两个不同 URL 的概率要小得多。回退不会违反站点安全性,因为您必须信任您在代码中使用的已知良好来源。如果您的资源是 Javascript - 您也可以使用 noncanonical-src 属性作为后备。

    不安全的方法

    现在,如果您真的非常希望用户通过强制加载受损资源来破坏服务器和/或客户端安全 - 至少询问用户他/她是否对此负责。当然,这仍然是一件愚蠢的事情,就像问“你想在你的计算机上运行病毒吗?”。我敢打赌,没有人愿意说是。无论如何,这是代码,它确实会问这些类型的问题:

    <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.9-1/crypto-js.min.js"></script>
      <script>
      function loadResource(path) {
        var xhttp = new XMLHttpRequest();
        xhttp.onreadystatechange = function() {
          if (this.readyState == 4 && this.status == 200) {
            var cs = CryptoJS.SHA256(this.responseText);
            if (btoa(cs) == 'NjBiMTllNWRhNmE5MjM0ZmY5MjIwNjY4YTVlYzExMjVjMTU3YTI2ODUxMzI1NjE4OGVlODBmMmQyYzhkOGQzNg==' ||
                confirm('Bootstrap is NOT the latest version 4.3.1, load anyway ?')
               ) {
              var link = document.createElement('link');
              link.rel = "stylesheet";
              link.href = path;
              document.head.appendChild(link);
            }
            else {
               var err = document.getElementById('error');
               err.title = "Component version error !";
               err.innerHTML = '&nbsp;⚠️';
            }
          }
        };
        xhttp.open("GET", path, true);
        xhttp.send();
      }
    
      loadResource(
                  //'https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css' // newest boostrap
                  'https://stackpath.bootstrapcdn.com/twitter-bootstrap/2.0.4/css/bootstrap-combined.min.css' // old legacy
                  );
      </script>
    

    DEMO

    【讨论】:

      【解决方案2】:

      我不建议只在 SRI-Hash 不匹配时显示警告。当作为用户看到警告时,已经为时已晚,并且可能在您的计算机上执行了恶意脚本。

      但是,您可以使用ServiceWorker-API 和&lt;script data-integrity="xxxxxxxx"&gt; 之类的东西来实现您想要的行为。为此,您需要:

      1. 注册一个新的ServiceWorker
      2. 收听fetch事件
      3. [Client.postMessage]你的父母的目标网址
      4. 通过 targetURL $('script[src=event.data.targetURL]').attr('data-integrity') 获取脚本完整性哈希
        并使用Worker.postMessage 将其推送到客户端
      5. 使用例如散列响应cryptojs.sha256
      6. 匹配worker内部的哈希值
      7. 如果哈希匹配,则返回响应。如果它们不匹配,则返回响应并再次使用Client.postMessage 来触发警告。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-13
        • 2013-11-11
        • 2016-11-02
        • 2012-07-27
        • 2016-07-05
        • 2012-05-20
        相关资源
        最近更新 更多