О чем будет сегодняшний блог? О HTTP-заголовках. Многие, к сожалению, забывают или просто игнорируют их. А по факту: некоторые HTTP-заголовки не только бессмысленны, но и существенно ухудшают кибербезопасность сайта, предоставляя конфиденциальную информацию любому желающему. Например, просмотрев HTTP-headers сайта конкурента, я смог узнать текущую версию веб-сервера, версию PHP, версию программного обеспечения на сервере, и даже название шаблона сайта. Но есть и полезные HTTP-заголовки, которые наоборот улучшают безопасность сайта. Обо всем этом я расскажу в моей статье.
Что такое HTTP-заголовки?
HTTP-заголовки – это специальные параметры, содержащие информацию о браузере клиента, запрошенной странице, сервере, и передаются по протоколу HTTP (Hypertext Transfer Protocol – Протокол Передачи Гипертекста).
Получить HTTP Headers сайта можно разными способами:
- С помощью онлайн-сервиса BERTAL.RU
- С помощью расширения для браузера Firebug или Chrome/Firefox Dev Tools
- В консоли Linux командой:
curl -I https://example.com
Список HTTP-заголовков
Заголовок | Значение | Статус |
---|---|---|
date | Текущие дата и время | Требуется по протоколу |
content-type | Язык разметки, тип контента | Обычно требуется браузером |
server | Сигнатура веб-сервера | Необязателен |
content-length | Размер контента в байтах | Полезен |
last-modified | Последнее изменение страницы | Полезен |
cache-control | Управляет кешированием сайта. Указывает правила кеширования. Эффективность проверить можно тут. | Полезен |
content-encoding | Кодировка страницы | Требуется для сжатого контента |
expires | Дата предполагаемого срока истечения актуальности контента. Если в ответе с сервера установлен заголовок Cache-Control с директивами “max-age” или “s-maxage”, заголовок Expires игнорируется. |
Необязателен |
x-powered-by | Версия PHP сайта | Необязателен |
pragma | Является заголовком HTTP/1.0 и отвечает за кеширование. Тем не менее, не может служить надежной заменой заголовку “Cache-Control: no-cache”, хотя и ведет себя аналогичным образом когда поле заголовка Cache-Control опущено в запросе. На некоторых CMS включен по умолчанию и взаимодействует с Cache Control. В принципе, выполняет какую-то работу. | Необязателен для HTTP/2 |
x-frame-options | Защита от кликджекинга | Полезен |
access-control-allow-origin | Проверка, может ли ресурс быть доступен для контента на текущем домене. | Полезен |
x-content-type-options | Блокировка перехвата содержимого MIME | Полезен |
link | Указывает на логически связный с сущностью ресурс | Полезен |
age | Количество секунд с момента последней модификации ресурса | Полезен |
x-cache | Непонятный заголовок, который добавляют CDN-сервисы | Необязателен |
x-xss-protection | Защита от XSS-атак | Полезен |
strict-transport-security | HSTS заголовок, который уведомляет ботам, что доступ к сайту должен быть только по https. Форсирует безопасность сайта. | Полезен |
via | Общее поле HTTP заголовкаVia служит для отображения списка версий протокола HTTP, названий и версий прокси-серверов, через которые прошло сообщение. | Необязателен |
p3p | Нужен для IE8 чтобы принимать cookies третьих лиц. Устаревший. | Необязателен |
expect-ct | Нужный для декларирования клиенту, что используется механизм Certificate Transparency – то есть сервер получил сертификат через публично журналируемый CA, и запись о выдаче данного сертификата есть и доступна. | Полезен |
content-language | Язык контента | Спорно |
x-aspnet-version | Версия сервера ASP.NET | Необязателен |
access-control-allow-credentials | Проверка безопасности. Нужен для работы некоторых jquery-плагинов. | Полезен |
x-robots-tag | Заголовок X-Robots-Tag используется как элемент HTTP-ответа для определенного URL. В заголовках X-Robots-Tag поддерживаются те же директивы, что и в мета тегах robots. |
Не имеет значения для браузеров, используется поисковыми ботами Google |
x-ua-compatible | Призывает Internet Explorer работать в определённом режиме документа. Остальные браузеры должны игнорировать данную прагма директиву. | Необязателен |
access-control-allow-methods | Контроль безопасности | Полезен |
access-control-allow-headers | Контроль безопасности | Полезен |
Жирным обозначены заголовки, которые можно без риска удалить из ответа сервера.
HTTP Security Headers
Заголовки безопасности предотвращают атаки на сайт, межсайтовый скриптинг, инъекции и эксплойты.
Ниже, подаю заготовку директив для .htaccess, которая добавляет все необходимые заголовки безопасности на сайт:
# BEGIN SECURITY_HEADERS <IfModule mod_headers.c> Header always set Strict-Transport-Security: "max-age=63072000; includeSubDomains; preload" env=HTTPS Header always set Content-Security-Policy "upgrade-insecure-requests" Header always set X-XSS-Protection "1; mode=block" Header always set X-Content-Type-Options "nosniff" Header always set Referrer-Policy: "no-referrer-when-downgrade" Header always set Expect-CT "max-age=7776000, enforce" Header always set X-Frame-Options "sameorigin" Header always set Permissions-Policy: "accelerometer=(), camera=(), geolocation=(), gyroscope=(), magnetometer=(), microphone=(), payment=(), usb=()" </IfModule> # END SECURITY_HEADERS
Как убрать HTTP-заголовки?
Убираем http-заголовок Server
Если у вас веб-сервер стандартно на Apache, нужно найти системный файл httpd.conf и добавить в него или изменить 2 строки:
ServerTokens Prod
ServerSignature Off
Если веб-сервер NGINX, то вносим эти 2 директивы в файл nginx.conf.
Убираем версию PHP
<IfModule mod_headers.c> Header always unset X-Powered-By Header unset X-Powered-By </IfModule>
expose_php
на Off
Убираем устаревший заголовок P3P
HTTP-заголовки на самом деле можно удалить и посредством PHP с помощью функции header_remove. Добавляем в самый верх шаблона сайта (header.php или index.php) следующий код:
<?php header_remove("P3P"); ?>
Как проверить HTTP-заголовки

