Javascript 提供php文件时,apache conf中定义的CSP不起作用

Javascript 提供php文件时,apache conf中定义的CSP不起作用,javascript,php,html,apache,Javascript,Php,Html,Apache,我正在配置一个站点的apachecsp锁定,当我打开与php脚本相同的文件而不是作为html文件打开时,遇到了一个奇怪的行为 html文件是: <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"&g

我正在配置一个站点的apachecsp锁定,当我打开与php脚本相同的文件而不是作为html文件打开时,遇到了一个奇怪的行为

html文件是:

<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <meta http-equiv="cache-control" content="no-cache" />
    <script TYPE="text/javascript" src="injectblob.js" nonce="NEFFZW1HYjB4SnB0b0lHRlAzTmQ="></script>
  </head>
  <body>
   here
  </body>
</html>
我在apache conf中的虚拟主机中设置的CSP头是:

Header add Content-Security-Policy "default-src 'self' blob: 'nonce-NEFFZW1HYjB4SnB0b0lHRlAzTmQ='"
Header add Content-Security-Policy "script-src 'self' 'nonce-NEFFZW1HYjB4SnB0b0lHRlAzTmQ='"
当它作为html文件运行时,CSP正在工作,浏览器控制台窗口中会显示相应的警告“拒绝执行内联脚本,因为它违反了..”。但是,当我运行与php相同的文件时,注入的脚本会像不存在CSP规则一样运行

在浏览器网络窗口中,单击文件,会显示html文件的CSP规则,但不会显示php文件的CSP规则

我知道我可以在php中添加适当的头,但是只在一个地方定义CSP会比较方便,如果Nessery在必要时在php中否决它们,比如我想在某些脚本标记中设置sha哈希,以便通过获取接收的加密/解密javascript注入

我的问题有两方面

  • 我是否可以在apacheconf中设置CSP,以便将规则应用于php脚本和html文件

  • 如果问题1的答案是肯定的,那么php中设置的CSP头是否会推翻apache conf中设置的CSP头


  • 很明显,在我提出这个问题之前,我没有深入挖掘。如果包装在指令中,则为apache虚拟主机conf的csp头部分。我没有在filesMatch指令中包含php

    至于用php头重写apacheconf。它不起作用。Apache是最顶级的CSP

    为了获得问题中提到的功能,我必须在指令中结合apache中的filematch而不使用php,并手动在php中包含适当的头,并且始终注意在php脚本中包含它们。如果我想在某些脚本标记中设置一个sha哈希,通过获取接收到的加密/解密javascript进行注入,这可能不是最安全的方法,但却是唯一的方法。解决方案容易出现人为错误,我知道:-(

    "use strict"
    var inject1=function(){
      const s = document.createElement('script');
      s.textContent = 'alert("STRING says hello")';
      s.setAttribute("type","text/javascript");
    //  s.setAttribute("nonce","NEFFZW1HYjB4SnB0b0lHRlAzTmQ=");
      document.head.appendChild(s);
    }
    
    var inject2=function(){
      const s = document.createElement('script');
      const b = new Blob(['alert("BLOB says hello")'], { type: 'text/javascript' });
      const u = URL.createObjectURL(b);
      s.src = u;
      s.setAttribute("type","text/javascript");
    //  s.setAttribute("nonce","NEFFZW1HYjB4SnB0b0lHRlAzTmQ=");
      document.head.appendChild(s);
    }
    window.onload=function(){
      inject1();
      inject2();
    }
    
    Header add Content-Security-Policy "default-src 'self' blob: 'nonce-NEFFZW1HYjB4SnB0b0lHRlAzTmQ='"
    Header add Content-Security-Policy "script-src 'self' 'nonce-NEFFZW1HYjB4SnB0b0lHRlAzTmQ='"