Як змінити заголовок сервера, повернутий nginx?


141

Існує можливість приховати версію, щоб вона відображала лише nginx, але чи є спосіб приховати це, щоб нічого не відображати чи змінювати заголовок?


34
btw, щоб приховати nginx версію, вам потрібно встановити "server_tokens off".
Янченко

2
Якщо ви хочете видалити nginx із заголовка, ви також можете видалити його із сторінок переспрямувань та помилок.
fabianegli

Відповіді:


57

Як і Apache, це швидке редагування джерела та перекомпіляція. З сайту Calomel.org :

Сервер: рядок - це заголовок, який надсилається клієнту назад, щоб повідомити, який тип http-сервера ви використовуєте та, можливо, яку версію. Цей рядок використовується в таких місцях, як Alexia та Netcraft для збору статистичних даних про те, скільки та який тип веб-сервера живуть в Інтернеті. Щоб підтримати автора та статистику для Nginx, радимо зберегти цю рядок такою, якою є. Але, для безпеки, можливо, ви не хочете, щоб люди знали, що ви працюєте, і ви можете змінити це у вихідному коді. Відредагуйте вихідний файл, src/http/ngx_http_header_filter_module.c перегляньте рядки 48 та 49. Ви можете змінити рядок на все, що завгодно.

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

Березень 2011 року редагуйте: Реквізити до Флавію нижче, щоб вказати на новий варіант, замінивши стандартний HginpHeadersModule Nginx на роздвоєний HttpHeadersMoreModule . Перекомпіляція стандартного модуля все ще є швидким виправленням, і має сенс, якщо ви хочете використовувати стандартний модуль і не будете часто змінювати рядок сервера. Але якщо ви хочете більше цього, HttpHeadersMoreModule - це сильний проект, який дозволяє робити всілякі чорні магії виконання під час заголовків HTTP.


18
використання 'server_tokens off;' це найпростіший спосіб зробити це ... переконайтеся, що потрібно помістити його в блок "http" або "сервер"
farinspace

35
Це приховує номер версії, але питання було "Я знаю, я можу приховати номер версії, як я можу змінити або видалити всю" рядок "Сервера?" Неможливо зробити це, використовуючи nginx, який не використовується в коробці.
joelhardi

Ще одним швидким виправленням (для версії 1.7.8) для повного видалення заголовка сервера є: прокоментуйте рядки 49 та 50 (відповідні рядки 48, 49 вище), 280-283 та 458-469. Для подальшої довідки: останні два - це встановлені обидва if-блоки r->headers_out.server.
pauluss86

3
Ця відповідь зараз невелика, але стара. Відповідь @jamescampbell зараз більш гостра.
jmcollin92

Якщо ви плануєте використовувати цей метод для маскування вашого сервера, ви також можете відредагувати файл src / http / ngx_http_special_response.c, щоб змінити повідомлення про помилки сервера.
Броган

143

Якщо ви використовуєте nginx для проксі-сервера додаткової програми та хочете, щоб бек-енд рекламував власну Server: заголовок, не перезаписуючи його, ви можете зайти всередину вашої server {…}строфи та встановити:

proxy_pass_header Server;

Це переконає nginx залишити цей заголовок у спокої і не переписати значення, встановлене бек-ендом.


11
Якщо ви вносите цю зміну з міркувань безпеки, я не впевнений, що цього достатньо. Якщо вашому серверу потрібно повернути повідомлення про помилку, заголовок все ще буде "nginx"
KC Baltz

10
хоча це вирішує проблему легко, однак слід враховувати одне: при використанні зворотного проксі статичні файли подаються через nginx, тому, коли ви відкриваєте, наприклад, зображення на чистій панелі firebug, ви все ще можете бачити сервер як nginx
dav

ІМО, це найкраща відповідь. Це рішення не потребує спеціального розширення програмного забезпечення та працює з базовим nginx.
Кріс

81

Останнє оновлення було деякий час тому, ось ось що працювало для мене на Ubuntu:

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

Потім додайте наступні два рядки до httpрозділу nginx.conf, який зазвичай знаходиться за адресою /etc/nginx/nginx.conf:

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

Крім того, не забудьте перезапустити nginx за допомогою sudo service nginx restart.


2
Чи є щось подібне на YUM? yum встановити nginx-додатки не спрацювали.
PKHunter

3
@PKHunter Я не пробував цього на мові диявола YUM, але я побачу, що я можу знайти.
jamescampbell

2
Це, безумовно, найкраща відповідь. Це слід прийняти. Це лише той, що відповідає на всі випадки.
jmcollin92

6
Встановлення пустого рядка на сервер: придушить заголовок сервера:more_set_headers 'Server: ';
Коді Крейвен

1
Дякую, що це працює як шарм, без будь-якої перекомпіляції. Молодці;)
MitchellK

37

Просто, відредагуйте /etc/nginx/nginx.conf та видаліть коментар із

#server_tokens off;

Пошук у розділі http .


3
це добре працює, як тільки ви зробите це все, що ви можете побачити про сервер на інформації заголовків: nginx (номер версії немає) Дякую! : D
джек-трейд

13
Автору питання вже відомо про цей параметр, який видаляє номер версії, але не дозволяє налаштувати значення, яке повертається у заголовку "сервер".
Макотосан

12
Це не приховує все, а лише версію сервера.
Цифровий сайт

3
Не видаляє заголовок відповіді для Server = nginx
sasha

Я думаю, що передача версії nginx є проблемою безпеки. Тож для багатьох людей це "досить хороше" рішення. Також варто зазначити, що для цього вам доведеться перейти до кожного серверного блоку, якщо у вас є серверний блок для портів 80 і 443.
Джеремі

35

Дуже просто: додайте ці рядки до розділу сервера:

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

10
Ви повинні скомпілювати nginx за допомогою третього партійного модуля wiki.nginx.org/HttpHeadersMoreModule для цього
hostmaster

10
У Ubuntu ви можете встановити, nginx-extraщоб отримати цей модуль.
Стен Бонді

11
якщо вірити автоматичному розгортанню apt-get, це nginx-extras з "s" в кінці
Tjunkie

1
Зауважте, вам потрібен префікс "Server:", щоб замінити існуюче значення Server:.
elBradford

25

Існує спеціальний модуль: http://wiki.nginx.org/NginxHttpHeadersMoreModule

Цей модуль дозволяє додавати, встановлювати або очищати будь-який вихідний або вхідний заголовок, який ви вказали.

Це розширена версія стандартних заголовків модуль , оскільки він забезпечує більше утиліта , як скидання або очищення «вмонтовані заголовками» , як Content-Type, Content-LengthіServer .

Він також дозволяє вказати необов'язкові критерії коду статусу HTTP, використовуючи -sопцію та необов’язкові критерії типу вмісту, використовуючи -tпараметр, змінюючи вихідні заголовки за допомогою директив more_set_headers та more_clear_headers ...


3
Складіть nginx з--add-module=/path-to-headers-more-nginx-module
mate64

Схоже, це було перенесено на OpenResty: github.com/openresty/headers-more-nginx-module#readme
Бен

Чи є спосіб отримати цей модуль без необхідності перекомпілювати nginx з джерела для Centos 7?
Прачі

19

Встановіть додатки Nginx

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

Інформацію про сервер можна видалити з відповіді, додавши наступні два рядки в nginx.conf (у розділі http)

more_clear_headers Server;
server_tokens off;

По-перше, це те, що було сказано вище @jamescampbell. По-друге, для цього потрібно скомпілювати Nginx з джерела ( yum install nginx-extrasне працює - я думаю, це працює на Debia / Ubuntu і т apt-get.
Д.

Він працює без nginx, зібраного з джерела. Вам потрібно лише завантажити модуль: ngx_http_headers_more_filter_module від nginx.conf
creekorful

після запуску "apt-get install nginx-extras" вона
зменшила

15

Якщо ви все добре, просто змінивши заголовок на інший рядок на п'ять літер або менше, ви можете просто переклеїти двійковий файл.

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

Що, як рішення, має кілька помітних переваг. А саме, що ви можете дозволити вашій версії nginx керувати менеджером пакунків (отже, ніякого компіляції з джерела), навіть якщо nginx-додатки недоступні для вашого дистрибутива, і вам не потрібно турбуватися про будь-який із додаткових код чогось на зразок nginx-extras є вразливим.

Звичайно, ви також хочете встановити параметр server_tokens off , приховати номер версії або також виправити цей рядок формату.

Я кажу "п’ять літер чи менше", оскільки, звичайно, завжди можна замінити:

nginx \ r \ 0

з

bob \ r \ 0 \ r \ 0

Останні два байти залишаються незмінними.

Якщо вам потрібно більше п'яти символів, вам потрібно залишити сервер_tokens включеним і замінити (трохи довший) рядок формату, хоча знову ж таки є верхня межа цієї довжини, накладена довжиною рядка формату - 1 (для повернення вагона).

... Якщо жодне з перерахованого вище не має для вас сенсу, або ви ніколи не виправляли бінарний файл, ви, можливо, захочете триматися подалі від цього підходу.


1
@PKHunter гм? Перевага цього в тому, що він працює без компіляції з нуля. Немає вихідного коду. Це безпосередньо виправлення складеного бінарного файлу.
Парфянський розстріл

1
Це взагалі не відомо про формат файлу - це просто заміна послідовності байтів іншою послідовністю байтів, тому завжди варто перевірити, чи послідовність байтів, яку ви замінюєте, справді є лише рядком, який ви хочете замінити, а не , скажімо, виконуваний код у підпрограмі (що малоймовірно, але все ж).
Парфянський розстріл

1
Отже, ви просто запустили цю sedкоманду вище, `which nginx`частина повертає шлях до двійкового файла, а sedкоманда виконує заміну байтів.
Парфянський розстріл

1
Нульові байти, згадані пізніше у відповіді, стосуються того, що ви можете використовувати короткі заголовки, ніж повна довжина рядка, поки ви закінчите заміну нульовим байтом. en.wikipedia.org/wiki/Null-terminated_string
Парфянський розстріл

1
Ага. Так, це виконуваний файл. І вам також потрібно бути користувачем, який має дозвіл на запис у файл. І я не був би здивований, якби вам довелося перезапустити, nginxщоб зміни вступили в силу. Все, що сказали? Я закликаю вас не використовувати одну з інших відповідей. Якщо всі речі, про які я говорю, вам уже не знайомі, і ви не знаєте, для чого це /etcкаталог, то такий хак такий небезпечний.
Парфянський розстріл

2

Єдиний спосіб - змінити файл src / http / ngx_http_header_filter_module.c. Я змінив nginx у рядку 48 на інший рядок.

Що можна зробити у файлі конфігурації nginx, це встановити server_tokens вимкнено . Це не дозволить nginx друкувати номер версії.

Щоб перевірити речі, спробуйте curl -I http://vurbu.com/ | grep Сервер

Це має повернутися

Server: Hai

3
Ну, це не єдиний спосіб. Інші альтернативи показані в інших відповідях.
Радько Дінев

1

Після того, як я прочитав відповідь Парфяна Шот, я переконуюсь у /usr/sbin/nginxдвійковий файл. Тоді я дізнався, що файл містить ці три рядки.

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

В основному перші два з них призначені для server_tokens on;директив (включена версія сервера). Потім я змінюю критерії пошуку, щоб відповідати цим рядкам у двійковому файлі.

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

Після того, як я копаю далі, я виявив, що повідомлення про помилку, створене nginx, також міститься в цьому файлі.

<hr><center>nginx</center>

Їх три, одна без версії, дві з них включали версію. Тому я запускаю наступну команду для заміни рядка nginx у повідомленні про помилку.

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

Дякую за це Але ваша перша команда, виконана всередині /usr/sbinпапки, дає це:sed: can't read is: No such file or directory
Хом Назид,

1

Згідно з документацією на nginx він підтримує власні значення або навіть виключення:

Syntax: server_tokens on | off | build | string;

але, на жаль, лише з комерційною підпискою :

Крім того, у рамках комерційної підписки, починаючи з версії 1.9.13, підпис на сторінках помилок та значення поля заголовка відповіді «Сервер» можна встановити явно, використовуючи рядок зі змінними. Порожня рядок вимикає емісію поля "Сервер".


0

Я знаю, що публікація якась стара, але я знайшов рішення, яке легко працює на дистрибутиві на основі Debian без компіляції nginx з джерела.

Спочатку встановіть пакет nginx-extras

sudo apt встановити nginx-додатки

Потім завантажте додатковий модуль заголовків nginx http, відредагувавши nginx.conf і додавши наступний рядок всередині блоку сервера

модулі load_module / ngx_http_headers_more_filter_module.so;

Після цього ви отримаєте доступ до директив more_set_headers і more_clear_headers.


0

Зараз додатковий пакет Nginx застарілий.

Отже, тепер для мене працювали, коли я намагався встановити різні пакунки more_set_headers 'Server: My Very Own Server';

Ви можете просто виконати наступне, і інформація про сервер чи версію не буде надсилатися назад

    server_tokens '';

якщо ви просто хочете видалити номер версії, це працює

   server_tokens off;

-4

Ви запитуєте про значення заголовка Сервера у відповіді? Ви можете спробувати змінити це за допомогою директиви add_header, але я не впевнений, чи спрацює це. http://wiki.codemongers.com/NginxHttpHeadersModule


1
так, заголовок сервера. але хіба немає більш чистих способів, як, наприклад, у lighttpd, де у мене просто є server.tag = "що завгодно"? add_header працює лише для кодів відповідей 200, 204, 301, 302 або 304, тож якщо сервер якось зробить 500, це не спрацює
daniels
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.