A porta de cookies HTTP é específica?


355

Eu tenho dois serviços HTTP em execução em uma máquina. Eu só quero saber se eles compartilham seus cookies ou se o navegador faz distinção entre os dois soquetes do servidor.

Respostas:


329

A especificação atual de cookies é a RFC 6265 , que substitui a RFC 2109 e a RFC 2965 (agora as duas RFCs estão marcadas como "Histórico") e formaliza a sintaxe para o uso no mundo real de cookies. Afirma claramente:

  1. Introdução

...

Por razões históricas, os cookies contêm várias infelicidades de segurança e privacidade. Por exemplo, um servidor pode indicar que um determinado cookie é destinado a conexões "seguras", mas o atributo Secure não fornece integridade na presença de um invasor de rede ativo. Da mesma forma, os cookies de um determinado host são compartilhados em todas as portas desse host, mesmo que a "política de mesma origem" usada pelos navegadores da Web isole o conteúdo recuperado por diferentes portas.

E também:

8.5 Fraca confidencialidade

Os cookies não fornecem isolamento por porta . Se um cookie for legível por um serviço em execução em uma porta, ele também poderá ser lido por um serviço em execução em outra porta do mesmo servidor. Se um cookie for gravável por um serviço em uma porta, o cookie também será gravável por um serviço em execução em outra porta do mesmo servidor. Por esse motivo, os servidores NÃO devem executar serviços desconfiados em portas diferentes do mesmo host e usar cookies para armazenar informações confidenciais de segurança.


129

De acordo com o RFC2965 3.3.1 (que pode ou não ser seguido pelos navegadores), a menos que a porta seja especificada explicitamente pelo portparâmetro do Set-Cookiecabeçalho, os cookies podem ou não ser enviados para qualquer porta.

O Manual de segurança do navegador do Google diz: por padrão, o escopo dos cookies é limitado a todos os URLs no nome do host atual - e não está vinculado às informações de porta ou protocolo. e algumas linhas depois Não há como limitar os cookies a um único nome DNS [...] da mesma forma, não há como limitá-los a uma porta específica. (Além disso, mantenha em mente, que o IE faz números de porta não fator na sua política de mesma origem em tudo .)

Portanto, não parece seguro confiar em nenhum comportamento bem definido aqui.


75
A RFC 6265 , que substitui a RFC 2965, elimina o Portparâmetro no Set-Cookiecabeçalho (porque quase ninguém realmente o usou na prática) e torna muito explícito que os cookies no mesmo host não são mais distintos pelas portas.
Remy Lebeau

5
IE 9 não vai mesmo enviar a volta cookie em solicitações subseqüentes se o domínio tem uma porta nele
axk

3
Existe algum navegador que ainda esteja considerando a porta no SOP de seus cookies?
Bertuz 28/05

5
O Chrome nem definirá o cookie se o domínio tiver uma porta.
Pim Heijden

76

Esta é uma pergunta muito antiga, mas pensei em adicionar uma solução alternativa que usei.

Eu tenho dois serviços em execução no meu laptop (um na porta 3000 e outro na 4000). Quando eu pularia entre ( http://localhost:3000e http://localhost:4000), o Chrome passaria o mesmo cookie, cada serviço não entenderia o cookie e geraria um novo.

Descobri que, se eu acessasse http://localhost:3000e http://127.0.0.1:4000, o problema desaparecesse, pois o Chrome mantinha um cookie para localhost e um para 127.0.0.1.

Mais uma vez, ninguém pode se importar neste momento, mas foi fácil e útil para a minha situação.


11
Sim, porque os cookies estão associados a nomes de host / domínio, portanto, um cookie ativado localhostnão pode ser compartilhado 127.0.0.1e vice-versa. Mas os cookies no mesmo host / domínio, independentemente da porta, são compartilháveis.
Remy Lebeau

3
Claro que sim. Eu (e provavelmente milhões de outros desenvolvedores) uso o host local para testar o tempo todo. A menos que a porta adicionada faça a diferença: localhost: 8080
David Balažic

53
Além disso, você pode usar 127.0.0.1, 127.0.0.2, 127.0.0.3 etc ... todos eles significam host local.
David Balažic

3
Não posso aprovar isso porque não responde à pergunta, mas é uma ótima dica, obrigado!
Martin T.

2
Se você estiver disposto a editar o arquivo hosts (/ etc / hosts no Unix), poderá ter quantos nomes significativos desejar para o host local.
Silas S. Brown

20

Essa é uma grande área cinza no SOP do cookie (mesma política de origem).

Teoricamente, você pode especificar o número da porta no domínio e o cookie não será compartilhado. Na prática, isso não funciona com vários navegadores e você encontrará outros problemas. Portanto, isso só é possível se seus sites não são para o público em geral e você pode controlar quais navegadores usar.

A melhor abordagem é obter dois nomes de domínio para o mesmo IP e não depender de números de porta para cookies.


9
Não é mais uma área cinzenta. O RFC 6265 , que é o padrão atual de cookies, elimina qualquer confusão a respeito, simplesmente eliminando a capacidade de separar cookies no mesmo host usando portas diferentes.
Remy Lebeau

18

Uma maneira alternativa de contornar o problema é tornar o nome do cookie da sessão relacionado à porta. Por exemplo:

  • mysession8080 para o servidor em execução na porta 8080
  • mysession8000 para o servidor em execução na porta 8000

Seu código pode acessar a configuração do servidor da web para descobrir qual porta seu servidor usa e nomeie o cookie de acordo.

Lembre-se de que seu aplicativo receberá os dois cookies e é necessário solicitar o que corresponde à sua porta.

Não é necessário ter o número exato da porta no nome do cookie, mas isso é mais conveniente.

Em geral, o nome do cookie pode codificar qualquer outro parâmetro específico para a instância do servidor usada, para que possa ser decodificado no contexto correto.


9

No IE 8, os cookies (verificados somente no host local) são compartilhados entre as portas. No FF 10, eles não são.

Publiquei esta resposta para que os leitores tenham pelo menos uma opção concreta para testar cada cenário.


4

Eu estava com um problema semelhante ao executar (e tentar depurar) dois aplicativos Django diferentes na mesma máquina.

Eu os estava executando com estes comandos:

./manage.py runserver 8000
./manage.py runserver 8001

Quando eu entrei no primeiro e depois no segundo, sempre saí do primeiro e vice-versa.

Adicionei isso em meus / etc / hosts

127.0.0.1    app1
127.0.0.1    app2

Então iniciei os dois aplicativos com estes comandos:

./manage.py runserver app1:8000
./manage.py runserver app2:8001

Problema resolvido :)


4
você provavelmente pode usar 127.0.0.1:8000por um, localhost:8000por um segundo e possivelmente ::1:8000(talvez [::1]:8080) por um terceiro sem precisar tocar no arquivo de hosts.
Travis Watson

11
você pode colocá-lo em uma linha:::1 app1 app2 app3 app4 app5 appN
aeroson 25/10

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.