Come si modifica l'intestazione del server restituita da nginx?


141

C'è un'opzione per nascondere la versione in modo che visualizzi solo nginx, ma c'è un modo per nasconderlo anche così non mostrerà nulla o cambierà l'intestazione?


34
tra l'altro, per nascondere la versione di nginx devi impostare 'server_tokens off'.
yanchenko,

2
Se ti interessa rimuovere nginx dall'intestazione, potresti anche rimuoverlo dai reindirizzamenti e dalle pagine di errore.
fabianegli,

Risposte:


57

Come Apache, questa è una modifica rapida al sorgente e ricompila. Da Calomel.org :

Il server: stringa è l'intestazione che viene rimandata al client per dire loro che tipo di server http si sta eseguendo e possibilmente quale versione. Questa stringa viene utilizzata da luoghi come Alexia e Netcraft per raccogliere statistiche su quanti e su quale tipo di server Web sono attivi su Internet. Per supportare l'autore e le statistiche di Nginx consigliamo di mantenere questa stringa così com'è. Ma, per motivi di sicurezza, potresti non voler che le persone sappiano cosa stai eseguendo e puoi modificarlo nel codice sorgente. Modifica il file sorgente src/http/ngx_http_header_filter_module.c guardando le righe 48 e 49. Puoi cambiare la stringa in qualsiasi cosa tu voglia.

## vi src/http/ngx_http_header_filter_module.c (lines 48 and 49)
static char ngx_http_server_string[] = "Server: MyDomain.com" CRLF;
static char ngx_http_server_full_string[] = "Server: MyDomain.com" CRLF;

Marzo 2011: Modifica Props a Flavio sotto per indicare una nuova opzione, in sostituzione di serie di Nginx HttpHeadersModule con la forcella HttpHeadersMoreModule . La ricompilazione del modulo standard è ancora la soluzione rapida e ha senso se si desidera utilizzare il modulo standard e non cambierà spesso la stringa del server. Ma se vuoi di più, HttpHeadersMoreModule è un progetto forte e ti consente di fare ogni sorta di magia nera di runtime con le tue intestazioni HTTP.


18
usando 'server_tokens off;' è di gran lunga il modo più semplice per farlo ... assicurati di inserirlo in un blocco "http" o "server"
farinspace

35
Ciò nasconde il numero di versione, ma la domanda era "So di poter nascondere il numero di versione, come posso modificare o eliminare l'intera stringa" Server "?" Non c'è modo di farlo usando nginx out-of-the-box.
Joelhardi,

Un'altra soluzione rapida (per la versione 1.7.8) per rimuovere completamente l'intestazione del server è: commentare le righe 49 e 50 (corrispondenti alle righe 48, 49 sopra), 280-283 e 458-469. Per riferimento futuro: gli ultimi due sono entrambi if-block impostati r->headers_out.server.
pauluss86

3
Questa risposta è un po 'vecchia ma ormai. La risposta di @jamescampbell è ora più precisa.
jmcollin92,

Se prevedi di utilizzare questo metodo per mascherare il tuo server, potresti anche voler modificare il file src / http / ngx_http_special_response.c per cambiare i messaggi di errore del server.
Brogan

143

Se si utilizza nginx per eseguire il proxy di un'applicazione back-end e si desidera che il back-end pubblicizzi la propria Server:intestazione senza che nginx lo sovrascriva, è possibile server {…}accedere alla stanza e impostare:

proxy_pass_header Server;

Ciò convincerà nginx a lasciare da sola quell'intestazione e non riscrivere il valore impostato dal back-end.


11
Se stai apportando questa modifica per motivi di sicurezza, non sono sicuro che sia abbastanza. Se il tuo server deve restituire un messaggio di errore, l'intestazione sarà comunque "nginx"
KC Baltz

10
sebbene ciò risolva facilmente il problema, tuttavia c'è una cosa da tenere in considerazione: quando si utilizza un proxy inverso i file statici vengono serviti tramite nginx, quindi quando si apre ad esempio l'immagine nel pannello di rete firebug è ancora possibile vedere il server come nginx
dav

IMO, questa è la risposta migliore. Questa soluzione non richiede alcuna estensione software speciale e funziona con nginx di base.
Kris

81

L'ultimo aggiornamento è stato qualche tempo fa, quindi ecco cosa ha funzionato per me su Ubuntu:

sudo apt-get update
sudo apt-get install nginx-extras

Quindi aggiungi le seguenti due righe alla httpsezione di nginx.conf, che di solito si trova in /etc/nginx/nginx.conf:

sudo nano /etc/nginx/nginx.conf
server_tokens off; # removed pound sign
more_set_headers 'Server: Eff_You_Script_Kiddies!';

Inoltre, non dimenticare di riavviare nginx con sudo service nginx restart.


2
C'è qualcosa di simile su YUM? yum install nginx-extra non ha funzionato.
PKHunter,

3
@PKHunter Non l'ho provato nella lingua del diavolo di YUM ma vedrò cosa riesco a trovare.
Jamescampbell,

2
Questa è sicuramente la risposta migliore. Dovrebbe essere accettato. Questo è solo uno che risponde a tutti i casi.
jmcollin92,

6
Impostazione di una stringa vuota su Server: sopprimerà l'intestazione del server:more_set_headers 'Server: ';
Cody Craven

1
Grazie, questo funziona come un incantesimo senza alcuna ricompilazione di alcun tipo. Ben fatto;)
MitchellK il

37

Semplice, modifica /etc/nginx/nginx.conf e rimuovi il commento da

#server_tokens off;

Cerca la sezione http .


3
funziona benissimo, una volta fatto tutto ciò che puoi vedere sul server nelle informazioni sulle intestazioni è: nginx (nessun numero di versione) Grazie! : D
jacktrade,

13
L'autore della domanda è già a conoscenza di questa opzione, che rimuove il numero di versione, ma non consente di personalizzare il valore restituito nell'intestazione "server".
Makotosan,

12
Questo non nasconde tutto, ma solo la versione del server.
Sito digitale

3
Non rimuove l'intestazione della risposta per Server = nginx
sasha,

Penso che passare la versione di nginx sia un problema di sicurezza. Quindi, per molte persone, questa è una soluzione "abbastanza buona". Vale anche la pena notare che questo dovrà andare in ogni blocco server, nel caso in cui tu abbia un blocco server per la porta 80 e 443.
Jeremy

35

È molto semplice: aggiungi queste righe alla sezione server:

server_tokens off;
more_set_headers 'Server: My Very Own Server';

10
Devi compilare nginx con il modulo di terze parti wiki.nginx.org/HttpHeadersMoreModule per questo
hostmaster

10
Su Ubuntu è possibile installare nginx-extraper ottenere quel modulo.
Stan Bondi,

11
se dobbiamo credere a apt-get autoexpansion, sono nginx-extra con una "s" alla fine
Tjunkie,

1
Nota, è necessario il prefisso "Server:" per sovrascrivere il valore Server: esistente.
elBradford,

25

C'è un modulo speciale: http://wiki.nginx.org/NginxHttpHeadersMoreModule

Questo modulo consente di aggiungere, impostare o cancellare qualsiasi intestazione di output o input specificata.

Questa è una versione migliorata del modulo delle intestazioni standard perché fornisce più utilità come il ripristino o la cancellazione di "intestazioni incorporate" comeContent-Type , Content-Lengthe Server.

Inoltre, consente di specificare criteri di codice di stato HTTP facoltativi utilizzando l' -sopzione e criteri di tipo di contenuto facoltativi utilizzando l' -topzione durante la modifica delle intestazioni di output con le direttive more_set_headers e more_clear_headers ...


3
Compilare nginx con--add-module=/path-to-headers-more-nginx-module
mate64

Sembra che questo sia stato spostato su OpenResty: github.com/openresty/headers-more-nginx-module#readme
Ben Creasy,

Esiste un modo per ottenere questo modulo senza dover ricompilare nginx dal sorgente per Centos 7?
Prachi,

19

Installa Nginx Extras

sudo apt-get update
sudo apt-get install nginx-extras

I dettagli del server possono essere rimossi dalla risposta aggiungendo le seguenti due righe in nginx.conf (nella sezione http)

more_clear_headers Server;
server_tokens off;

Uno, questo è ciò che @jamescampbell menzionato sopra. Secondo, questo richiede che Nginx sia compilato dalla fonte ( yum install nginx-extrasnon funziona - suppongo che funzioni su Debia / Ubuntu ecc. Con apt-get.)
Khom Nazid,

Funziona senza avere nginx compilato dal sorgente. Devi solo caricare il modulo: ngx_http_headers_more_filter_module da nginx.conf
creekorful

dopo aver eseguito "apt-get install nginx-extra", ha eseguito il downgrade della versione del mio nginx
dall'1.16 all'1.14

15

Se stai bene cambiando l'intestazione con un'altra stringa di cinque lettere o meno, puoi semplicemente patchare il binario.

sed -i 's/nginx\r/thing\r/' `which nginx`

Che, come soluzione, presenta alcuni notevoli vantaggi. Vale a dire, che puoi consentire al gestore dei pacchetti di gestire il tuo versioning nginx (quindi, nessuna compilazione dal sorgente) anche se nginx-extra non è disponibile per la tua distribuzione e non devi preoccuparti di nessuno dei il codice di qualcosa come nginx-extra è vulnerabile.

Ovviamente, vorrai anche impostare l'opzione server_tokens off, per nascondere il numero di versione o applicare una patch anche a quella stringa di formato.

Dico "cinque lettere o meno" perché ovviamente puoi sempre sostituire:

nginx \ r \ 0

con

bob \ r \ 0 \ r \ 0

lasciando invariati gli ultimi due byte.

Se in realtà vuoi più di cinque caratteri, ti consigliamo di lasciare i token_server attivi e sostituire la stringa di formato (leggermente più lunga), anche se c'è ancora un limite superiore su quella lunghezza imposta dalla lunghezza della stringa di formato - 1 (per il ritorno a capo).

... Se nessuna delle precedenti ha senso per te, o non hai mai patchato un binario prima, potresti voler stare lontano da questo approccio.


1
@PKHunter hm? Il vantaggio di questo è che funziona senza dover compilare da zero. Nessun codice sorgente coinvolto. Corregge direttamente il file binario compilato .
Parthian Shot

1
Non è affatto a conoscenza del formato del file, sta semplicemente sostituendo una sequenza di byte con una diversa sequenza di byte, quindi vale sempre la pena verificare che la sequenza di byte che stai sostituendo sia proprio la stringa che vuoi sostituire e non , diciamo, codice eseguibile in una subroutine (che è abbastanza improbabile, ma comunque).
Colpo di Parthian del

1
Quindi avresti semplicemente eseguito quel sedcomando sopra, la `which nginx`parte restituisce il percorso al binario e il sedcomando esegue la sostituzione del byte.
Parthian Shot

1
I byte null menzionati più avanti nella risposta si riferiscono al fatto che è possibile utilizzare intestazioni più brevi dell'intera lunghezza della stringa purché si termini la sostituzione con un byte null. it.wikipedia.org/wiki/Null-terminated_string
Parthian Shot

1
Ah. Sì, è l'eseguibile. E dovresti anche essere un utente con permesso di scrittura per il file. E non sarei sorpreso se fosse necessario riavviare nginxper rendere effettive le modifiche. Detto questo? Vi esorto a non usare una delle altre risposte. Se tutte le cose che sto dicendo non ti sono già familiari e non sai a cosa /etcserve la directory, allora un hack come questo è pericoloso.
Parthian Shot

2

L'unico modo è modificare il file src / http / ngx_http_header_filter_module.c. Ho cambiato nginx sulla riga 48 con una stringa diversa.

Quello che puoi fare nel file di configurazione di nginx è impostare server_tokens . Ciò impedirà a nginx di stampare il numero di versione.

Per controllare le cose, prova a arricciare -I http://vurbu.com/ | Server grep

Dovrebbe tornare

Server: Hai

3
Bene, non è l'unico modo. Altre alternative sono state mostrate in altre risposte.
Radko Dinev,

1

Dopo aver letto la risposta di Parthian Shot, scavo in un /usr/sbin/nginxfile binario. Poi ho scoperto che il file contiene queste tre righe.

Server: nginx/1.12.2
Server: nginx/1.12.2
Server: nginx

Fondamentalmente i primi due sono pensati per server_tokens on;direttiva (versione server inclusa). Quindi cambio i criteri di ricerca per abbinare quelle righe all'interno del file binario.

sed -i 's/Server: nginx/Server: thing/' `which nginx`

Dopo aver scavato più in là ho scoperto che anche il messaggio di errore prodotto da nginx è incluso in questo file.

<hr><center>nginx</center>

Ce ne sono tre, uno senza versione, due inclusi la versione. Quindi eseguo il seguente comando per sostituire la stringa nginx all'interno del messaggio di errore.

sed -i 's/center>nginx/center>thing/' `which nginx`

Grazie per questo. Ma il tuo primo comando eseguito all'interno della /usr/sbincartella produce questo:sed: can't read is: No such file or directory
Khom Nazid

1

Secondo la documentazione nginx supporta valori personalizzati o anche l'esclusione:

Syntax: server_tokens on | off | build | string;

ma purtroppo solo con un abbonamento commerciale :

Inoltre, nell'ambito della nostra sottoscrizione commerciale, a partire dalla versione 1.9.13 la firma nelle pagine di errore e il valore del campo dell'intestazione della risposta "Server" possono essere impostati esplicitamente utilizzando la stringa con variabili. Una stringa vuota disabilita l'emissione del campo "Server".


0

So che il post è piuttosto vecchio, ma ho trovato una soluzione facile che funziona sulla distribuzione basata su Debian senza compilare nginx dal sorgente.

Prima installa il pacchetto nginx-extra

sudo apt installa nginx-extra

Quindi caricare il modulo più intestazioni http nginx modificando nginx.conf e aggiungendo la seguente riga all'interno del blocco server

load_module modules / ngx_http_headers_more_filter_module.so;

Al termine, avrai accesso sia alle direttive more_set_headers che a more_clear_headers.


0

Il pacchetto Nginx-extra è ora obsoleto.

Quindi ora ho funzionato per me mentre provavo a installare vari pacchetti more_set_headers 'Server: My Very Own Server';

Puoi semplicemente fare quanto segue e nessuna informazione sul server o sulla versione verrà rispedita

    server_tokens '';

se vuoi solo rimuovere il numero di versione funziona

   server_tokens off;

-4

Stai chiedendo del valore dell'intestazione del server nella risposta? Puoi provare a cambiarlo con una direttiva add_header, ma non sono sicuro che funzionerà. http://wiki.codemongers.com/NginxHttpHeadersModule


1
sì, l'intestazione del server. ma non c'è un modo più pulito come su lighttpd per esempio dove ho solo server.tag = "qualunque cosa"? l'add_header funziona solo con i codici di risposta 200, 204, 301, 302 o 304, quindi se il server in qualche modo farà un 500 non funzionerà
Daniel
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.