建站系列之隐藏 Nginx/Apahe/PHP 响应的 Server/X-Powered-By 等软件版本信息

小助手读文章 00:00 / 00:00

默认情况下,不管是 Apache 还是 Nginx,亦或是 Tengine 等 WEB 服务器软件,在访客请求数据时都会返回服务器软件、版本等信息。虽然在一定程度上方便维护,但是安全性上却大打折扣,比如说某个版本的 Nginx 曝出有 BUG,当恶意访客发现服务器的 Nginx 恰好是这个版本,就很有可能针对性发起攻击。这样一来我们就会想办法隐藏服务器回复的信息,降低安全风险。

先来看下 Nginx + PHP 默认情况下回复的请求标头:

# curl -I https://vircloud.net/
HTTP/1.1 200 OK
Date: Wed, 22 Aug 2018 11:50:01 GMT
Content-Length: 0
Connection: keep-alive
Server: Tengine/1.1
X-Powered-By: PHP/7.1.1

X-Powered-By

X-Powered-By 字段是由 PHP 程序回复的,因此要修改 php.ini,修改 expose_php = On 为 Off:

expose_php = Off

重启下再看看请求标头:

# curl -I https://vircloud.net/
HTTP/1.1 200 OK
Date: Wed, 22 Aug 2018 11:52:01 GMT
Content-Length: 0
Connection: keep-alive
Server: Tengine/1.1

可以看到 X-Powered-By 已经隐藏了。

Server

Server 字段是由 Apache/Nginx/Tengine 等程序回复,并且有两个地方可以看到,一个是在请求标头,一个是在错误页面。

请求标头与 PHP 一样可以配置关闭:

Apache

修改 httpd.conf 配置 ,将 ServerSignature、ServerTokens 两个字段修改成与下面一致:

ServerSignature Off
ServerTokens Prod

Nginx

修改 nginx.conf 配置,将 server_tokens 设为 off:

server_tokens off;

重启程序后,我们再来看下请求:

# curl -I https://vircloud.net/
HTTP/1.1 200 OK
Date: Wed, 22 Aug 2018 11:52:01 GMT
Content-Length: 0
Connection: keep-alive
Server: Tengine

可以看到版本号已经隐藏了,但是程序名还在。

彻底隐藏或修改

程序名与错误页面底部提示,就需要通过修改源码实现了,没办法通过开关设置。

以 Nginx 为例,找到 src/http/ngx_http_header_filter_module.c

static char ngx_http_server_string[] = "Server: nginx" CRLF;
static char ngx_http_server_full_string[] = "Server: " NGINX_VER CRLF;

src/core/nginx.h:

#define NGINX_VER          "nginx/" NGINX_VERSION

以及 src/http/ngx_http_special_response.c

static u_char ngx_http_error_tail[] =
"<hr><center>nginx</center>" CRLF
"</body>" CRLF
"</html>" CRLF

如果启用 HTTP2,包括 src/http/v2/ngx_http_v2_filter_module.c

            ngx_log_debug0(NGX_LOG_DEBUG_HTTP, fc->log, 0,
                           "http2 output header: \"server: nginx\"");
        }

很明显可以看出,我们将其中的 nginx 改为自己想要设置的名称就可以达到隐藏的目的,比如改为 vircloud.net,则两个文件分别改为:

static char ngx_http_server_string[] = "Server: vircloud.net" CRLF;
static char ngx_http_server_full_string[] = "Server: vircloud.net" CRLF;

#define NGINX_VER          "vircloud.net/" NGINX_VERSION

以及

static u_char ngx_http_error_tail[] =
"<hr><center>vircloud.net</center>" CRLF
"</body>" CRLF
"</html>" CRLF

包括

            ngx_log_debug0(NGX_LOG_DEBUG_HTTP, fc->log, 0,
                           "http2 output header: \"server: vircloud.net\"");
        }

重新编译(只要 make 即可,不要 make install),然后替换编译后的可执行文件 nginx (如 cp src/objs/nginx sbin/nginx)启动后,我们再来请求看看:

# curl -I https://exanple.net/
HTTP/1.1 200 OK
Date: Wed, 22 Aug 2018 11:55:01 GMT
Content-Length: 0
Connection: keep-alive
Server: vircloud.net

查看错误页:

错误页

Server 中正确的程序名已经被调换成我们指定的混淆字段了。


参考文章:
1、《隐藏 nginx 服务器信息


ArmxMod for Typecho
个性化、自适应、功能强大的响应式主题

推广

 继续浏览关于 nginx教程建站apache隐藏响应信息 的文章

 本文最后更新于 2019/08/26 10:20:48,可能因经年累月而与现状有所差异

 引用转载请注明:VirCloud's Blog > 建站 > 建站系列之隐藏 Nginx/Apahe/PHP 响应的 Server/X-Powered-By 等软件版本信息