Як змінити заголовок сервера, повернутий 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.