Trenutno stanje: PHP2Shell. Dve kritični ranljivosti PHP (CVSS 9,2) omogočata izvedbo škodljive kode brez prijave. Popravki od 21. 10. 2026.Kaj je zdaj treba storiti →

Varnostne glave za spletne strani: pravilna nastavitev security headers

Varnostne glave brskalniku naročijo, naj bolje zaščiti vaše obiskovalce. Kako najpomembnejše glave nastavite v Nginxu in Apacheju, postopoma uvedete Content Security Policy in preverite rezultat.

Stanje 5 min branjaPriročniki

Na kratko: Varnostne glave so navodila spletnega strežnika brskalniku, ki obiskovalce ščitijo pred napadi, kot so Cross-Site Scripting, clickjacking in nešifrirane povezave. Najpomembnejše so HSTS, Content Security Policy, X-Content-Type-Options, zaščita pred tujimi okvirji, Referrer-Policy in Permissions-Policy. So smiselno utrjevanje, vendar posodobitev na strežniku ne nadomestijo.

Kaj varnostne glave zmorejo in česa ne

Ob vsakem priklicu strani spletni strežnik poleg vsebine pošlje tudi glave. Nekatere med njimi krmilijo varnostne funkcije brskalnika. Tako je mogoče na primer določiti, da se stran naloži samo prek HTTPS ali da brskalnik ne izvaja skript s tujih domen.

Za upravljavce je pomembna uvrstitev: glave ščitijo predvsem obiskovalce, na primer pred prestrezanjem sej ali manipuliranimi obrazci. Ranljivosti na strežniku ne zaprejo. Šibkost v PHP, v CMS-ju ali v razširitvi ostane, ne glede na to, kako dobro so glave nastavljene. V sozvočju s čisto kodo pa posledice številnih napak občutno omejijo.

Najpomembnejše varnostne glave na kratko

Glava Namen Priporočilo kot izhodišče
Strict-Transport-Security (HSTS) uveljavi HTTPS za prihodnje priklice max-age=31536000; includeSubDomains
Content-Security-Policy (CSP) določa dovoljene vire za skripte, slike, okvirje individualno, najprej kot Report-Only
X-Content-Type-Options preprečuje, da brskalnik ugiba tipe datotek nosniff
X-Frame-Options oziroma CSP frame-ancestors preprečuje vdelavo v tuje strani (clickjacking) SAMEORIGIN oziroma frame-ancestors 'self'
Referrer-Policy omejuje, kateri naslov se posreduje drugim stranem strict-origin-when-cross-origin
Permissions-Policy izklopi funkcije brskalnika, kot sta kamera ali lokacija dovolite samo potrebne funkcije

HSTS nastavite šele, ko so vse poddomene zanesljivo dosegljive prek HTTPS. Brskalnik si navodilo zapomni za navedeni čas; napake tedaj ni mogoče takoj preklicati. Po potrebi začnite s kratkim trajanjem in ga po uspešnih preizkusih povečajte. Dodatna možnost preload domeno trajno vpiše na sezname proizvajalcev brskalnikov in naj se nastavi šele po skrbnem preverjanju.

Glave poleg tega niso edino mesto, kjer brskalnik nudi zaščito. Piškotki naj imajo atribute Secure, HttpOnly in SameSite, da seje ni mogoče prestreči prek nešifriranih povezav ali skript. Kako to nastavite v PHP, opisuje vodnik o sejah.

Nastavitev varnostnih glav v Nginxu

V Nginxu glave sodijo v blok server zadevne spletne strani. Dodatek always poskrbi, da se pošljejo tudi pri straneh z napakami.

server {
    # ...
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
    add_header X-Content-Type-Options "nosniff" always;
    add_header X-Frame-Options "SAMEORIGIN" always;
    add_header Referrer-Policy "strict-origin-when-cross-origin" always;
    add_header Permissions-Policy "camera=(), microphone=(), geolocation=()" always;
    add_header Content-Security-Policy-Report-Only "default-src 'self'; img-src 'self' data:; object-src 'none'; base-uri 'self'; frame-ancestors 'self'; form-action 'self'" always;

    server_tokens off;
}

Posebnost Nginxa: če blok location nastavi lastne ukaze add_header, se glave iz bloka server tam ne prevzamejo. Zato preverite tudi podstrani in statične datoteke. Dodatno utrjevanje za to kombinacijo opisuje stran Zaščita Nginxa s PHP-FPM.

Nastavitev varnostnih glav v Apacheju

Pri Apacheju potrebujete modul mod_headers. Ukazi sodijo v VirtualHost ali, če dostopa do njega ni, v .htaccess.

<IfModule mod_headers.c>
    Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
    Header always set X-Content-Type-Options "nosniff"
    Header always set X-Frame-Options "SAMEORIGIN"
    Header always set Referrer-Policy "strict-origin-when-cross-origin"
    Header always set Permissions-Policy "camera=(), microphone=(), geolocation=()"
    Header always set Content-Security-Policy-Report-Only "default-src 'self'; object-src 'none'; base-uri 'self'; frame-ancestors 'self'"
</IfModule>

ServerTokens Prod
ServerSignature Off

ServerTokens in ServerSignature sodita v glavno konfiguracijo. Preprečita, da bi strežnik v odgovorih in straneh z napakami navedel svojo natančno različico. V php.ini enako za PHP dosežete z expose_php = Off.

Postopna uvedba Content Security Policy

Content Security Policy je najučinkovitejša, a tudi najzahtevnejša glava. Določa, iz katerih virov se smejo nalagati skripte, slogovne datoteke, slike, pisave in okvirji. Če se vnesena skripta naloži s tuje domene, jo brskalnik blokira.

Sodobne spletne strani pogosto vključujejo orodja za analitiko, ponudnike plačil, kartografske storitve ali videe. Preostro pravilo potem onemogoči funkcije. Zato postopajte po stopnjah:

  • Najprej začnite z Content-Security-Policy-Report-Only. Brskalnik kršitve sporoča v razvijalski konzoli ali na zbirni naslov, a ničesar ne blokira.
  • Zajemite vse potrebne vire in jih ciljno dovolite, namesto da bi uporabljali splošne nadomestne znake.
  • Vrstične skripte postopoma prestavite v datoteke ali jih opremite z nonce, da se je mogoče odpovedati 'unsafe-inline'.
  • Šele po preizkusni fazi brez nepričakovanih sporočil preklopite na Content-Security-Policy.
Nasvet

CSP dopolnjuje čist escaping v kodi, a ga ne nadomesti. Kako pravilno zaščitite izpise v PHP, piše v vodniku Preprečevanje Cross-Site Scripting v PHP.

Preverjanje glav in izogibanje tipičnim napakam

Po vsaki spremembi preverite, ali glave dejansko prispejo. To gre brez dodatnih orodij s curl:

# Preizkusite konfiguracijo in znova naložite
nginx -t && systemctl reload nginx

# Prikažite glave začetne strani in statične datoteke
curl -sI https://www.example.de/ | grep -iE 'strict|content-security|x-content|x-frame|referrer|permissions|server'
curl -sI https://www.example.de/favicon.ico | grep -iE 'strict|x-content'

Tipične napake so podvojene glave, kadar spletni strežnik in aplikacija pošiljata iste glave, predhodni CDN, ki glave odstrani ali prepiše, in glave, ki se pojavijo samo na začetni strani, ne pa pri preusmeritvah ali straneh z napakami. Po posodobitvah CMS-ja ali varnostnih razširitev preverite tudi, ali so se glave spremenile.

Zato določite eno mesto, kjer se glave vzdržujejo, najbolje spletni strežnik ali predhodna storitev. Številne razširitve CMS-jev prav tako ponujajo nastavitve za varnostne glave. To je udobno, a hitro vodi do podvojenih ali nasprotujočih si navedb, če glave dodatno nastavlja še strežnik. Za posamezne preizkuse so primerna tudi razvijalska orodja brskalnika: v zavihku Omrežje vidite glave odgovora za vsako zahtevo, konzola pa prikaže kršitve Content Security Policy.

Kako PHP SOS pomaga konkretno?

  • Preverimo aktualne glave vseh vaših spletnih strani, tudi za CDN in proxyjem, ter pokažemo vrzeli in nasprotja.
  • Glave nastavimo osrednje v spletnem strežniku v okviru utrjevanja strežnika ter preizkusimo začetno stran, podstrani in strani z napakami.
  • Content Security Policy uvedemo v načinu Report-Only, ovrednotimo sporočila in jo po dogovoru aktiviramo.
  • Kjer sprememb kode ni mogoče takoj izvesti, zaščito dopolnimo s pravili WAF in virtualnim popravljanjem.

Pogosta vprašanja

Kaj so varnostne glave (security headers)?

Varnostne glave so dodatne navedbe v odgovoru spletnega strežnika. Brskalniku na primer sporočijo, naj stran naloži samo prek HTTPS, naj ne izvaja tujih skript ali naj strani ne prikazuje v tujih okvirjih. Ščitijo predvsem obiskovalce.

Ali varnostne glave ščitijo pred PHP2Shell?

Ne. PHP2Shell je ranljivost v PHP na strežniku, glave pa delujejo v brskalniku obiskovalca. Proti PHP2Shell pomaga posodobitev na odpravljeno različico PHP in ponovni zagon vseh workerjev. Glave so dopolnilno utrjevanje za druge vrste napadov.

Ali lahko Content Security Policy pokvari mojo spletno stran?

Da, preostro pravilo blokira potrebne skripte, pisave ali vdelane vsebine. Zato se uvede najprej v načinu Report-Only, ovrednotijo se sporočila in šele nato preklopi na uveljavljanje.

Ali je X-XSS-Protection še smiseln?

Ne. Aktualni brskalniki te glave ne ovrednotijo več, priporočilo pa se glasi, da jo izpustite ali nastavite na 0. Zaščito pred Cross-Site Scriptingom nudita čist escaping v kodi in Content Security Policy.

Viri

Takojšnji stik

Vsaka ura šteje. Pišite nam zdaj.

Na kratko opišite sistem, različico PHP in opažanje. Odzovemo se, razjasnimo stanje in delamo na daljavo, dokler incident ni zaključen in dokumentiran.

Takojšnja pomoč