覆盖特定位置的 CSP 标头

Syn*_*hro 3 nginx

我有一个 nginx 配置,其中包含为所有请求提供服务的 CSP 标头。现在我需要在一个特定位置覆盖它(也恰好被重写)。我在想这样的事情:

server {
  listen 80;
  listen [::]:80;

  server_name example.com;
  root /var/www;
  index index.php;

  try_files $uri @rewrites;

  add_header Content-Security-Policy "default-src 'self' ; script-src 'self' ; style-src 'self' 'unsafe-inline' ; img-src * 'self' data: ; font-src 'self' ; media-src * 'self' ; form-action 'self'";

  location @rewrites {
    rewrite ^/special/([0-9]*) /special.php?id=$1 last;
    rewrite ^/foo/([a-z]+) /foo.php?method=$1 last;
  }

  location /special {
    add_header Content-Security-Policy "default-src 'self' ; script-src 'self' 'unsafe-inline' ; style-src 'self' 'unsafe-inline' ; img-src * 'self' data: ; font-src 'self' ; media-src * 'self' ; form-action 'self'";
  }

  location ~ \.php$ {
    try_files $uri =404;
    fastcgi_split_path_info ^(.+?\.php)(/.*)$;
    include fastcgi_params;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_pass php;
  }
}
Run Code Online (Sandbox Code Playgroud)

但是,虽然这会在任何以 开头的请求上设置标头/special,但会导致 404,因为它不会继续到映射 PHP 文件的以下位置。我该怎么做?

gf_*_*gf_ 6

尝试看看以下是否适合您:

http 语境:

map $request_uri $csp_header {
    default "default-src 'self' ; script-src 'self' ; style-src 'self' 'unsafe-inline' ; img-src * 'self' data: ; font-src 'self' ; media-src * 'self' ; form-action 'self'";
    "~^/special" "default-src 'self' ; script-src 'self' 'unsafe-inline' ; style-src 'self' 'unsafe-inline' ; img-src * 'self' data: ; font-src 'self' ; media-src * 'self' ; form-action 'self'";
}
Run Code Online (Sandbox Code Playgroud)

server 语境:

add_header Content-Security-Policy $csp_header;
Run Code Online (Sandbox Code Playgroud)

  • @Synchro 另外,因为看起来值几乎相同,并减少代码重复:您可以尝试仅区分`script-src`并保持其余相同,但我不确定稍后添加时是否有效标头(在带引号的指令中使用 var)。我担心这是不可能的,但如果您尝试一下,我会对反馈感兴趣。 (2认同)