Nginx largando silenciosamente linhas de cabeçalho que excedem 1128 bytes

2

Eu tenho o Nginx configurado como um proxy reverso para um aplicativo uWSGI (um aplicativo Django). Devido à natureza do conteúdo que o aplicativo Django está hospedando, às vezes os URLs ficam longos. Muito tempo. Por causa disso, o cabeçalho Referer HTTP também pode, às vezes, ficar muito tempo.

Aqui está o problema. O Nginx descarta o Referer recebido do cliente se exceder 1128 bytes (descoberto por tentativa e erro). Qualquer coisa com 1128 bytes ou menor é passada para o servidor upstream. Tudo maior é descartado. Isso é um problema porque o mecanismo de proteção CSRF do Django requer um Referer intacto.

Aqui está a seção relevante da minha configuração do Nginx. arquivo:

location / {
    proxy_pass http://127.0.0.1:8000;
    proxy_set_header Host              $host;
    proxy_set_header Referer           $http_referer;
    proxy_set_header X-Real-IP         $remote_addr;
    proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
}

Analisei a documentação do Nginx e não consegui encontrar uma configuração que controlasse o tamanho máximo dos cabeçalhos dos clientes. Frustrado, até comecei a derramar sobre o código-fonte do Nginx, que também não tornou nada útil.

O que preciso fazer para que o Nginx passe Referer não modificado para o servidor upstream?

Informações da versão

  • Ubuntu 14.04 Server de 64 bits
  • nginx / 1.4.6 (Ubuntu)
  • uWSGI 1.9.17.1-debian
  • Django 1.7.0
por Nathan Osman 22.10.2014 / 20:10

2 respostas

3

A resposta de Xavier e a discussão que se seguiu levaram-me à causa real desta questão: uWSGI. Parece que o uWSGI estava removendo o cabeçalho:

[WARNING] unable to add HTTP_REFERER

A solução foi dolorosamente simples - ao iniciar o uWSGI, eu precisava simplesmente incluir a seguinte opção:

--buffer-size 8192

Todos os cabeçalhos chegam ao Django agora e a verificação do CSRF é bem-sucedida.

    
por 22.10.2014 / 22:32
1

O tamanho da leitura do cabeçalho Nginx é controlado por duas diretivas:

  • client_header_buffer_size [buffer_size] , que é o buffer padrão que caberia na maioria dos casos

  • large_client_header_buffers [count] [buffer_size] , que são buffers adicionais alocados sob demanda se não couberem no buffer client_header_buffer_size . Você deve adaptar esta última diretiva ao seu caso e certificar-se de que buffer_size seja maior que qualquer linha passada na solicitação (cabeçalhos + URL com o método HTTP e a versão HTTP).

por 22.10.2014 / 20:19