Compartilhar cookie entre subdomínio e domínio

421

Eu tenho duas perguntas. Entendo que, se eu especificar o domínio como .mydomain.com(com o ponto inicial) no cookie, todos os subdomínios poderão compartilhar um cookie.

Pode subdomain.mydomain.comacessar um cookie criado em mydomain.com(sem o wwwsubdomínio)?

Pode mydomain.com(sem o wwwsubdomínio) acessar o cookie se ele for criado subdomain.mydomain.com?

adam0101
fonte
3
Sim, você pode .. por favor, veja o link abaixo codeguru.com/csharp/csharp/cs_internet/article.php/c19417/...
Rahul Jain
Intimamente relacionados: stackoverflow.com/questions/3089199/…
Ciro Santilli escreveu:
você pode agradar a olhar para esta questão stackoverflow.com/questions/38351769/...
Jayavardhan Gange
1
@ adam0101 E se o domínio e o subdomínio estiverem hospedados em um servidor diferente?
usar o seguinte comando
3
@ user3782114, não importa se eles estão em servidores diferentes. No meu caso, eles não estavam apenas em servidores diferentes, mas cada domínio foi balanceado por carga em vários servidores. Uma coisa que nos impressionou um pouco foi que os ambientes mais baixos (dev, test, uat etc.) começaram a compartilhar o mesmo cookie também uma vez que fizemos isso porque os tínhamos nomeado como "dev.oursite.com", "test. oursite.com ", etc. O truque (pelo menos em .Net) é gerar uma chave de máquina separada para cada ambiente e salvá-la no seu Web.config (assumindo que você altere a configuração de cada ambiente).
adam0101

Respostas:

654

Os 2 domínios mydomain.come subdomain.mydomain.comsó podem compartilhar cookies se o domínio for explicitamente nomeado no Set-Cookiecabeçalho. Caso contrário, o escopo do cookie é restrito ao host da solicitação. (Isso é chamado de "cookie somente para host". Consulte O que é um cookie somente para host? )

Por exemplo, se você enviou o seguinte cabeçalho de subdomain.mydomain.com, o cookie não será enviado para solicitações a mydomain.com:

Set-Cookie: name=value

No entanto, se você usar o seguinte, ele poderá ser usado nos dois domínios:

Set-Cookie: name=value; domain=mydomain.com

Este cookie será enviado para qualquer subdomínio de mydomain.com, incluindo subdomínios aninhados como subsub.subdomain.mydomain.com.

Na RFC 2109 , um domínio sem um ponto inicial significava que não podia ser usado em subdomínios e apenas um ponto inicial (.mydomain.com ) permitiria que ele fosse usado em vários subdomínios (mas não no domínio de nível superior). não é possível nas especificações mais antigas).

No entanto, todos os navegadores modernos respeitam a especificação mais recente RFC 6265 e ignoram qualquer ponto inicial, o que significa que você pode usar o cookie nos subdomínios e no domínio de nível superior.

Em resumo, se você definir um cookie como o segundo exemplo acima mydomain.com, ele poderá ser acessado por subdomain.mydomain.come vice-versa. Isso também pode ser usado para permitir sub1.mydomain.come sub2.mydomain.comcompartilhar cookies.

Veja também:

cmbuckley
fonte
3
Obrigado; Eu adicionei uma nota sobre o significado do ponto.
precisa saber é o seguinte
2
Eu não entendo por que você não colocou apenas o "." no domínio para o máximo de compatibilidade com o velho eo novo
Alan Macdonald
12
No padrão antigo, um cookie com domain=.mydomain.comnão é válido para o mydomain.com, portanto os dois RFCs não são compatíveis entre si.
cmbuckley
4
@ Frank, sim, eu sei. Meu comentário foi esclarecer que minha pergunta era sobre o compartilhamento de cookies entre um domínio e um subdomínio, NÃO entre dois subdomínios.
Adam0101 12/0218
3
Não tenho certeza de onde colocar isso, por isso estou escolhendo os comentários da resposta aceita. Demorou muito tempo e houve falha nas experiências para provar o que foi dito acima no meu host local, até que me ocorreu que eu deveria chamar o host local com um ponto no nome. Como "localhost.com" ou algo assim. Então todos os comportamentos "definir cookies" começaram a seguir as explicações escritas aqui nesta resposta. Esperando que isso possa ajudar alguém.
Cesc
32

Não sei se a resposta do @cmbuckley está mostrando a imagem completa. O que eu li é:

A menos que os atributos do cookie indiquem o contrário, o cookie é retornado apenas ao servidor de origem (e não, por exemplo, para qualquer subdomínio) e expira no final da sessão atual (conforme definido pelo agente do usuário). Os agentes do usuário ignoram o cookie não reconhecido.

RFC 6265

Além disso

8.6.  Weak Integrity

   Cookies do not provide integrity guarantees for sibling domains (and
   their subdomains).  For example, consider foo.example.com and
   bar.example.com.  The foo.example.com server can set a cookie with a
   Domain attribute of "example.com" (possibly overwriting an existing
   "example.com" cookie set by bar.example.com), and the user agent will
   include that cookie in HTTP requests to bar.example.com.  In the
   worst case, bar.example.com will be unable to distinguish this cookie
   from a cookie it set itself.  The foo.example.com server might be
   able to leverage this ability to mount an attack against
   bar.example.com.

Para mim, isso significa que você pode proteger os cookies de serem lidos por subdomínio / domínio, mas não pode impedir a gravação de cookies nos outros domínios. Assim, alguém pode reescrever os cookies do site controlando outro subdomínio visitado pelo mesmo navegador. O que pode não ser uma grande preocupação.

Impressionante site de teste de cookies fornecido por @cmbuckley / para aqueles que perderam a resposta em sua resposta como eu; vale a pena rolar para cima e votar /:

akostadinov
fonte
4
Parece concordar com o que estou dizendo: a menos que você especifique a domain, o cookie é usado apenas para o host da solicitação. Isso significa que Set-Cookie: name=valuefrom mydomain.comnão será enviado com solicitações para subdomínios. Também brinque com este script de teste .
Cmbuckley
@mbuckley, ok, o que você disse parece correto. Vou reformular minha resposta. Obrigado por apontar isso.
akostadinov
Necessidade de salientar, que a seção 4.1.2 (primeira citação) não é normativa ...
Velda
obrigado pelo link cmbuckley. bom testar como funciona rapidamente.
lawphotog
22

Aqui está um exemplo usando a API de cookies DOM ( https://developer.mozilla.org/en-US/docs/Web/API/Document/cookie ), para que possamos ver por nós mesmos o comportamento.

Se executarmos o seguinte JavaScript:

document.cookie = "chave = valor"

Parece ser o mesmo que executar:

document.cookie = "chave = valor; domínio = meudomínio.com"

A chave de cookie fica disponível (apenas) no domínio mydomain.com .


Agora, se você executar o seguinte JavaScript em mydomain.com:

document.cookie = "chave = valor; domínio = .meudominio.com"

A chave do cookie fica disponível para mydomain.com e também para subdomínio.meudominio.com .


Por fim, se você tentar executar o seguinte em subdomínio.meudominio.com:

document.cookie = "chave = valor; domínio = .meudominio.com"

A chave de cookie fica disponível em subdomínio.meudominio.com ? Fiquei um pouco surpreso que isso seja permitido; Eu supus que seria uma violação de segurança para um subdomínio poder definir um cookie em um domínio pai.

llambda
fonte
1
Isso me faz pensar se existem especificações separadas descrevendo o comportamento dos httponlycookies versus o tipo de cookies que você está criando.
precisa saber é o seguinte
3
Os documentos que você publicou não concordam com as declarações feitas. Os 2 primeiros exemplos não são equivalentes (um domainatributo faz com que o cookie funcione em subdomínios; esse atributo não funciona). Os pontos iniciais são ignorados na melhor das hipóteses e ativamente bloqueados na pior.
Cmbuckley
esta é a melhor solução se você não quiser confiar nos cabeçalhos do host. Eu verifiquei e seu trabalho
Szymon
14

Todos observe que você pode definir um cookie de um subdomínio em um domínio.

(enviado na resposta para solicitação subdomain.mydomain.com)

Set-Cookie: name=value; Domain=mydomain.com // GOOD

Mas você NÃO PODE definir um cookie de um domínio em um subdomínio.

(enviado na resposta para solicitação mydomain.com)

Set-Cookie: name=value; Domain=subdomain.mydomain.com // Browser rejects cookie

PORQUE ?

De acordo com as especificações RFC 6265, seção 5.3.6 Modelo de armazenamento

Se o host de solicitação canonizado não corresponder ao domínio: atributo: ignore o cookie completamente e aborte estas etapas.

e RFC 6265 seção 5.1.3 Correspondência de Domínio

Correspondência de Domínios

Um domínio de sequência corresponde a uma sequência de domínio especificada se pelo menos uma das seguintes condições for mantida:

  1. A sequência do domínio e a sequência são idênticas. (Observe que a sequência de domínio e a sequência de caracteres serão canonizadas para minúsculas neste momento.)

  2. Todas as seguintes condições são válidas:

    • A sequência de domínio é um sufixo da sequência.

    • O último caractere da sequência que não está incluída na sequência do domínio é um caractere% x2E (".").

    • A cadeia é um nome de host (ou seja, não é um endereço IP).

Portanto, "subdomínio.meudominio.com" corresponde ao domínio "meudomínio.com", mas "meudomínio.com" NÃO corresponde ao domínio "subdomínio.meudominio.com"

Verifique esta resposta também.

Contador م
fonte
Esta foi a resposta mais útil para mim.
Toby
3

Nos dois casos, sim, pode, e esse é o comportamento padrão para o IE e o Edge.

As outras respostas acrescentam informações valiosas, mas descrevem principalmente o comportamento no Chrome. é importante observar que o comportamento é completamente diferente no IE. O script de teste muito útil do CMBuckley demonstra que, no Chrome (digamos), os cookies não são compartilhados entre raiz e subdomínios quando nenhum domínio é especificado. No entanto, o mesmo teste no IE mostra que eles são compartilhados. Este caso do IE está mais próximo da descrição do take-home no link www-or-not-www da CMBuckley. Sei que é esse o caso, porque temos um sistema que usa cookies de serviço diferentes no raiz e no subdomínio. Tudo funcionou bem até que alguém o acessou no IE e os dois sistemas discutiram sobre qual cookie de sessão venceria até explodirmos o cache.

DannyW
fonte
0

Cuidado se você estiver trabalhando no localhost! Se você armazenar seu cookie em js como este:

document.cookie = "key=value;domain=localhost"

Pode não estar acessível ao seu subdomínio, como sub.localhost. Para resolver esse problema, você precisa usar o Virtual Host . Por exemplo, você pode configurar seu host virtual ServerName localhost.come poderá armazenar seu cookie em seu domínio e subdomínio assim:

document.cookie = "key=value;domain=localhost.com"
Alexandre97122
fonte
-12

Solução simples

setcookie("NAME", "VALUE", time()+3600, '/', EXAMPLE.COM);

O quinto parâmetro de Setcookie determina os (sub) domínios em que o cookie está disponível. A configuração para (EXAMPLE.COM) torna disponível para qualquer subdomínio (por exemplo: SUBDOMAIN.EXAMPLE.COM)

Referência: http://php.net/manual/en/function.setcookie.php

Lawes
fonte
17
Esta questão não é específica do PHP, não acho que se qualifique como válida.
sergelerator
1
Sergelerator, eu não fiz uma pergunta. Eu estava respondendo ao OP.
Lawes
4
@Lawes Eu acredito que sergelator significa que a pergunta do OP não é específica do PHP, enquanto sua resposta parece ser uma solução apenas para PHP, portanto, não se qualifica à pergunta do OP.
Mirage