如何在站点B上使用nginx proxy_pass提供服务内容时覆盖站点A的内容安全策略?

时间:2015-10-23 10:23:28

标签: security nginx proxy content-security-policy

当我在站点B上使用nginx proxy_pass时,是否有办法覆盖域/站点A设置的Content-Security-Policy。

Site A defined Content-Security-Policy on their domain.
Site B acts as a reverse proxy for site A.

如何在提供来自网站B的内容时覆盖Content-Security-Policy?

我如何在nginx代理传递中实现这一点?

我当前的nginx服务器块看起来像这样

server {
server_name  proxy-domain.com.;

    location / {
      proxy_pass http://www.target-site.com/;
      proxy_set_header  Accept-Encoding ""; 
      proxy_set_header  X-Real-IP   $remote_addr;   
      proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
   }
}

我试过添加

add_header Content-Security-Policy" default-src' self' '不安全直插' '不安全-EVAL'

e.g。

server {
server_name  proxy-domain.com.;

    location / {
      proxy_pass http://www.target-site.com/;
      proxy_set_header  Accept-Encoding ""; 
      proxy_set_header  X-Real-IP   $remote_addr;   
      proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
   }
add_header Content-Security-Policy "default-src 'self' 'unsafe-inline' 'unsafe-eval'
}

但是如果我检查站点B的标题,那么它会显示站点B的修改后的Content-Security-Policy,但是其他来源的内容不会被加载。只有标题被设置。

为什么会这样?

更新: 当我检查标题时,我得到2个Content-Security-Policy标题,首先由站点A设置,然后将一个Content-Security-Policy标题设置为我的站点B.

e.g。

Content-Security-Policy: default-src 'self' 'unsafe-inline' 'unsafe-eval' apis.google.com www.google.com;
Content-Security-Policy: default-src 'self' 'unsafe-inline' 'unsafe-eval' *.cloudflare.com;

1 个答案:

答案 0 :(得分:3)

此问题与Nginx邮件列表中的Nginx as reverse Proxy, remove X-Frame-Options header线程类似。该解决方案是proxy_hide_header

  

默认情况下,nginx不会传递标题字段“Date”,“Server”,   代理服务器响应的“X-Pad”和“X-Accel -...”   客户。 proxy_hide_header指令设置其他字段   不会通过。相反,如果需要通过田地   如果允许,可以使用proxy_pass_header指令。