MIME sniffing e X-Content-Type-Options: nosniff explicado
Navegadores podem "farejar" o conteúdo real de uma resposta para decidir como tratá-la, mesmo quando o servidor envia o Content-Type errado. O cabeçalho X-Content-Type-Options: nosniff instrui o navegador a confiar no tipo declarado e se recusar a promover arquivos — como uma imagem enviada — a script executável.
O que é
O MIME sniffing é uma heurística do navegador que inspeciona os primeiros bytes de uma resposta para inferir seu tipo de conteúdo quando o cabeçalho Content-Type do servidor está ausente ou não corresponde ao conteúdo. Por exemplo, um arquivo declarado como text/plain que começa com <script> pode ser reclassificado e executado como HTML.
X-Content-Type-Options é um cabeçalho de resposta de valor único: X-Content-Type-Options: nosniff. Quando presente, os navegadores se recusam a promover uma resposta para um tipo MIME diferente — um arquivo enviado servido como application/octet-stream permanece binário e nunca se torna um script ou folha de estilos executável.
Por que importa
Conteúdo gerado por usuários é o principal risco. Se o seu app permite uploads de arquivos e os serve a partir da mesma origem que o app, um arquivo HTML malicioso disfarçado de imagem pode ser executado nos navegadores das vítimas quando detectado por sniffing — um XSS armazenado via upload, mesmo quando você valida extensões no servidor.
Sem nosniff, navegadores também podem executar folhas de estilos obtidas de fontes inesperadas. Uma folha de estilos executada como script cria um vetor de exfiltração de dados cross-origin combinado com outras misconfigurações. nosniff é uma proteção global de baixo custo que fortalece cada fronteira de conteúdo do seu app.
Como corrigir
Defina X-Content-Type-Options: nosniff no next.config.js para que ele se aplique a todas as respostas, incluindo rotas de API e rotas de arquivos estáticos.
// next.config.js
module.exports = {
async headers() {
return [
{
source: "/:path*",
headers: [
{ key: "X-Content-Type-Options", value: "nosniff" },
],
},
];
},
};Adicione a diretiva no seu bloco server para que ela se aplique a todas as respostas roteadas pelo nginx.
add_header X-Content-Type-Options "nosniff" always;nosniff é mais eficaz quando cada resposta também carrega um cabeçalho Content-Type correto. Para arquivos enviados por usuários, sirva-os com um tipo apropriado e a partir de uma origem ou domínio de armazenamento separado — não a mesma origem do app — para que mesmo que um arquivo seja executado, ele não possa acessar os cookies de sessão dos usuários.
Verificações de extensão podem ser contornadas. Use uma biblioteca como file-type (npm) para inspecionar os magic bytes do arquivo no servidor e rejeite qualquer coisa que não corresponda a uma lista de tipos seguros permitidos.
import { fileTypeFromBuffer } from "file-type";
const ALLOWED = new Set(["image/jpeg", "image/png", "image/webp", "image/gif"]);
async function validateUpload(buffer: Buffer): Promise<void> {
const type = await fileTypeFromBuffer(buffer);
if (!type || !ALLOWED.has(type.mime)) {
throw new Error("Upload rejected: unsupported file type");
}
}FAQ
Qual severidade o AppSafe reporta para um cabeçalho X-Content-Type-Options ausente?
Média. O cabeçalho é uma medida de hardening de baixa fricção — uma linha de configuração —, portanto omiti-lo é uma lacuna clara, mas a exploração ativa requer um vetor de upload ou injeção separado.
O nosniff afeta carregamentos normais de página?
Na prática, não. nosniff bloqueia apenas a promoção para um tipo mais perigoso. Seu HTML, CSS e JavaScript já são servidos com os tipos corretos e carregam normalmente.
X-Content-Type-Options ainda é relevante agora que navegadores modernos são mais inteligentes?
Sim. O comportamento de sniffing varia entre engines e versões, e o cabeçalho é a única garantia portável. Todos os navegadores atuais (Chrome, Firefox, Safari, Edge) respeitam nosniff.
Seu app está afetado?
O AppSafe verifica isso e dezenas de outros problemas em um único escaneamento grátis.
Escanear meu app grátisGuias relacionados
Content-Security-Policy (CSP): o que é e como adicionar uma
O cabeçalho que impede a execução de scripts injetados.
Clickjacking e X-Frame-Options: mantenha suas páginas fora de iframes
Um cabeçalho impede que atacantes sobreponham seu app dentro de um iframe.
Índices de diretório abertos: quando o seu servidor de arquivos lista tudo
Um servidor de arquivos que lista o próprio conteúdo dá aos atacantes um inventário de graça.