【问题标题】:Is it ok to put line-breaks in add_header in nginx configuration?可以在 nginx 配置中的 add_header 中放置换行符吗?
【发布时间】:2023-03-17 04:02:01
【问题描述】:

我已经搜索了这个主题,但在 nginx 配置中找不到任何说明这是否“正常”的内容?

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

add_header Content-Security-Policy "default-src 'self' *.google-analytics.com;
                                     object-src 'none';
                                     report-uri /csp-report;";

但它真的有效吗?我是依靠浏览器理解 CSP 中的换行符,还是 nginx 在提供之前将其渲染为一行? Fiddler 似乎将其显示为一行,但我再次不知道 nginx 是否将其用作该行,或者 Fiddler 是否将其解释为该行。

(这显然是我真正的 CSP 的一个非常简化的版本,它肯定足够长,我认为将它分成多行对我的理智有益!)

【问题讨论】:

    标签: nginx


    【解决方案1】:

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

    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}";
    

    【讨论】:

    • 谢谢。这应该是公认的答案。完美运行。
    【解决方案2】:

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

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

    add_header Content-Security-Policy "default-src 'self' *.google-analytics.com;
    object-src 'none';
    report-uri /csp-report;";
    

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

    来自RFC 7230 section 3.2.4

    从历史上看,HTTP 标头字段值可以扩展
    多行,每行前至少有一个空格
    或水平制表符(obs-fold)。本规范弃用此类
    除了在 message/http 媒体类型中的行折叠

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

    【讨论】:

    • 即使 nginx 允许您创建多行标题,系统的其他一些组件(在我的例子中是公司代理)可能无法正确处理它们。这可能会导致难以调试的问题,因此我建议将它们放在一行中,即使它很难阅读。
    • 在 nginx 1.17 中准确地观察到了这个问题:对于 Content-Security-Policy,我们之前有很大的部分被分成了多行。我们开始在此标头中观察到奇怪的 url,例如“https //abc.com”,因此解决方案是只创建一个长行。
    • 这真的很糟糕。如果 CSP 是一条大行,那么阅读差异和审核 CSP 都更加困难。
    猜你喜欢
    • 2019-03-26
    • 1970-01-01
    • 1970-01-01
    • 2012-04-17
    • 2020-10-23
    • 1970-01-01
    • 1970-01-01
    • 2015-10-29
    • 2018-03-10
    相关资源
    最近更新 更多