Chýba X-Content-Type-Options
Čo to je
Hlavička X-Content-Type-Options: nosniff povie prehliadaču „rešpektuj Content-Type, neuhádni ho podľa obsahu súboru“. Bez nej prehliadače (najmä Internet Explorer historicky, dnes aj ďalšie) skúmajú prvých pár bajtov a rozhodujú samy.
Prečo je to problém
Štandardný scenár — používateľ nahrá na váš web obrázok. Útočník namiesto skutočného obrázka nahrá súbor cat.jpg, ktorý vnútri obsahuje HTML s <script>. Server ho rozumne označí ako image/jpeg. Prehliadač ale bez nosniff skúma obsah, vidí HTML, a ten cat.jpg spustí ako stránku. Uploaded XSS.
Druhý scenár — CSS súbor, do ktorého útočník dostal HTML, prehliadač začne „rozumne“ renderovať. nosniff tomuto robí koniec.
Ako to opraviť
Triviálne. Jediná hodnota je nosniff.
nginx:
add_header X-Content-Type-Options "nosniff" always;Apache:
Header always set X-Content-Type-Options "nosniff"WordPress (functions.php / mu-plugin):
add_action('send_headers', function () {
header('X-Content-Type-Options: nosniff');
});Cloudflare: Rules → Transform Rules → HTTP Response Header Modification → pridať header.
Čo sa môže pokaziť
Prakticky nič. nosniff len vynucuje správny Content-Type — ak váš server pre .css súbory posiela Content-Type: text/css, je to v poriadku. Problém by nastal, len keby váš server posielal CSS s Content-Type: text/plain — potom by ho prehliadač prestal renderovať. Ak na to narazíte, opravujete vlastný MIME mapping, nie hlavičku.
Overenie
curl -I https://example.cz | grep -i content-type-options