在nginx配置中将换行符放入add_header可以吗?

Cod*_*key 7 nginx

我已经搜索了该主题,但在nginx配置中找不到任何表示“确定”的内容?

除了弄乱vim中突出显示的语法外,这似乎工作得很好:

add_header Content-Security-Policy "default-src 'self' *.google-analytics.com;
                                     object-src 'none';
                                     report-uri /csp-report;";
Run Code Online (Sandbox Code Playgroud)

但这真的有效吗?我是依靠浏览器来了解CSP中的换行符吗,还是nginx在提供它之前将其分成一行?Fiddler似乎将其​​显示为一行,但是我也不知道nginx是否以此为目的或者Fiddler是否以这种方式进行解释。

(这显然是我真正的CSP的简化版本,它肯定足够长,以至于我认为将其分为多行有益于我的理智!)

sys*_*fal 29

您可以像这样使用变量嵌套,它最终仍会创建一个单行:

set $SCRIPT "script-src 'self'";
set $SCRIPT "${SCRIPT} https://www.a.com"; # comment each line if you like
set $SCRIPT "${SCRIPT} https://b.com";
set $STYLE "style-src 'self'";
set $STYLE "${STYLE} https://a.com";
set $IMG "img-src 'self' data:";
set $IMG "${IMG} https://a.com";
set $IMG "${IMG} https://www.b.com";
set $FONT "font-src 'self' data:";
set $FONT "${FONT} https://a.com";
set $DEFAULT "default-src 'self'";
set $CONNECT "connect-src 'self'";
set $CONNECT "${CONNECT} https://www.a.com";
set $CONNECT "${CONNECT} https://www.b.com";
set $FRAME "frame-src 'self'";
set $FRAME "${FRAME} https://a.com";
set $FRAME "${FRAME} https://b.com";
add_header Content-Security-Policy "${SCRIPT}; ${STYLE}; ${IMG}; ${FONT}; ${DEFAULT}; ${CONNECT}; ${FRAME}";
Run Code Online (Sandbox Code Playgroud)


Ric*_*ith 8

不幸的是,nginx按字面意义处理引号之间的空白,因此,只要您以空格或制表符开头的每一行,标题将保持有效。

但是,可以创建无效的头。例如,这产生一个无效的头:

add_header Content-Security-Policy "default-src 'self' *.google-analytics.com;
object-src 'none';
report-uri /csp-report;";
Run Code Online (Sandbox Code Playgroud)

拆分标题行的支持在RFC 7230中已弃用:

根据RFC 7230第3.2.4节

从历史上看,HTTP头字段值可以通过在
每条额外的行之前加上至少一个空格
或水平制表符(折叠)来扩展到多行。
除了在message / http媒体类型内,此规范不建议使用这种折行

最安全的解决方案是接受配置文件中的某些行可能比您希望的长得多。

  • 这真的很糟糕。如果 CSP 是一大行,那么读取差异和审计 CSP 都会变得更加困难。 (2认同)