HTTP заглавки за сигурност: какво правят и как да ги зададете
- Публикувано
- 4 ноември 2026 г.
- Източници
- 10
- Автор
- Редакция на host1.bg
Няколко реда в настройките на сървъра карат браузъра да ползва само HTTPS, да не вгражда сайта ви в чужди страници и да не „отгатва“ вида на файловете. Започнете с X-Content-Type-Options, Referrer-Policy и X-Frame-Options, които рядко чупят нещо; HSTS и CSP включвайте внимателно и на етапи.
Накратко
- Безопасен старт: nosniff, strict-origin-when-cross-origin, DENY и празен Permissions-Policy за функциите, които не ползвате.
- HSTS започнете с кратък max-age; preload е трудно обратим.
- CSP пробвайте първо като Content-Security-Policy-Report-Only.
- В nginx пишете always и внимавайте с наследяването на add_header.
- Проверете резултата с инструмента за HTTP заглавки.
01Какво са заглавките и защо помагат
HTTP заглавките са редове, които сървърът изпраща заедно със страницата. Посетителят не ги вижда, но браузърът ги изпълнява като правила. Проектът OWASP Secure Headers събира заглавките, с които приложението може да повиши сигурността си, а OWASP HTTP Headers Cheat Sheet дава препоръчителни стойности. Описанията по-долу са по MDN и OWASP.
02Седемте настройки накратко
| Заглавка | Какво прави | Стойност за начало |
|---|---|---|
| Strict-Transport-Security (HSTS) | Браузърът отваря сайта само през HTTPS и не позволява да се „прескочи“ грешка в сертификата | max-age=31536000; includeSubDomains, след като сте сигурни, че всичко работи през HTTPS |
| Content-Security-Policy (CSP) | Определя откъде страницата може да зарежда скриптове, стилове, картинки; пази от XSS (вмъкнат чужд код) | първо като Content-Security-Policy-Report-Only |
| X-Content-Type-Options | Браузърът не „отгатва“ вида на файла, а вярва на сървъра | nosniff |
| X-Frame-Options | Забранява сайтът да се показва в рамка (iframe) на чужда страница | DENY или CSP frame-ancestors |
| Referrer-Policy | Колко от адреса на страницата се изпраща към други сайтове при клик | strict-origin-when-cross-origin |
| Permissions-Policy | Изключва функции на браузъра, които сайтът не ползва | geolocation=(), camera=(), microphone=() |
| X-Powered-By и Server | Издават софтуера и версията на сървъра | X-Powered-By премахнете, Server премахнете или сложете обща стойност |
OWASP съветва старата заглавка X-XSS-Protection или да не се задава, или да е 0, защото самата тя може да създаде проблеми; защитата срещу XSS идва от CSP. OWASP отбелязва и че скриването на Server не спира разпознаването на софтуера по други признаци.
03HSTS: включете го на етапи, preload – най-накрая
HSTS важи само ако е получен през HTTPS; през HTTP браузърите го пренебрегват. Затова първо трябва да работи пренасочването от http:// към https:// с постоянен код 301. Започнете с кратък max-age, например един ден (86400), проверете всички поддомейни и чак после вдигнете на година (31536000).
Директивата preload е заявка домейнът да влезе в списъка, вграден в браузърите. Условията на hstspreload.org са: валиден сертификат, пренасочване към HTTPS на същия хост, HTTPS за всички поддомейни (включително www, ако съществува), max-age поне една година, includeSubDomains и preload. Сайтът предупреждава, че включването не се отменя лесно, а премахването отнема месеци. Не го правете, ако някой поддомейн (стара поща, тестов сайт) още няма сертификат.
04CSP: първо само наблюдавайте
CSP е най-полезната и най-лесно чупещата заглавка: ако забраните източник, от който сайтът зарежда шрифт, карта или брояч, той спира да работи. MDN описва Content-Security-Policy-Report-Only като начин да видите нарушенията, без да блокирате нищо. Пример за проста политика от MDN е default-src https:; object-src 'none': ресурси само през HTTPS, без плъгини и без вграден (inline) JavaScript.
При WordPress с много плъгини пълната CSP често изисква дълъг списък с домейни. Ако не сте готови за нея, сложете поне frame-ancestors 'self', който заменя X-Frame-Options в поддържащите браузъри.
05Как да ги зададете в .htaccess (Apache)
На споделен хостинг с Apache добавете редовете в .htaccess в главната папка на сайта. Директивата Header е позволена там, ако хостингът разрешава FileInfo. Думата always добавя заглавката и към страниците за грешка и пренасочванията:
Header always set X-Content-Type-Options "nosniff"Header always set X-Frame-Options "DENY"Header always set Referrer-Policy "strict-origin-when-cross-origin"Header always set Permissions-Policy "geolocation=(), camera=(), microphone=()"Header always set Strict-Transport-Security "max-age=86400"(за начало)
Ако след запис сайтът дава грешка 500, махнете редовете и попитайте хостинга дали модулът за заглавки е включен.
06В nginx: always и капанът с наследяването
В nginx заглавките се добавят с add_header, например add_header X-Content-Type-Options nosniff always;. Без always nginx ги добавя само при кодове като 200, 301 и 304, но не и при страници за грешка.
Капанът: add_header от блока server важи в даден location само ако в този location няма нито един собствен add_header. Добавите ли една заглавка в location, всички от server изчезват там. От версия 1.29.3 директивата add_header_inherit merge; позволява да се съберат.
07В Cloudflare Pages и Netlify: файлът _headers
При статичните услуги няма сървър за настройване. Вместо това слагате текстов файл _headers без разширение в папката, която се публикува. На първия ред е пътят, а под него с отстъп – заглавките. Пример: ред /*, а под него X-Content-Type-Options: nosniff и Referrer-Policy: strict-origin-when-cross-origin.
Cloudflare Pages позволява до 100 правила в _headers, всяко до 2000 знака на ред, и те не важат за отговорите на Pages Functions. При Netlify същото може да се запише и в netlify.toml с блок [[headers]]; правилата не важат за функции и проксирано съдържание.
08Пренасочванията и проверката
Заглавките имат смисъл, когато всеки адрес води до една версия на сайта: http:// към https:// и www към домейна без www (или обратно) с код 301. В nginx това е например return 301 https://example.bg$request_uri; в блока, който слуша на порт 80. На споделен хостинг обикновено има отметка в панела.
Проверете веригата с инструмента за пренасочвания – добре е да има една стъпка, не три. После вижте какви заглавки връща сайтът с проверката на HTTP заглавки. Ако нямате HTTPS, започнете от сертификата.
?Чести въпроси
Ще се отрази ли на WordPress?
nosniff, Referrer-Policy и Permissions-Policy рядко пречат. X-Frame-Options: DENY може да спре вграждането на собствени страници в рамка, а строга CSP почти сигурно ще спре някой плъгин – затова я пускайте първо в режим Report-Only.
Как да махна HSTS, ако сбъркам?
Изпратете през HTTPS max-age=0; браузърите го приемат при следващото посещение. Ако домейнът е в preload списъка, това не стига и премахването отнема месеци.
Източници
- MDN – Strict-Transport-Security
- MDN – Content-Security-Policy
- OWASP Secure Headers Project
- OWASP Cheat Sheet Series – HTTP Security Response Headers – стойностите за X-Frame-Options, nosniff, Referrer-Policy, Permissions-Policy, X-XSS-Protection, Server
- HSTS Preload List Submission
- Apache HTTP Server – mod_headers
- nginx – ngx_http_headers_module (add_header)
- nginx – ngx_http_rewrite_module (return)
- Cloudflare Pages – Headers
- Netlify Docs – Custom headers
Ръководството описва публикувани условия и официална документация към датата на проверка. Условията на доставчиците се променят: проверете ги при поръчка. Видяхте грешка? Пишете на kontakt@host1.bg.