Como definir um cookie para outro domínio

166

Digamos que eu tenha um site chamado a.come, quando uma página específica deste site é carregada, digamos link da página, gosto de definir um cookie para outro site chamado b.come redirecione o usuário para b.com.

Quero dizer, na carga de a.com/linkeu quero definir um cookie para b.come redirecionar o usuário b.com.

Eu testei e o navegador realmente recebeu o cookie de a.com/link, mas não o enviou na solicitação de redirecionamento b.com. Isso é normal?

Podemos definir cookies para outros domínios?

Rasoul Zabihi
fonte
Esteja ciente de que, se você usar parâmetros de URL para definir cookies no b.com, qualquer pessoa poderá forçar qualquer valor de cookie no b.com a partir de qualquer site.
Julien
2
usar um iFrame de b.com qual o conjunto é um cookie;)
Jaquarh

Respostas:

129

Você não pode definir cookies para outro domínio. Permitir isso apresentaria uma enorme falha de segurança.

Você precisa obter b.com para definir o cookie. Se o a.com redirecionar o usuário parab.com/setcookie.php?c=value

O script setcookie pode conter o seguinte para definir o cookie e redirecionar para a página correta em b.com

<?php
    setcookie('a', $_GET['c']);
    header("Location: b.com/landingpage.php");
?>
qbert220
fonte
No entanto, o a.com pode inserir os mesmos dados na forma de um cabeçalho ao redirecionar para o b.com, não pode? Por que isso não apresenta uma falha de segurança?
21/02
3
@Coder, a função setcookie resultará no envio de um cabeçalho de cookie para o navegador da b.com. o a.com não pode enviar um cabeçalho de cookie do b.com.
Q26220
Sim, isso é muito inseguro, mas funciona. Se o OP é dono de a.com e b.com e o cookie é bastante trivial, talvez seja bom.
Rocketsarefast
1
é melhor notar na resposta que isso é inseguro, embora funcione.
Roy Ling
2
como você pode dizer isso, no entanto, o youtube está lendo cookies criados pelo gmail para mostrar sua conta no youtube?
TAHA SULTAN TEMURI
55

Semelhante à resposta principal, mas em vez de redirecionar para a página e vice-versa, o que causará uma experiência ruim ao usuário, você pode definir uma imagem no domínio A.

<img src="http://www.example.com/cookie.php?val=123" style="display:none;">

E então, no domínio B, que é exemplo.com, em cookie.php, você terá o seguinte código:

<?php
    setcookie('a', $_GET['val']);
?>

Hattip para Subin

Jonathan
fonte
1
bom corte ... :)
SOTN
16
Cuidado que provavelmente é uma péssima idéia. Você está contornando as proteções intencionais de cookies, basicamente permitindo que alguém envie uma solicitação GET criada para definir esse cookie para qualquer valor que desejar. Não sei o que você faz com esse cookie, mas espero que não envolva saldo bancário.
22317 Scott Stafford
Garanto-lhe que não envolvia saldo bancário. Mas bom ponto :)
Jonathan
2
Se, nesse caso, todos puderem chamar esse domínio com seu próprio parâmetro, você poderá adicionar segurança adicionando outro parâmetro. Crie um hash com os dados e um sal adicional e passe-o como parâmetro. No seu cookie.php, basta verificar os dados em $ _GET ['val'], recriando o token e comparando-os.
Seba M
Se você estiver enviando o GET dessa maneira, também poderá usar o AJAX.
user10398534 22/04
18

Probaly você pode usar Iframepara isso. O Facebook provavelmente usa essa técnica. Você pode ler mais sobre isso aqui . O Stackoverflow usa uma técnica semelhante, mas com armazenamento local em HTML5, mais sobre isso em seu blog

Ondrej Bozek
fonte
1
iframe trabalhou perfeitamente para a minha solução, basta incluir os valores na url como uma solicitação get normal e responder a partir de servidores com valores de cookies
Joel Davis
Esteja ciente de que você deve ter seu Controle de Acesso-Permitir-Origem configurado corretamente para que isso funcione.
user10398534 22/04
6

Definir cookies para outro domínio não é possível.

Se você deseja passar dados para outro domínio, pode codificá-los no URL.

a.com  ->  b.com/redirect?info=some+info (and set cookie) -> b.com/other+page
Patrik
fonte
4
definir um cookie de sessão a partir de um URL é um risco à segurança. urls geralmente são registrados e permite que um invasor para roubar uma sessão de usuários
Dane Macaulay
6

Você não pode, pelo menos não diretamente. Isso seria um risco de segurança desagradável.

Embora você possa especificar um atributo Domínio , a especificação diz "O agente do usuário rejeitará os cookies, a menos que o atributo Domínio especifique um escopo para o cookie que incluiria o servidor de origem".

Como o servidor de origem é a.come não inclui b.com, ele não pode ser definido.

Você precisaria b.comdefinir o cookie. Você pode fazer isso via (por exemplo) redirecionamentos HTTP para b.come para trás.

Quentin
fonte
Sei que essa é uma resposta antiga, mas por que isso seria um risco à segurança? Você pode definir cookies no seu console ou em uma extensão? Por que importa se você pode definir um cookie para um domínio diferente?
Timberman
@ Timberman - A questão é sobre o JavaScript sendo executado em um site, não nas ferramentas do desenvolvedor e não em uma extensão instalada explicitamente. Seria um risco à segurança, porque qualquer pessoa que estivesse visitando evil-hack.com poderia ter um cookie definido para their-favourite-website.comisso mudaria suas preferências naquele site.
Quentin
Entendo isso, mas como é um risco à segurança? Tenho certeza de que não tem nada a ver com segurança?
Timberman
@ Timberman - Se você não consegue ver um problema com o site de um invasor alterando suas preferências para um site completamente diferente, não sei como explicá-lo mais claramente.
Quentin
Vejo o problema, mas não vejo como é um risco à segurança. Concordo com você que o javascript não deve ser capaz de definir um cookie para um domínio diferente, mas como é um problema de segurança, se foi possível?
Timberman
5

Caso você tenha a.my-company.come, em b.my-company.comvez de apenas, a.come b.compossa emitir um cookie para o .my-company.comdomínio - ele será aceito e enviado para os dois domínios.

stop-cran
fonte
1
é possível criar um cookie em a.my-company.com para b.my-company.com?
precisa saber é o seguinte
1
A menos que my-company.com esteja na lista de buracos negros do sufixo público, nesse caso o navegador ignorará silenciosamente todas as tentativas de definir o cookie! : '- (
Michael
5

veja RFC6265 :

O agente do usuário rejeitará os cookies, a menos que o atributo Domínio especifique um escopo para o cookie que incluiria o servidor de origem. Por exemplo, o agente do usuário aceitará um cookie com o atributo Domain de "example.com" ou "foo.example.com" de foo.example.com, mas o agente do usuário não aceitará um cookie com o atributo Domain de "bar.example.com" ou "baz.foo.example.com".

NOTA: Por motivos de segurança, muitos agentes de usuário estão configurados para rejeitar atributos de domínio que correspondem a "sufixos públicos". Por exemplo, alguns agentes de usuário rejeitarão os atributos de domínio "com" ou "co.uk". (Consulte a Seção 5.3 para obter mais informações.)

Mas a solução alternativa mencionada acima com image / iframe funciona, embora não seja recomendada devido à sua insegurança.

Roy Ling
fonte
1

Você não pode, mas ... Se você possui as duas páginas, então ...

1) Você pode enviar os dados através de parâmetros de consulta ( http://siteB.com/?key=value )

2) Você pode criar um iframe do Site B dentro do site A e pode enviar mensagens de postagem de um lugar para outro. Como o Site B é o proprietário dos cookies do site B, ele poderá definir qualquer valor necessário ao processar a mensagem de postagem correta. (Você deve impedir que outros remetentes indesejados enviem mensagens para você! Isso depende de você e do mecanismo que você decide usar para impedir que isso aconteça)

cSn
fonte
0

Neste link, encontraremos a solução Link .

setcookie("TestCookie", "", time() - 3600, "/~rasmus/", "b.com", 1);
Hariharan AR
fonte
1
Isso não vai funcionar. Consulte a especificação : "O agente do usuário rejeitará os cookies, a menos que o atributo Domínio especifique um escopo para o cookie que incluiria o servidor de origem".
Quentin
0

Envie uma solicitação POST de A. As solicitações de postagem estão apenas no servidor e não podem ser acessadas pelo cliente.

Você pode enviar um pedido POST a partir a.comde b.comusar CURL (recomendado, serverside) ou um escondido method="POST"forma (clientside). Se você optar pelo último, poderá ofuscar seu JavaScript para que o usuário não seja capaz de entender o algoritmo e interferir nele.

Crie um gateway b.compara definir cookies:

<?php
    if (isset($_POST['data']) {
        setcookie('a', $_POST['data']);
        header("Location: b.com/landingpage");
    }
?>

Se você deseja levar a segurança um passo adiante, implemente uma função nos dois lados ( a.come b.com) para criptografar (ativar a.com) e descriptografar (ativar b.com) dados usando um código criptográfico.

Se você estiver tentando fazer algo que deve ser absolutamente seguro (por exemplo, transferir uma sessão de login), tente oAuth ou inspire-se em https://api.cloudianos.com/docs#v2/auth

user10398534
fonte