子资源完整性:如何仅显示警告而不阻止资源?

Ste*_*rov 10 html subresource-integrity

我想对Subresource Integrity属性进行软集成,因此请确保没有破坏应用程序,而只是警告我需要修复某些地方。

是否可以选择这样做?

Agn*_*kas 5

安全方法

\n\n

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

\n\n

不安全的方法

\n\n

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

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

演示版

\n