debian nginx 1.10.3 防止标头注入

debian nginx 1.10.3 防止标头注入

我有一个运行 nginx 1.10.3 的 debian 8 VPS。

我托管了几个 Symfony 3.2 网站(使用 php7-fpm),并且遇到了标头注入问题。我不知道问题出在 nginx 还是 symfony 项目配置上。

我暂时没有使用任何 LoadBalancer,例如 Varnish 或 Amazon AWS。

当有人使用无效的请求发送时,X-Forwared-Host例如:

X-Forwarded-Host: pg_sleep(2)

然后它收到一个500 Internal Server Error,我可以在日志中看到一个严重错误:

UnexpectedValueException: "Invalid Host "pg_sleep(2)" at [...]/var/bootstrap.php.cache"

我可以轻松地用 curl 重现它(仅限于生产环境中,使用这个 bootstrap.php.cache 文件):

curl -I\
 -H "X-Forwarded-Host: pg_sleep(2)"\
 "https://my-domain.tld"

我得到的其他一些值可以是X-Forwarded-Host: *.domain.tld,,等等X-Forwarded-Host: -1 or 2+429-429-1=0+0+0+1 --X-Forwarded-Host: -1; waitfor delay '0:0:14' --

我看起来像是一次注射攻击。

我的目标是处理此类无效标头并返回例如 444 状态,或者至少阻止应用程序触发500 Internal Server Error

我的第一个问题是:我是否应该尝试在 nginx 配置中拦截这些无效的标头(使用模块?)或者它是否应该由 symfony 项目来处理?

我已阅读本指南: http://symfony.com/doc/current/components/http_foundation/trusting_proxies.html

您还应确保您的代理过滤这些标头的未经授权的使用,例如,如果代理本机使用 X-Forwarded-For 标头,则它不应允许客户端将转发标头发送到 Symfony。

这让我认为这应该由 nginx 来处理,那么......怎么办?

我试图检查我的服务器{}块内的主机,但它没有拦截它......

server {
    listen 443;

    # [...]

    if ($host !~ ^(my-domain.tld)$ ) {
        return 444;
    }

    # [...]
}

我看起来可以使用该headers_more模块,但这是最佳做法吗?

https://www.nginx.com/resources/wiki/modules/headers_more/

相关内容