我有一个运行 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
模块,但这是最佳做法吗?