Bagaimana Anda mengubah header server yang dikembalikan oleh nginx?

141

Ada opsi untuk menyembunyikan versi sehingga hanya akan menampilkan nginx, tetapi apakah ada cara untuk menyembunyikannya juga sehingga tidak akan menampilkan apa pun atau mengubah header?

daniels
sumber
34
btw, untuk menyembunyikan versi nginx, Anda perlu mengatur 'server_tokens off'.
yanchenko
2
Jika Anda ingin menghapus nginx dari header, Anda mungkin juga ingin menghapusnya dari pengalihan dan halaman kesalahan.
fabianegli

Jawaban:

57

Seperti Apache, ini adalah edit cepat ke sumber dan kompilasi ulang. Dari Calomel.org :

String Server: adalah header yang dikirim kembali ke klien untuk memberi tahu mereka apa jenis server http yang Anda jalankan dan mungkin versi apa. String ini digunakan oleh tempat-tempat seperti Alexia dan Netcraft untuk mengumpulkan statistik tentang berapa banyak dan jenis server web apa yang hidup di Internet. Untuk mendukung penulis dan statistik untuk Nginx kami sarankan menjaga string ini apa adanya. Tetapi, untuk keamanan Anda mungkin tidak ingin orang tahu apa yang Anda jalankan dan Anda dapat mengubahnya dalam kode sumber. Edit file sumber src/http/ngx_http_header_filter_module.c saat melihat baris 48 dan 49. Anda dapat mengubah String ke apa pun yang Anda inginkan.

## 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;

Sunting Maret 2011: Alat Peraga ke Flavius ​​di bawah ini untuk menunjukkan opsi baru, menggantikan standar HttpHeadersModule Nginx dengan HttpHeadersMoreModule yang bercabang dua . Mengkompilasi ulang modul standar masih merupakan perbaikan cepat, dan masuk akal jika Anda ingin menggunakan modul standar dan tidak akan sering mengubah string server. Tetapi jika Anda menginginkan lebih dari itu, HttpHeadersMoreModule adalah proyek yang kuat dan memungkinkan Anda melakukan segala macam sihir hitam runtime dengan header HTTP Anda.

joelhardi
sumber
18
menggunakan 'server_token off;' sejauh ini adalah cara termudah untuk melakukannya ... pastikan untuk meletakkannya di blok "http" atau "server"
farinspace
35
Itu menyembunyikan nomor versi, tetapi pertanyaannya adalah "Saya tahu saya bisa menyembunyikan nomor versi, bagaimana cara mengubah atau menghapus seluruh string 'Server'?" Tidak ada cara untuk melakukannya menggunakan nginx out-of-the-box.
joelhardi
Perbaikan cepat lainnya (untuk versi 1.7.8) untuk sepenuhnya menghapus header server adalah: beri komentar pada baris 49 dan 50 (sesuai dengan baris 48, 49 di atas), 280-283 dan 458-469. Untuk referensi di masa mendatang: dua yang terakhir keduanya adalah jika-blok yang ditetapkan r->headers_out.server.
pauluss86
3
Jawaban ini sedikit tapi sudah tua sekarang. Jawaban @jamescampbell lebih akurat sekarang.
jmcollin92
Jika Anda berencana untuk menggunakan metode ini untuk menutupi server Anda, Anda mungkin juga ingin mengedit file src / http / ngx_http_special_response.c untuk mengubah pesan kesalahan server.
Brogan
143

Jika Anda menggunakan nginx untuk membuat proksi aplikasi back-end dan ingin back-end mengiklankan Server:tajuknya sendiri tanpa menimpa nginx, maka Anda dapat masuk ke dalam server {…}bait Anda dan mengatur:

proxy_pass_header Server;

Itu akan meyakinkan nginx untuk membiarkan header itu sendiri dan tidak menulis ulang nilai yang ditentukan oleh back-end.

Brandon Rhodes
sumber
11
Jika Anda melakukan perubahan ini karena alasan keamanan, saya tidak yakin ini cukup. Jika server Anda perlu mengembalikan pesan kesalahan, tajuk masih akan menjadi 'nginx'
KC Baltz
10
meskipun ini menyelesaikan masalah dengan mudah, namun ada satu hal yang harus diperhitungkan: ketika menggunakan reverse proxy, file statis dilayani melalui nginx, jadi ketika Anda membuka mis. gambar di panel jaring pembatas Anda masih dapat melihat server sebagai nginx
dav
IMO, ini jawaban terbaik. Solusi ini tidak memerlukan ekstensi perangkat lunak khusus, dan berfungsi dengan basis nginx.
Kris
81

Pembaruan terakhir beberapa waktu yang lalu, jadi inilah yang bekerja untuk saya di Ubuntu:

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

Kemudian tambahkan dua baris berikut ke httpbagian nginx.conf, yang biasanya terletak di /etc/nginx/nginx.conf:

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

Juga, jangan lupa untuk me-restart nginx dengan sudo service nginx restart.

jamescampbell
sumber
2
Apakah ada yang serupa pada YUM? yum instal nginx-ekstra tidak berfungsi.
PKHunter
3
@PKHunter Saya belum mencobanya di lidah iblis YUM tapi saya akan lihat apa yang bisa saya temukan.
jamescampbell
2
Ini tentu jawaban terbaik. Itu harus diterima. Ini hanya satu yang menjawab semua kasus.
jmcollin92
6
Mengatur string kosong ke Server: akan menekan header server:more_set_headers 'Server: ';
Cody Craven
1
Terima kasih ini bekerja seperti jimat tanpa kompilasi apapun. Bagus;)
MitchellK
37

Sederhana, edit /etc/nginx/nginx.conf dan hapus komentar dari

#server_tokens off;

Cari bagian http .

Rui Marques
sumber
3
ini berfungsi dengan baik, setelah Anda melakukan ini semua Anda dapat melihat tentang server pada info header adalah: nginx (tidak ada nomor versi) Terima kasih! : D
jacktrade
13
Penulis pertanyaan sudah mengetahui opsi ini, yang menghapus nomor versi, tetapi tidak memungkinkan Anda untuk menyesuaikan nilai yang dikembalikan di header "server".
Makotosan
12
Ini tidak menyembunyikan segalanya, tetapi hanya versi server.
Situs digital
3
Tidak menghapus header respons untuk Server = nginx
sasha
Saya pikir melewati versi nginx adalah masalah keamanan. Jadi bagi banyak orang, ini adalah solusi "cukup baik". Juga perlu dicatat bahwa ini harus masuk ke setiap blok server, jika Anda memiliki blok server untuk port 80 dan 443.
Jeremy
35

Ini sangat sederhana: Tambahkan baris ini ke bagian server:

server_tokens off;
more_set_headers 'Server: My Very Own Server';
Farsheed
sumber
10
Anda harus mengkompilasi nginx dengan modul pihak ke-3 wiki.nginx.org/HttpHeadersMoreModule untuk itu
hostmaster
10
Di Ubuntu Anda dapat menginstal nginx-extrauntuk mendapatkan modul itu.
Stan Bondi
11
jika kita percaya apt-get autoexpansion, itu nginx-ekstra dengan huruf "s" di akhir
Tjunkie
1
Catatan, Anda memerlukan awalan "Server:" untuk mengganti nilai Server: yang ada.
elBradford
25

Ada modul khusus: http://wiki.nginx.org/NginxHttpHeadersMoreModule

Modul ini memungkinkan Anda untuk menambah, mengatur, atau menghapus output atau header input apa pun yang Anda tentukan.

Ini adalah versi yang disempurnakan dari standar header modul karena memberikan lebih banyak utilitas seperti ulang atau kliring "builtin header" seperti Content-Type, Content-Length, dan Server.

Hal ini juga memungkinkan Anda untuk menentukan kriteria kode status HTTP opsional menggunakan -sopsi dan kriteria jenis konten opsional menggunakan -topsi sementara memodifikasi header output dengan more_set_headers dan more_clear_headers arahan ...

Flavius
sumber
3
Kompilasi nginx dengan--add-module=/path-to-headers-more-nginx-module
mate64
Sepertinya ini telah dipindahkan ke OpenResty: github.com/openresty/headers-more-nginx-module#readme
Ben Creasy
Apakah ada cara untuk mendapatkan modul ini tanpa harus mengkompilasi ulang nginx dari sumber untuk Centos 7?
Prachi
19

Instal Nginx Extras

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

Detail server dapat dihapus dari respons dengan menambahkan dua baris berikut di nginx.conf (di bawah bagian http)

more_clear_headers Server;
server_tokens off;
Aamish Baloch
sumber
Satu, inilah yang disebutkan @jamescampbell di atas. Kedua, ini membutuhkan Nginx untuk dikompilasi dari sumber ( yum install nginx-extrastidak berfungsi - saya kira ini bekerja pada Debia / Ubuntu dll dengan apt-get.)
Khom Nazid
Ia bekerja tanpa nginx dikompilasi dari sumber. Anda hanya perlu memuat modul: ngx_http_headers_more_filter_module dari nginx.conf
creekorful
setelah menjalankan "apt-get install nginx-extras", ia menurunkan versi nginx saya dari 1,16 menjadi 1,14
grayaii
15

Jika Anda setuju dengan hanya mengubah tajuk ke string lain lima huruf atau kurang, Anda bisa menambal binernya.

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

Yang, sebagai solusi, memiliki beberapa keunggulan penting. Yaitu, bahwa Anda dapat mengizinkan versi nginx Anda ditangani oleh manajer paket (jadi, tidak ada kompilasi dari sumber) bahkan jika nginx-ekstra tidak tersedia untuk distro Anda, dan Anda tidak perlu khawatir tentang tambahan apa pun kode sesuatu seperti nginx-ekstra menjadi rentan.

Tentu saja, Anda juga ingin mengatur opsi server_tokens off, untuk menyembunyikan nomor versi, atau menambal string format itu juga.

Saya mengatakan "lima huruf atau kurang" karena tentu saja Anda selalu dapat mengganti:

nginx \ r \ 0

dengan

bob \ r \ 0 \ r \ 0

meninggalkan dua byte terakhir tidak berubah.

Jika Anda benar-benar ingin lebih dari lima karakter, Anda ingin membiarkan server_token aktif, dan mengganti string format (sedikit lebih lama), meskipun sekali lagi ada batas atas pada panjang yang dikenakan oleh panjang string format - 1 (untuk Kereta kembali).

... Jika tidak ada satu pun di atas yang masuk akal bagi Anda, atau Anda belum pernah menambal biner sebelumnya, Anda mungkin ingin menjauh dari pendekatan ini.

Tembakan Parthian
sumber
1
@PKHunter hm? Keuntungannya adalah ini berfungsi tanpa harus dikompilasi dari awal. Tidak ada kode sumber yang terlibat. Ini menambal biner yang dikompilasi secara langsung.
Parthian Shot
1
Itu sama sekali tidak menyadari format file - itu hanya mengganti urutan byte dengan urutan byte yang berbeda - jadi itu selalu bermanfaat untuk benar-benar memverifikasi bahwa urutan byte yang Anda ganti sebenarnya hanyalah string yang ingin Anda ganti dan tidak , katakanlah, kode yang dapat dieksekusi dalam subrutin (yang sangat tidak mungkin, tapi tetap saja).
Parthian Shot
1
Jadi, Anda hanya menjalankan sedperintah di atas, `which nginx`bagian mengembalikan path ke biner, dan sedperintah melakukan penggantian byte.
Parthian Shot
1
Bita nol yang disebutkan kemudian dalam jawaban merujuk pada fakta bahwa Anda dapat menggunakan tajuk yang lebih pendek daripada panjang keseluruhan tali selama Anda mengakhiri penggantian dengan bita nol. en.wikipedia.org/wiki/Null-terminated_string
Parthian Shot
1
Ah. Ya, itu adalah executable. Dan Anda juga harus menjadi pengguna dengan izin menulis ke file. Dan saya tidak akan terkejut jika Anda perlu me nginx- restart agar perubahan diterapkan. Semua itu dikatakan? Saya mendorong Anda untuk tidak menggunakan salah satu jawaban lainnya. Jika semua hal yang saya katakan belum Anda kenal, dan Anda tidak tahu untuk apa /etcdirektori tersebut, maka peretasan seperti ini agak berbahaya.
Parthian Shot
2

Satu-satunya cara adalah memodifikasi file src / http / ngx_http_header_filter_module.c. Saya mengubah nginx pada baris 48 ke string yang berbeda.

Apa yang dapat Anda lakukan dalam file konfigurasi nginx adalah untuk menonaktifkan server_tokens . Ini akan mencegah nginx mencetak nomor versi.

Untuk memeriksanya, coba curl -I http://vurbu.com/ | grep Server

Itu harus kembali

Server: Hai
Jauder Ho
sumber
3
Ya, itu bukan satu-satunya cara. Alternatif lain telah ditunjukkan dalam tanggapan lain.
Radko Dinev
1

Setelah saya membaca jawaban Parthian Shot, saya menggali /usr/sbin/nginxfile biner. Kemudian saya menemukan bahwa file tersebut mengandung tiga baris ini.

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

Pada dasarnya dua yang pertama dimaksudkan untuk server_tokens on;direktif (termasuk versi Server). Lalu saya mengubah kriteria pencarian untuk mencocokkan baris-baris itu dalam file biner.

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

Setelah saya menggali lebih jauh saya menemukan bahwa pesan kesalahan yang dihasilkan oleh nginx juga termasuk dalam file ini.

<hr><center>nginx</center>

Ada tiga dari mereka, satu tanpa versi, dua di antaranya termasuk versi. Jadi saya menjalankan perintah berikut untuk mengganti string nginx dalam pesan kesalahan.

sed -i 's/center>nginx/center>thing/' `which nginx`
Afrig Aminuddin
sumber
Terima kasih untuk ini. Tetapi perintah pertama yang dieksekusi di dalam /usr/sbinfolder menghasilkan ini:sed: can't read is: No such file or directory
Khom Nazid
1

Menurut dokumentasi nginx itu mendukung nilai-nilai khusus atau bahkan pengecualian:

Syntax: server_tokens on | off | build | string;

tetapi sayangnya hanya dengan berlangganan komersial :

Selain itu, sebagai bagian dari langganan komersial kami, mulai dari versi 1.9.13 tanda tangan pada halaman kesalahan dan nilai header respons "Server" dapat diatur secara eksplisit menggunakan string dengan variabel. String kosong menonaktifkan emisi bidang "Server".

adrhc
sumber
0

Saya tahu posting ini agak lama, tetapi saya telah menemukan solusi mudah yang bekerja pada distribusi berbasis Debian tanpa mengkompilasi nginx dari sumber.

Pertama instal paket nginx-ekstra

sudo apt install nginx-extras

Kemudian muat modul http nginx http lebih banyak dengan mengedit nginx.conf dan menambahkan baris berikut di dalam blok server

memuat modul modul / ngx_http_headers_more_filter_module.so;

Setelah selesai, Anda akan memiliki akses ke arahan more_set_headers dan more_clear_headers.

creekorful
sumber
0

Paket nginx-ekstra sudah ditinggalkan sekarang.

Oleh karena itu berikut ini sekarang bekerja untuk saya ketika saya mencoba menginstal berbagai paket Server more_set_headers: My Very Own Server ';

Anda dapat melakukan hal berikut dan tidak ada informasi server atau versi yang akan dikirim kembali

    server_tokens '';

jika Anda hanya ingin menghapus nomor versi ini berfungsi

   server_tokens off;
Prajwal
sumber
-4

Apakah Anda bertanya tentang nilai header Server dalam respons? Anda dapat mencoba mengubahnya dengan arahan add_header, tetapi saya tidak yakin apakah itu akan berhasil. http://wiki.codemongers.com/NginxHttpHeadersModule

Vasil
sumber
1
ya, header server. tapi bukankah ada cara yang lebih bersih seperti pada lighttpd misalnya di mana saya hanya memiliki server.tag = "apa pun"? add_header hanya berfungsi untuk kode respons 200, 204, 301, 302 atau 304, jadi jika server entah bagaimana akan melakukan 500 itu tidak akan berfungsi
daniels