Nginx – Como retornar 404 se os cabeçalhos de autenticação estiverem presentes?

Nginx – Como retornar 404 se os cabeçalhos de autenticação estiverem presentes?

Eu tenho uma instância nginx na Internet que faz proxy de um aplicativo. Gostaria de retornar 404 em qualquer solicitação da Internet que tente autenticar o aplicativo, pois todas as partes públicas dele permitem acesso anônimo. Somente usuários da rede local devem poder autenticar-se nela.

Imagino que posso usar um bloco if simples, pois estou usando apenas o retorno 404, mas não tenho certeza de qual é a condição if mais confiável para detectar a presença de cabeçalhos de autenticação:

if (auth headers exist) {
  return 404;
}

Alguém tem sugestões sobre o que posso colocar no bloco if para verificar isso?

Responder1

Em geral, se as declarações não são recomendadas, ou pelo menos você deve estar ciente de alguns dos efeitos colaterais. Ler"If is Evil" no blog nginxaprender mais.

Para responder à sua pergunta: supondo que o cabeçalho que você deseja verificar seja chamado de "Autorização", sua suposição inicial já era muito precisa.

if ($authorization) {
    return 404;
}

Isso já deve funcionar. Além disso, se você quiser impor isso apenas para o bloco de servidor público, poderá usar ongx_http_access_module

Responder2

Você pode verificar a presença do cabeçalho Authorization na solicitação, que geralmente é usado para autenticar solicitações. Você pode fazer isso usando a variável $http_authorization no bloco if:

if ($http_authorization) {
  return 404;
}

Como alternativa, você pode verificar a presença de cabeçalhos de autenticação específicos usados ​​pelo seu aplicativo. Por exemplo, se seu aplicativo usa X-Auth-Token como cabeçalho de autenticação, você pode verificá-lo assim:

if ($http_x_auth_token) {
  return 404;
}

Lembre-se que o bloco if só será avaliado se a solicitação for feita para um local protegido pela diretiva auth_basic. Se quiser verificar a presença de cabeçalhos de autenticação em todas as solicitações, você pode usar a diretiva map:

map $http_authorization $block_public_auth {
  default 0;
  "~" 1;
}

server {
  ...

  location / {
    if ($block_public_auth) {
      return 404;
    }

    ...
  }
}

Acima irá bloquear todas as solicitações com um cabeçalho de Autorização, independentemente do local para onde elas são feitas.

informação relacionada