Chiar dacă o aplicație web este scrisă impecabil, omiterea antetelor de securitate la nivel de server web lasă utilizatorii vulnerabili la atacuri clasice de tip Clickjacking (încărcarea site-ului tău într-un iframe invizibil pe un site malițios), atacuri de tip MIME-sniffing sau interceptări de trafic pe rețele nesigure.
Nginx permite injectarea declarativă a antetelor recomandate de consorțiul OWASP prin directiva add_header însoțită de flagul critic always.
Prin activarea antetelor HSTS (Strict-Transport-Security), X-Frame-Options, X-Content-Type-Options și a politicii Content-Security-Policy (CSP), browserul blochează automat orice tentativă de încărcare neautorizată de scripturi terțe sau de degradare a conexiunii la HTTP nesigur.
Sintaxă, opțiuni și concepte cheie
| Opțiune / Concept | Descriere practică |
|---|---|
Strict-Transport-Security (HSTS) |
Obligă browserul să acceseze site-ul exclusiv prin HTTPS pentru următorul an (`max-age=31536000`). |
X-Frame-Options "SAMEORIGIN" |
Previne încărcarea site-ului în iframe-uri pe domenii externe (anti-Clickjacking). |
X-Content-Type-Options "nosniff" |
Oprește browserul din a ghici tipul MIME al fișierelor, blocând execuția scripturilor mascate ca imagini. |
always |
Parametrul obligatoriu ce forțează Nginx să trimită antetele chiar și la răspunsuri de eroare (404, 500). |
Exemple practice și cod
Exemplul 1: Pachet complet de antete de securitate recomandat pentru Nginx
Blocul standard de hardening ce se include în fișierul de server.
# Inserat în blocul server { ... }:
# 1. HSTS forțat cu includerea subdomeniilor:
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
# 2. Protecție împotriva atacurilor de iframe:
add_header X-Frame-Options "SAMEORIGIN" always;
# 3. Blocare MIME-type sniffing:
add_header X-Content-Type-Options "nosniff" always;
# 4. Politică de Referrer curată:
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
# 5. Politică de permisiuni hardware:
add_header Permissions-Policy "camera=(), microphone=(), geolocation=()" always;
Rezultat & Impact
Scor maxim de securitate la auditurile automate de conformitate web.
Greșeli frecvente și bune practici
- Omiterea cuvântului cheie `always` la finalul directivei `add_header`, ceea ce face ca Nginx să nu trimită antetele pe paginile de eroare 404 sau 500.
- Definirea unei directive `add_header` într-un bloc `location` interior, ceea ce anulează automat toate antetele moștenite din blocul părinte `server` (comportament specific Nginx).