Comment définir un cookie pour un autre domaine


166

Disons que j'ai un site Web appelé a.com, et lorsqu'une page spécifique de ce site est chargée, disons un lien de page, j'aime définir un cookie pour un autre site appelé b.com, puis rediriger l'utilisateur vers b.com.

Je veux dire, à la charge de a.com/linkje veux définir un cookie pour b.comet rediriger l'utilisateur vers b.com.

Je l'ai testé et le navigateur a effectivement reçu le cookie de a.com/link, mais il n'a pas envoyé ce cookie lors de la demande de redirection vers b.com. Est-ce normal?

Pouvons-nous définir des cookies pour d'autres domaines?


Sachez que si vous utilisez des paramètres d'URL pour définir des cookies sur b.com, n'importe qui peut forcer n'importe quelle valeur de cookie sur b.com à partir de n'importe quel site Web.
Julien

2
utiliser un iFrame de b.com qui définit un cookie;)
Jaquarh

Réponses:


129

Vous ne pouvez pas définir de cookies pour un autre domaine. Permettre cela présenterait un énorme défaut de sécurité.

Vous devez demander à b.com de définir le cookie. Si a.com redirige l'utilisateur versb.com/setcookie.php?c=value

Le script setcookie peut contenir les éléments suivants pour définir le cookie et rediriger vers la bonne page sur b.com

<?php
    setcookie('a', $_GET['c']);
    header("Location: b.com/landingpage.php");
?>

Pourtant, a.com peut insérer les mêmes données sous la forme d'un en-tête lors de la redirection vers b.com, n'est-ce pas? Pourquoi cela ne présente-t-il pas une faille de sécurité?
Coder le

3
@Coder, la fonction setcookie entraînera l'envoi d'un en-tête de cookie au navigateur depuis b.com. a.com n'est pas en mesure d'envoyer un en-tête de cookie depuis b.com.
qbert220

oui c'est très peu sûr, mais ça marche. Si l'OP possède a.com et b.com et que le cookie est assez trivial, alors peut-être que c'est bien.
rocketsarefast le

1
il vaut mieux remarquer dans la réponse que ce n'est pas sûr bien que cela fonctionne.
Roy Ling

2
comment pouvez-vous dire cela mais youtube lit les cookies créés par gmail afin de montrer leur compte sur youtube?
TAHA SULTAN TEMURI

55

Similaire à la réponse principale, mais au lieu de rediriger vers la page et inversement, ce qui entraînera une mauvaise expérience utilisateur, vous pouvez définir une image sur le domaine A.

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

Et puis sur le domaine B qui est example.com dans cookie.php, vous aurez le code suivant:

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

Hattip à Subin


1
nice hack ... :)
sotn le

16
Attention, c'est probablement une très mauvaise idée. Vous contournez les protections très intentionnelles des cookies en permettant à quiconque d'envoyer une requête GET spécialement conçue pour définir ce cookie à la valeur de son choix. Je ne sais pas ce que vous faites ensuite avec ce cookie, mais j'espère que cela n'implique pas de solde bancaire.
Scott Stafford

Je peux vous assurer qu'il ne s'agissait pas d'un solde bancaire. Mais bon point :)
Jonathan

2
Si, comme dans ce cas, tout le monde peut appeler ce domaine avec son propre paramètre, vous pouvez ajouter de la sécurité en ajoutant un autre paramètre. Créez un hachage avec les données et un sel supplémentaire et passez-le en paramètre. Dans votre cookie.php, vérifiez simplement les données dans $ _GET ['val'], en recréant le jeton et en les comparant.
Seba M

Si vous envoyez le GET de cette façon, vous pouvez également utiliser AJAX.
user10398534

18

Vous pouvez probablement utiliser Iframepour cela. Facebook utilise probablement cette technique. Vous pouvez en savoir plus ici . Stackoverflow utilise une technique similaire, mais avec un stockage local HTML5, plus à ce sujet sur leur blog


1
iframe a parfaitement fonctionné pour ma solution, il suffit d'inclure les valeurs dans l'url comme une requête get normale et de répondre à partir du serveur avec des valeurs de cookie
Joel Davis

Soyez avisé, vous devez avoir configuré votre origine de contrôle d'accès-autoriser correctement pour que cela fonctionne.
user10398534

6

La configuration de cookies pour un autre domaine n'est pas possible.

Si vous souhaitez transmettre des données à un autre domaine, vous pouvez les encoder dans l'URL.

a.com  ->  b.com/redirect?info=some+info (and set cookie) -> b.com/other+page

4
définir un cookie de session à partir d'une URL est un risque de sécurité. les URL sont généralement enregistrées et permettraient à un attaquant de voler une session d'utilisateurs
Dane Macaulay

6

Vous ne pouvez pas, du moins pas directement. Ce serait un risque de sécurité désagréable.

Bien que vous puissiez spécifier un attribut de domaine , la spécification dit "L'agent utilisateur rejettera les cookies à moins que l'attribut de domaine ne spécifie une portée pour le cookie qui inclurait le serveur d'origine."

Étant donné que le serveur d'origine est a.comet que cela n'inclut pas b.com, il ne peut pas être défini.

Vous devrez à b.comla place définir le cookie. Vous pouvez le faire via (par exemple) des redirections HTTP vers b.comet retour.


Je sais que c'est une vieille réponse, mais pourquoi serait-ce un risque pour la sécurité? Vous pouvez définir des cookies dans votre console ou dans une extension? Pourquoi est-ce important que vous puissiez définir un cookie pour un domaine différent?
Timberman le

1
@Timberman - La question concerne JavaScript s'exécutant sur un site Web et non dans les outils de développement et non dans une extension explicitement installée. Ce serait un risque pour la sécurité, car toute personne visitant evil-hack.com pourrait avoir un cookie their-favourite-website.comqui modifierait ses préférences sur ce site Web.
Quentin le

Je comprends cela, mais en quoi est-ce un risque pour la sécurité? Je suis presque sûr qu'il n'a rien à faire en matière de sécurité?
Timberman

@Timberman - Si vous ne voyez pas un problème avec le site d'un attaquant qui modifie vos préférences pour un site complètement différent, je ne sais pas comment l'expliquer plus clairement.
Quentin le

Je vois le problème, mais je ne vois pas en quoi c'est un risque pour la sécurité. Je suis d'accord avec vous que javascript ne devrait pas être en mesure de définir un cookie pour un domaine différent, mais en quoi est-ce un problème de sécurité s'il le peut?
Timberman le

5

Dans le cas où vous avez a.my-company.comet b.my-company.comau lieu de juste a.comet b.comvous pouvez émettre un cookie pour le .my-company.comdomaine - il sera accepté et envoyé aux deux domaines.


1
est-il possible de créer un cookie dans a.my-company.com pour b.my-company.com?
mahesh kajale

1
À moins que mon-entreprise.com ne figure dans la liste des suffixes publics des trous noirs, auquel cas le navigateur ignorera silencieusement toutes les tentatives de configuration du cookie! : '- (
Michael

5

voir RFC6265 :

L'agent utilisateur rejettera les cookies à moins que l'attribut Domaine ne spécifie une portée pour le cookie qui inclurait le serveur d'origine. Par exemple, l'agent utilisateur acceptera un cookie avec un attribut de domaine "example.com" ou "foo.example.com" de foo.example.com, mais l'agent d'utilisateur n'acceptera pas un cookie avec un attribut de domaine de "bar.example.com" ou de "baz.foo.example.com".

REMARQUE: pour des raisons de sécurité, de nombreux agents utilisateurs sont configurés pour rejeter les attributs de domaine qui correspondent aux «suffixes publics». Par exemple, certains agents utilisateurs rejetteront les attributs de domaine de "com" ou "co.uk". (Voir la section 5.3 pour plus d'informations.)

Mais la solution de contournement mentionnée ci-dessus avec image / iframe fonctionne, bien qu'elle ne soit pas recommandée en raison de son insécurité.


1

Vous ne pouvez pas, mais ... Si vous possédez les deux pages, alors ...

1) Vous pouvez envoyer les données via les paramètres de requête ( http://siteB.com/?key=value )

2) Vous pouvez créer un iframe du site B à l'intérieur du site A et vous pouvez envoyer des messages postaux d'un endroit à l'autre. Comme le site B est le propriétaire des cookies du site B, il sera en mesure de définir la valeur dont vous avez besoin en traitant le message correct. (Vous devez empêcher d'autres expéditeurs indésirables de vous envoyer des messages! Cela dépend de vous et du mécanisme que vous décidez d'utiliser pour empêcher que cela ne se produise)


0

Dans ce lien, nous trouverons la solution Link .

setcookie("TestCookie", "", time() - 3600, "/~rasmus/", "b.com", 1);

1
Cela ne fonctionnera pas. Voir la spécification : "L'agent utilisateur rejettera les cookies à moins que l'attribut Domaine ne spécifie une portée pour le cookie qui inclurait le serveur d'origine."
Quentin le

0

Envoyez une demande POST depuis A. Les demandes de publication sont uniquement côté serveur et ne sont pas accessibles par le client.

Vous pouvez envoyer une requête POST de a.comà en b.comutilisant CURL (recommandé, côté serveur) ou un method="POST"formulaire caché (côté client). Si vous optez pour ce dernier, vous voudrez peut-être obscurcir votre JavaScript afin que l'utilisateur ne puisse pas comprendre l'algorithme et interférer avec lui.

Créez une passerelle b.compour définir les cookies:

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

Si vous voulez aller plus loin dans la sécurité, implémentez une fonction des deux côtés ( a.comet b.com) pour crypter (activer a.com) et décrypter (sur b.com) les données à l'aide d'un chiffrement cryptographique.

Si vous essayez de faire quelque chose qui doit être absolument sécurisé (par exemple, transférer une session de connexion), essayez oAuth ou inspirez -vous de https://api.cloudianos.com/docs#v2/auth

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.