我想在 nginx 中应用默认的 CSP 标头 - 基本上是一个万能的。但是,我还希望能够在某些脚本中通过 PHP 覆盖 CSP 标头。到目前为止,我还没有找到一种方法来做到这一点,结果是我得到了 2 个标头 - 第一个来自 PHP,第二个来自 Nginx,最后一个标头优先于第一个。
在 nginx 中我有:
add_header Content-Security-Policy "default-src 'self';";
然后是 PHP 文件的一个问题:
location ~ [^/]\.php(/|$) {
fastcgi_split_path_info ^(.+?\.php)(|/.*)$;
fastcgi_pass 127.0.0.1:9000;
include fastcgi_params;
fastcgi_param HTTP_PROXY "";
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param QUERY_STRING $query_string;
fastcgi_intercept_errors on;
fastcgi_connect_timeout 300;
fastcgi_send_timeout 3600;
fastcgi_read_timeout 3600;
fastcgi_buffer_size 128k;
fastcgi_buffers 4 256k;
fastcgi_busy_buffers_size 256k;
fastcgi_temp_file_write_size 256k;
}
我尝试过fastcgi_param
看看是否可以从 PHP 中取回标头,并且仅 add_header (如果未设置),以及尝试:
if ($http_content_security_policy = "") {
add_header Content-Security-Policy "default-src 'self';";
}
但到目前为止还没有成功。我猜想这是 Nginx 中 PHP 标头值的时间或访问问题?任何帮助都非常感谢。
注意:我正在使用 Azure Web 应用程序,因此我认为我无法添加任何非 Nginx 默认模块
答案1
add_header
如果提供的值是空字符串,该指令将不会生成标题。
您可以add_header
使用map
块为语句提供各种值。请参阅map
指令性文件。
PHP 脚本返回的标头可用作$upstream_http_content_security_policy
。
因此解决方案是使用块测试 PHP 脚本返回的值map
,并且仅当脚本没有返回标头时才设置默认值。
例如:
map $upstream_http_content_security_policy $csp_value {
"" "default-src 'self';";
}
add_header Content-Security-Policy $csp_value;
$upstream_http_content_security_policy
仅当变量为空(意味着脚本未提供替代值)时才会插入 Content-Security-Policy 的默认标头。
注意,map
块必须放在server
块之外。add_header
语句可以保留在当前定义它的位置。