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

Referencie