原文地址: https://github.com/yandex/gixy

概要

Gixy是一个分析Nginx配置的工具。Gixy的主要目标是防止安全性错误配置并自动进行缺陷检测。
目前支持的Python版本为2.7和3.5+。

免责声明:Gixy仅在GNU/Linux上经过良好测试,其他操作系统可能存在一些问题。

目前在Gixy可以找到以下问题:

[add_header_multiline]多行响应头

您应该避免使用多行响应头,原因如下:

  • 它们已被弃用(参见RFC 7230
  • 一些HTTP客户端和浏览器从不支持它们(例如 IE/Edge/Nginx)。

如何发现

配置错误的示例:

# http://nginx.org/en/docs/http/ngx_http_headers_module.html#add_header
add_header Content-Security-Policy "
default-src: 'none';
script-src data: https://yastatic.net;
style-src data: https://yastatic.net;
img-src data: https://yastatic.net;
font-src data: https://yastatic.net;";
# https://www.nginx.com/resources/wiki/modules/headers_more/
more_set_headers -t 'text/html text/plain'
'X-Foo: Bar multiline';

如何解决

唯一的解决方案是永远不要使用多行响应头。

[add_header_redefinition]通过add_header指令重新定义响应头

不幸的是,许多人不知道指令的继承是如何工作的。大多数情况下,这会导致add_header在尝试在嵌套级别添加新响应头时滥用指令。Nginx 文档中提到了此功能:

There could be several add_header directives. These directives are inherited from the previous level if and only if there are no add_header directives defined on the current level.

逻辑非常简单:如果您在一个级别(例如,在server部分)设置了响应头,然后在较低的级别location(比方说)中设置了其他的响应头,那么第一个响应头将被丢弃。
这很容易检查:

  • 配置:
    server {
    listen 80;
    add_header X-Frame-Options "DENY" always;
    location / {
    return 200 "index";
    }
    location /new-headers {
    # Add special cache control
    add_header Cache-Control "no-cache, no-store, max-age=0, must-revalidate"
    always;
    add_header Pragma "no-cache" always;
    return 200 "new-headers";
    }
    }
  • 请求location /X-Frame-Options消息头在服务器响应中):
    GET / HTTP/1.0
    HTTP/1.1 200 OK
    Server: nginx/1.10.2
    Date: Mon, 09 Jan 2017 19:28:33 GMT
    Content-Type: application/octet-stream
    Content-Length: 5
    Connection: close
    X-Frame-Options: DENY
    index
    
  • 请求location /new-headers(请求头中有Cache-ControlPragma,但没有X-Frame-Options
    GET /new-headers HTTP/1.0
    HTTP/1.1 200 OK
    Server: nginx/1.10.2
    Date: Mon, 09 Jan 2017 19:29:46 GMT
    Content-Type: application/octet-stream
    Content-Length: 11
    Connection: close
    Cache-Control: no-cache, no-store, max-age=0, must-revalidate
    Pragma: no-cache
    new-headers
    

如何解决

点击收藏 | 0 关注 | 1
  • 动动手指,沙发就是你的了!
登录 后跟帖