Existe alguma maneira de fazer um aplicativo Rails / Rack dizer ao servidor da Web para soltar a conexão

StackOverflow https://stackoverflow.com/questions/2570489

Pergunta

Existem muitas razões de segurança pelas quais alguém gostaria de abandonar uma conexão HTTP sem resposta (por exemplo. Práticas recomendadas do SSL da OWASP). Quando eles podem ser detectados no nível do servidor, não é grande coisa. No entanto, e se você puder detectar apenas essa condição no nível do aplicativo?

Os Rails, ou de maneira mais geral, têm alguma maneira padrão de dizer ao servidor para abandonar a conexão sem uma resposta? Caso contrário, existem alguns cabeçalhos padrão a serem transmitidos que o realizarão em servidores da Web comuns (estou pensando nginx ou apache)? Mesmo que não haja um cabeçalho padrão, existe uma maneira razoável de configurar esse comportamento? Esta é uma tarefa de tolo?

Foi útil?

Solução

O nginx tem um mecanismo para isso. Quando você está retornando um código de status especial 444 (não é padrão), o Nginx solta a conexão silenciosamente. Isso acontece apenas quando você retorna este código da configuração nginx, ou seja, gosto

location = /drop {
  return 444;
}

E você não pode retornar este código de status do seu aplicativo. A solução alternativa é retornar X-Accel-Redirect: /drop Cabeçalho do aplicativo para dizer ao uso do nginx /drop Localização para este pedido.

Outras dicas

Eu poderia estar errado, mas não acho que o rack ou os trilhos fornecem uma maneira de abandonar uma conexão. Eu acho que o mais próximo pode ser algo como "renderizar: nada => verdadeiro". Mas mesmo isso envia ironicamente algo (um único espaço, aparentemente para evitar um bug do Safari ...), mas pelo menos seu encerramento da solicitação, em vez de redirecionar (ter o cliente iniciar uma nova solicitação) como o OWASP avisa.

class TestController < ApplicationController
  def nothing
    render :nothing => true
  end
end

>> app.get('test/nothing')
=> 200
>> app.response.body
=> " "

Espero que isso ajude.

Você por favor elaboraria o que você quer dizer com "abandonar uma conexão"? Se enviar os cabeçalhos de volta com qualquer código de resposta que você desejar (movido, não autorizado, não encontrado) está bem - você já recebeu a resposta (renderização: anotando ou: cabeça). Você pode adicionar: status => algum_status.
Se você quer soltar a conexão no nível TCP/IP, assim como os firewalls, isso é outra coisa. Duvido que isso seja possível. E não acho aconselhável (se possível).
E na página que você postou o link para "Dropping Connection" é usado como sinônimo para recusar a conexão HTTPS - significa dar alguma resposta com status não autorizado ou algo assim.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top