Trenutno stanje: PHP2Shell. Dvije kritične PHP ranjivosti (CVSS 9.2) omogućuju zlonamjerni kod bez prijave. Zakrpe od 21. 10. 2026.Što sada učiniti →

Sigurnosna zaglavlja za web-stranice: ispravno postavljanje

Sigurnosna zaglavlja upućuju preglednik da bolje zaštiti Vaše posjetitelje. Kako postaviti najvažnija zaglavlja u Nginxu i Apacheu, postupno uvesti Content Security Policy i provjeriti rezultat.

Stanje 5 min čitanjaSavjetnik

Ukratko: Sigurnosna zaglavlja su upute web-poslužitelja pregledniku koje štite posjetitelje od napada poput cross-site scriptinga, clickjackinga i nešifriranih veza. Najvažnija su HSTS, Content-Security-Policy, X-Content-Type-Options, zaštita od tuđih okvira, Referrer-Policy i Permissions-Policy. Smisleno su ojačavanje, ali ne zamjenjuju ažuriranja na poslužitelju.

Što sigurnosna zaglavlja postižu, a što ne

Pri svakom pozivu stranice web-poslužitelj uz sadržaj šalje i zaglavlja. Neka od njih upravljaju sigurnosnim funkcijama preglednika. Tako se primjerice može odrediti da se stranica učitava samo preko HTTPS-a ili da preglednik ne izvršava skripte s tuđih domena.

Za operatere je važno razvrstavanje: zaglavlja štite ponajprije posjetitelje, primjerice od presretanja sesija ili manipuliranih obrazaca. Ne zatvaraju ranjivosti na poslužitelju. Slabost u PHP-u, u CMS-u ili u ekstenziji ostaje, koliko god dobro zaglavlja bila postavljena. U kombinaciji s urednim kodom, međutim, znatno ograničavaju posljedice mnogih pogrešaka.

Najvažnija sigurnosna zaglavlja ukratko

Zaglavlje Svrha Preporuka kao polazište
Strict-Transport-Security (HSTS) nameće HTTPS za buduće pozive max-age=31536000; includeSubDomains
Content-Security-Policy (CSP) određuje dopuštene izvore za skripte, slike, okvire individualno, najprije kao Report-Only
X-Content-Type-Options sprječava da preglednik pogađa vrste datoteka nosniff
X-Frame-Options odnosno CSP frame-ancestors sprječava ugradnju u tuđe stranice (clickjacking) SAMEORIGIN odnosno frame-ancestors 'self'
Referrer-Policy ograničava koja se adresa prenosi drugim stranicama strict-origin-when-cross-origin
Permissions-Policy isključuje funkcije preglednika poput kamere ili lokacije dopustiti samo potrebne funkcije

HSTS biste trebali postaviti tek kad su sve poddomene pouzdano dostupne preko HTTPS-a. Preglednik pamti uputu za navedeno vrijeme; pogrešku tada nije moguće odmah povući. Po potrebi počnite s kratkim trajanjem i povećajte ga nakon uspješnih testova. Dodatna opcija preload trajno upisuje domenu u popise proizvođača preglednika i treba je postaviti tek nakon pažljive provjere.

Zaglavlja uz to nisu jedino mjesto na kojem preglednik nudi zaštitu. Kolačići bi trebali nositi atribute Secure, HttpOnly i SameSite kako se sesije ne bi presretale preko nešifriranih veza ili skripti. Kako to postaviti u PHP-u, opisuje vodič o sesijama.

Postavljanje sigurnosnih zaglavlja u Nginxu

U Nginxu zaglavlja pripadaju u server blok pojedine web-stranice. Dodatak always osigurava da se šalju i na stranicama s pogreškama.

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: ako location blok postavlja vlastite add_header naredbe, zaglavlja iz server bloka tamo se ne preuzimaju. Zato provjerite i podstranice i statične datoteke. Daljnje ojačavanje za tu kombinaciju opisuje Zaštita Nginxa s PHP-FPM-om.

Postavljanje sigurnosnih zaglavlja u Apacheu

Na Apacheu trebate modul mod_headers. Naredbe pripadaju u VirtualHost ili, ako nemate pristup, u .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 i ServerSignature pripadaju u glavnu konfiguraciju. Sprječavaju da poslužitelj u odgovorima i stranicama s pogreškama navodi svoju točnu verziju. U php.ini isto za PHP postižete s expose_php = Off.

Postupno uvođenje Content-Security-Policy

Content-Security-Policy je najučinkovitije, ali i najzahtjevnije zaglavlje. Određuje iz kojih se izvora smiju učitavati skripte, stilovi, slike, fontovi i okviri. Ako se ubačena skripta naknadno učitava s tuđe domene, preglednik je blokira.

Moderne web-stranice često ugrađuju alate za analitiku, pružatelje plaćanja, usluge karata ili videe. Prestroga politika tada onesposobljava funkcije. Zato postupajte u koracima:

  • Najprije započeti s Content-Security-Policy-Report-Only. Preglednik prijavljuje povrede u konzoli za razvojne programere ili na zbirnu adresu, ali ništa ne blokira.
  • Zabilježiti sve potrebne izvore i ciljano ih odobriti, umjesto da se koriste paušalni zamjenski znakovi.
  • Inline skripte postupno izdvojiti u datoteke ili opremiti nonceovima kako bi se moglo odustati od 'unsafe-inline'.
  • Tek nakon probne faze bez neočekivanih poruka prijeći na Content-Security-Policy.
Savjet

CSP dopunjuje uredan escaping u kodu, ali ga ne zamjenjuje. Kako ispravno osigurati izlaze u PHP-u, nalazi se u vodiču Sprječavanje cross-site scriptinga u PHP-u.

Provjera zaglavlja i izbjegavanje tipičnih pogrešaka

Nakon svake promjene provjerite stižu li zaglavlja zaista. To ide bez dodatnih alata s curl:

# Testirati konfiguraciju i ponovno učitati
nginx -t && systemctl reload nginx

# Prikazati zaglavlja početne stranice i jedne 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 pogreške su dvostruko postavljena zaglavlja kad web-poslužitelj i aplikacija šalju ista zaglavlja, CDN ispred koji uklanja ili prepisuje zaglavlja te zaglavlja koja se pojavljuju samo na početnoj stranici, ali ne kod preusmjeravanja ili stranica s pogreškama. Provjerite i nakon ažuriranja CMS-a ili sigurnosnih ekstenzija jesu li se zaglavlja promijenila.

Zato odredite jedno mjesto na kojem se zaglavlja održavaju, najbolje web-poslužitelj ili usluga ispred. Mnoge CMS ekstenzije također nude postavke za sigurnosna zaglavlja. To je zgodno, ali lako vodi do dvostrukih ili proturječnih podataka ako zaglavlja dodatno postavlja i poslužitelj. Za pojedinačne testove prikladni su i alati za razvojne programere u pregledniku: u kartici mreže uz svaki zahtjev vidite zaglavlja odgovora, a konzola prikazuje povrede Content-Security-Policy.

Kako PHP SOS konkretno pomaže?

  • Provjeravamo aktualna zaglavlja svih Vaših web-stranica, i iza CDN-a i proxyja, te pokazujemo praznine i proturječja.
  • Zaglavlja postavljamo središnje u web-poslužitelju u okviru ojačavanja poslužitelja i testiramo početnu stranicu, podstranice i stranice s pogreškama.
  • Content-Security-Policy uvodimo u načinu Report-Only, analiziramo poruke i nakon dogovora je aktiviramo.
  • Gdje izmjene koda nisu odmah moguće, zaštitu dopunjujemo WAF pravilima i virtualnim zakrpanjem.

Česta pitanja

Što su sigurnosna zaglavlja?

Sigurnosna zaglavlja dodatni su podaci u odgovoru web-poslužitelja. Pregledniku primjerice kažu da stranicu smije učitati samo preko HTTPS-a, da ne smije izvršavati strane skripte ili da stranicu ne smije prikazati u tuđim okvirima. Štite ponajprije posjetitelje.

Štite li sigurnosna zaglavlja od PHP2Shella?

Ne. PHP2Shell je ranjivost u PHP-u na poslužitelju, a zaglavlja djeluju u pregledniku posjetitelja. Protiv PHP2Shella pomaže ažuriranje na ispravljenu verziju PHP-a i ponovno pokretanje svih workera. Zaglavlja su dopunsko ojačavanje za druge vrste napada.

Može li Content Security Policy pokvariti moju web-stranicu?

Da, prestroga politika blokira potrebne skripte, fontove ili ugrađene sadržaje. Zato se najprije uvodi u načinu Report-Only, analiziraju se poruke i tek se tada prelazi na provedbu.

Je li X-XSS-Protection još smislen?

Ne. Aktualni preglednici više ne analiziraju to zaglavlje, a preporuka je izostaviti ga ili postaviti na 0. Zaštitu od cross-site scriptinga pružaju uredan escaping u kodu i Content Security Policy.

Izvori

Hitni kontakt

Svaki sat se računa. Pišite nam odmah.

Ukratko opišite sustav, verziju PHP-a i opažanje. Javit ćemo Vam se, razjasniti situaciju i raditi na daljinu dok incident nije zaključen i dokumentiran.

Hitna pomoć