【问题标题】:Disabling javascript with javascript by injecting Content-Security-Policy通过注入 Content-Security-Policy 禁用 javascript
【发布时间】:2017-05-12 00:18:14
【问题描述】:

编辑:如果有另一种使用 javascript 禁用 javascript 的方法 - 我全神贯注。

我正在尝试通过“注入”一个 javascript 来禁用 javascript

<meta http-equiv="Content-Security-Policy" content="script-src 'none' ">

进入元素。根据 Firefox 开发工具 -> 检查器,该元素已添加,但被忽略。为什么,以及如何让浏览器“注意到”它?

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <!-- 
      yes, this works, but I want to do this dynamically
      <meta http-equiv="Content-Security-Policy" content="script-src 'none' ">
    -->
  </head>

  <body>
    Just some javascript for tests, I hoped this will stop working, 
    when I'll call the  disableJavaScript() function below. But it
    doesn't stop    
    <script>
      var x =  0;
      setInterval(function(){
        console.log(x++);
      }
      ,1000);
    </script>

    Inserting the meta element:

    <script>
    function disableJavaScript(){
        var newMetaNode = document.createElement("meta");
        newMetaNode.setAttribute('http-equiv','Content-Security-Policy'); 
        newMetaNode.setAttribute('content',"script-src 'none'");
        var headElem = document.getElementsByTagName('head')[0];
        headElem.appendChild(newMetaNode);
      }

    //calling the function after 3 seconds:
    setTimeout(function(){
      disableJavaScript();  
    },3000)  

    </script>

  </body>

</html> 

【问题讨论】:

  • 用例是什么……?为什么要禁用 Javascript?为什么不能静态添加meta header?
  • 使用 setTimeout() 的阻塞版本:stackoverflow.com/a/39914235/2104879
  • 抛出错误会停止当前进程,但仍然不会停止 setTimeoutsetInterval 和 ajax 请求。
  • @mertyildiran 不。不。宁。如果您有一个阻塞 anything,整个浏览器 UI 将无响应。此外,这不是“阻塞 setTimeout”。
  • 用户不能通过打开标签页上的浏览器开发工具并选择禁用 JavaScript 来禁用每个标签页的 JavaScript 吗?

标签: javascript dom content-security-policy


【解决方案1】:

script-src 策略不会禁用 JavaScript。在您声明策略后,它会禁止加载使用 &lt;script&gt; 标签引用的新内容,这些标签是 inserted into a document

元元素中的策略不适用于前面的内容 他们。

https://w3c.github.io/webappsec-csp/#meta-element

如果您将“测试”标签更改为:

<script>
  var x =  0;
  setInterval(function(){
    var newNode = document.createElement("script");
    var newText = document.createTextNode("console.log("+ x++ +")")
    var bodyElem = document.getElementsByTagName('body')[0];
    newNode.appendChild(newText)
    bodyElem.appendChild(newNode);
  }
  ,1000);
</script>

CSP 无法以某种方式追溯“取消”在强制执行之前加载的内容。您需要查看特定于浏览器的扩展 API。

【讨论】:

  • 谢谢奥列格 :)
猜你喜欢
  • 2021-04-13
  • 2019-09-24
  • 2018-04-08
  • 2017-05-25
  • 2021-05-08
  • 2021-04-20
  • 2013-01-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多