Cómo configurar una cookie para otro dominio

166

Digamos que tengo un sitio web llamado a.com, y cuando se carga una página específica de este sitio, diga el enlace de la página, me gustaría configurar una cookie para otro sitio llamado b.com, y luego redirigir al usuario b.com.

Quiero decir, al cargar a.com/linkquiero configurar una cookie b.comy redirigir al usuario b.com.

Lo probé y el navegador realmente recibió la cookie a.com/link, pero no envió esa cookie en la solicitud de redirección b.com. ¿Es normal?

¿Podemos establecer cookies para otros dominios?

Rasoul Zabihi
fuente
Tenga en cuenta que si utiliza parámetros de URL para establecer cookies en b.com, cualquiera podría forzar cualquier valor de cookie en b.com desde cualquier sitio web.
Julien
2
use un iFrame de b.com que establece una cookie;)
Jaquarh

Respuestas:

129

No puede configurar cookies para otro dominio. Permitir esto presentaría una enorme falla de seguridad.

Necesita obtener b.com para configurar la cookie. Si a.com redirige al usuario ab.com/setcookie.php?c=value

El script setcookie podría contener lo siguiente para configurar la cookie y redirigir a la página correcta en b.com

<?php
    setcookie('a', $_GET['c']);
    header("Location: b.com/landingpage.php");
?>
qbert220
fuente
Sin embargo, a.com puede insertar los mismos datos en forma de encabezado al redirigir a b.com, ¿no es así? ¿Por qué esto no presenta una falla de seguridad?
Codificador
3
@Coder, la función setcookie dará como resultado que se envíe un encabezado de cookie al navegador desde b.com. a.com no puede enviar un encabezado de cookie desde b.com.
qbert220
Sí, esto es muy inseguro, pero funciona. Si el OP posee a.com y b.com y la cookie es bastante trivial, entonces tal vez esté bien.
rocketsarefast
1
será mejor notar en la respuesta que esto es inseguro aunque funciona.
Roy Ling
2
¿Cómo puedes decir esto? Sin embargo, YouTube está leyendo cookies creadas por Gmail para mostrar su cuenta en YouTube.
TAHA SULTAN TEMURI
55

Similar a la respuesta principal, pero en lugar de redirigir a la página y viceversa, lo que causará una mala experiencia del usuario, puede configurar una imagen en el dominio A.

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

Y luego, en el dominio B que es example.com en cookie.php, tendrá el siguiente código:

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

Hattip a Subin

Jonathan
fuente
1
bonito truco ... :)
sotn
16
Tenga cuidado porque probablemente sea una muy mala idea. Está eludiendo las protecciones de cookies muy intencionales al permitir básicamente que cualquiera envíe una solicitud GET diseñada para establecer esa cookie en el valor que deseen. No sé qué HACES con esa cookie, pero espero que no implique un saldo bancario.
Scott Stafford
Les puedo asegurar que no implicó un saldo bancario. Pero buen punto :)
Jonathan
2
Si, como en este caso, todos pueden llamar a este dominio con su propio parámetro, puede agregar seguridad agregando otro parámetro. Cree un hash con los datos y una sal adicional y páselo como parámetro. En su cookie.php simplemente verifique los datos en $ _GET ['val'], recreando el token y comparándolos.
Seba M
Si está enviando el GET de esta manera, también puede usar AJAX.
user10398534
18

Probaly puedes usar Iframepara esto. Facebook probablemente usa esta técnica. Puedes leer más sobre esto aquí . Stackoverflow utiliza una técnica similar, pero con almacenamiento local HTML5, más sobre esto en su blog

Ondrej Bozek
fuente
1
iframe funcionó perfectamente para mi solución, simplemente incluya los valores en la URL como una solicitud de obtención normal y responda desde el servidor con valores de cookies
Joel Davis
Tenga en cuenta que debe tener su Access-Control-Allow-Origin configurado correctamente para que esto funcione.
user10398534
6

No es posible configurar cookies para otro dominio.

Si desea pasar datos a otro dominio, puede codificar esto en la url.

a.com  ->  b.com/redirect?info=some+info (and set cookie) -> b.com/other+page
Patrik
fuente
44
configurar una cookie de sesión desde una URL es un riesgo de seguridad. las URL generalmente se registran y permitirían a un atacante robar una sesión de usuarios
Dane Macaulay
6

No puedes, al menos no directamente. Eso sería un riesgo de seguridad desagradable.

Si bien puede especificar un atributo de Dominio , la especificación dice "El agente de usuario rechazará las cookies a menos que el atributo de Dominio especifique un alcance para la cookie que incluya el servidor de origen".

Como el servidor de origen es a.comy eso no incluye b.com, no se puede configurar.

Debería b.comconfigurar la cookie en su lugar. Puede hacerlo a través de (por ejemplo) redirecciones HTTP hacia b.comy hacia atrás.

Quentin
fuente
Sé que esta es una respuesta anterior, pero ¿por qué sería un riesgo de seguridad? ¿Puedes configurar cookies en tu consola o en una extensión? ¿Por qué sería importante si puede configurar una cookie para un dominio diferente?
Timberman el
@Timberman: la pregunta es sobre JavaScript que se ejecuta en un sitio web que no está en las herramientas del desarrollador y no en una extensión instalada explícitamente. Sería un riesgo de seguridad porque cualquiera que visite evil-hack.com podría tener una cookie configurada para their-favourite-website.comeso cambiaría sus preferencias en ese sitio web.
Quentin
Entiendo eso, pero ¿cómo es un riesgo de seguridad? ¿Estoy bastante seguro de que no tiene nada que ver con la seguridad?
Timberman
@Timberman: si no puede ver un problema con el sitio de un atacante cambiando sus preferencias para un sitio completamente diferente, entonces no sé cómo explicarlo más claramente.
Quentin
Veo el problema, pero no veo cómo es un riesgo de seguridad. Estoy de acuerdo con usted en que javascript no debería poder configurar una cookie para un dominio diferente, pero ¿cómo es un problema de seguridad si pudiera?
Timberman
5

En caso de que tenga a.my-company.comy en b.my-company.comlugar de solo a.comy b.compueda emitir una cookie para el .my-company.comdominio, se aceptará y se enviará a ambos dominios.

stop-cran
fuente
1
¿es posible crear una cookie en a.my-company.com para b.my-company.com?
mahesh kajale
1
¡A menos que my-company.com esté en la Lista de agujeros negros de sufijo público, en cuyo caso el navegador ignorará en silencio todos los intentos de configurar la cookie! : '- (
Michael
5

ver RFC6265 :

El agente de usuario rechazará las cookies a menos que el atributo de Dominio especifique un alcance para la cookie que incluya el servidor de origen. Por ejemplo, el agente de usuario aceptará una cookie con un atributo de dominio de "ejemplo.com" o de "foo.example.com" de foo.example.com, pero el agente de usuario no aceptará una cookie con un atributo de dominio de "bar.example.com" o de "baz.foo.example.com".

NOTA: Por razones de seguridad, muchos agentes de usuario están configurados para rechazar atributos de Dominio que corresponden a "sufijos públicos". Por ejemplo, algunos agentes de usuario rechazarán los atributos de dominio de "com" o "co.uk". (Consulte la Sección 5.3 para obtener más información).

Pero la solución mencionada anteriormente con image / iframe funciona, aunque no se recomienda debido a su inseguridad.

Roy Ling
fuente
1

No puedes, pero ... Si tienes ambas páginas, entonces ...

1) Puede enviar los datos a través de parámetros de consulta ( http://siteB.com/?key=value )

2) Puede crear un iframe del sitio B dentro del sitio A y puede enviar mensajes de un lugar a otro. Como el sitio B es el propietario de las cookies del sitio B, podrá establecer el valor que necesite procesando el mensaje de publicación correcto. (¡Debe evitar que otros remitentes no deseados le envíen mensajes! Eso depende de usted y del mecanismo que decida utilizar para evitar que eso suceda)

cSn
fuente
0

En este enlace, encontraremos la solución Enlace .

setcookie("TestCookie", "", time() - 3600, "/~rasmus/", "b.com", 1);
Hariharan AR
fuente
1
Eso no funcionará. Consulte la especificación : "El agente de usuario rechazará las cookies a menos que el atributo de Dominio especifique un alcance para la cookie que incluya el servidor de origen".
Quentin
0

Envíe una solicitud POST desde A. Las solicitudes de publicación están solo en el lado del servidor y el cliente no puede acceder a ellas.

Puede enviar una solicitud POST de a.comque b.comusando CURL (recomendado, serverside) o una ocultamethod="POST" forma (del lado del cliente). Si opta por lo último, es posible que desee ofuscar su JavaScript para que el usuario no pueda comprender el algoritmo e interferir con él.

Haga una puerta de enlace b.compara configurar las cookies:

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

Si desea llevar la seguridad un paso más allá, implemente una función en ambos lados ( a.comy b.com) para cifrar (activar a.com) y descifrar (activar)b.com ) datos utilizando un cifrador criptográfico.

Si está intentando hacer algo que debe ser absolutamente seguro (por ejemplo, transferir una sesión de inicio de sesión), pruebe oAuth o inspírese en https://api.cloudianos.com/docs#v2/auth

usuario10398534
fuente