別のドメインにCookieを設定する方法


166

a.comたとえば、というウェブサイトがあり、このサイトの特定のページ(ページリンクなど)が読み込まれたときに、という別のサイトにCookieを設定してb.com、ユーザーをにリダイレクトしたいとしますb.com

つまり、ロード時a.com/linkにCookieを設定し、b.comユーザーをにリダイレクトしたいと思いますb.com

私はそれをテストし、ブラウザは実際にからCookieを受信しましたa.com/linkが、リダイレクト要求でそのCookieをに送信しませんでしたb.com。正常ですか?

他のドメインにCookieを設定できますか?


URLパラメータを使用してb.comにCookieを設定すると、だれでも任意のWebサイトからb.comに任意のCookie値を強制できることに注意してください。
ジュリアン

2
Cookieを設定するb.comのiFrameを使用してください;)
Jaquarh

回答:


129

別のドメインにCookieを設定することはできません。これを許可すると、セキュリティ上の大きな欠陥が生じます。

クッキーを設定するには、b.comを取得する必要があります。a.comがユーザーをリダイレクトする場合b.com/setcookie.php?c=value

setcookieスクリプトには、Cookieを設定してb.comの正しいページにリダイレクトする次のコードを含めることができます。

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

それでも、a.comはb.comにリダイレクトするときに同じデータをヘッダーの形式で挿入できますか?これはなぜセキュリティ上の欠陥をもたらさないのですか?
コーダー

3
@ Coder、setcookie機能により、Cookieヘッダーがb.comからブラウザーに送信されます。a.comは、b.comからCookieヘッダーを送信できません。
qbert220 2013

はい、これは非常に安全ではありませんが、機能します。OPがa.comとb.comを所有していて、Cookieが非常に簡単なものである場合は、問題ない可能性があります。
rocketsarefast

1
これは機能しますが、これは安全ではないことを回答で確認した方がよいでしょう。
Roy Ling

2
どのようにこれを言うことができますが、youtubeはyoutubeでアカウントを表示するためにgmailによって作成されたcookieを読み取っていますか?
TAHA SULTAN TEMURI

55

上の回答に似ていますが、ページにリダイレクトして再度戻るのではなく、ユーザーエクスペリエンスを低下させるので、ドメインAに画像を設定できます。

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

そして、cookie.phpのexample.comであるドメインBには、次のコードがあります。

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

Subinのハットチップ


1
素敵なハック... :)
2017

16
これはおそらく非常に悪い考えです。あなたは基本的に誰もが巧みに作られたGETリクエストを送信してそのCookieを好きな値に設定できるようにすることで、非常に意図的なCookie保護を回避しています。そのCookieを使って何をするのかはわかりませんが、銀行の残高が関係しないことを願っています。
スコットスタッフォード

銀行の残高が含まれていなかったことは間違いありません。しかし良い点:)
ジョナサン

2
この場合のように、誰もが独自のパラメーターを使用してこのドメインを呼び出すことができる場合は、別のパラメーターを追加してセキュリティを追加できます。データと追加のソルトでハッシュを作成し、パラメーターとして渡します。cookie.phpで、トークンを再作成して比較することにより、$ _ GET ['val']のデータを確認するだけです。
Seba M

この方法でGETを送信する場合は、AJAXも使用できます。
user10398534

18

たぶんこれに使えますIframe。Facebookはおそらくこのテクニックを使用しています。詳しくはこちらをご覧ください。Stackoverflowは同様の手法を使用しますが、HTML5ローカルストレージを使用します。これについてはブログで詳しく説明しています


1
iframeは私のソリューションに対して完全に機能しました。通常のgetリクエストのようにURLに値を含め、サーバーからcookie値で応答するだけです
Joel Davis

これが機能するには、Access-Control-Allow-Originを適切に構成する必要があります。
user10398534

6

別のドメインにCookieを設定することはできません。

別のドメインにデータを渡したい場合は、これをURLにエンコードできます。

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

4
URLからセッションCookieを設定することはセキュリティ上のリスクです。URLは通常ログに記録され、攻撃者がユーザーセッションを盗む可能性があります
Dane Macaulay

6

できません。少なくとも直接はできません。それは厄介なセキュリティリスクになります。

あなたが指定できますが、ドメインの属性を指定は「ドメイン属性はオリジンサーバが含まれるCookieの範囲を指定しない限り、ユーザエージェントはクッキーを拒否します。」と言います

オリジンサーバーはでa.comあり、これにはが含まれていないため、b.com設定できません。

b.com代わりにCookieを設定する必要があります。これは(たとえば)HTTPリダイレクトを介して行うことができますb.com


これは古い応答であることはわかっていますが、なぜこれがセキュリティリスクになるのでしょうか。あなたのコンソールまたは拡張でクッキーを設定できますか?別のドメインにCookieを設定できるとなぜ問題になるのでしょうか。
ティンバーマン

@Timberman —問題は、開発者ツールではなく、明示的にインストールされた拡張機能ではなく、Webサイトで実行されているJavaScriptに関するものです。訪問 する誰もがそのために設定されたクッキーを持っている可能性があるので、それはセキュリティリスクとなります。evil-hack.comtheir-favourite-website.com
クエンティン

私はそれを理解していますが、それはどのようにセキュリティリスクですか?私はそれがセキュリティに関して賢明なことを何もしないとかなり確信していますか?
ティンバーマン

@Timberman —攻撃者のサイトがまったく異なるサイトの設定を変更する問題が見当たらない場合は、それをさらに明確に説明する方法がわかりません。
クエンティン

問題はあると思いますが、それがセキュリティリスクであるかどうかはわかりません。私はあなたに同意しますが、JavaScriptは別のドメインにCookieを設定できないようにする必要がありますが、それができた場合、セキュリティ上の問題はありますか?
ティンバーマン

5

場合は、あなたは持っているa.my-company.comb.my-company.comだけではなくa.comb.com、あなたはクッキーを発行することができ.my-company.com、ドメイン-それは受け入れられ、ドメインの両方に送信されます。


1
b.my-company.comのa.my-company.comにCookieを作成することは可能ですか?
mahesh kajale

1
my-company.comがパブリックサフィックスブラックホールリストに含まれていない限り、ブラウザはcookieを設定するすべての試みを黙って無視します!: '-(
Michael

5

RFC6265を参照してください。

ドメイン属性がオリジンサーバーを含むCookieのスコープを指定しない限り、ユーザーエージェントはCookieを拒否します。たとえば、ユーザーエージェントは、foo.example.comのドメイン属性が「example.com」または「foo.example.com」のCookieを受け入れますが、ユーザーエージェントは、ドメイン属性のCookieを受け入れません。 「bar.example.com」または「baz.foo.example.com」。

注:セキュリティ上の理由から、多くのユーザーエージェントは、「パブリックサフィックス」に対応するドメイン属性を拒否するように構成されています。たとえば、一部のユーザーエージェントは、「com」または「co.uk」のドメイン属性を拒否します。(詳細については、セクション5.3を参照してください。)

ただし、上記のイメージ/ iframeの回避策は機能しますが、安全性が低いため推奨されません。


1

できませんが...両方のページを所有している場合...

1)クエリパラメータ経由でデータを送信できます(http://siteB.com/?key=value

2)サイトA内にサイトBのiframeを作成し、ある場所から別の場所に投稿メッセージを送信できます。サイトBはサイトBのCookieの所有者であるため、正しい投稿メッセージを処理することで、必要な値を設定できます。(他の不要な送信者があなたにメッセージを送信するのを防ぐ必要があります!それはあなた次第であり、あなたがそれを防ぐために使用することに決めたメカニズムです)


0

このリンクには、ソリューションLinkがあります。

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

1
それはうまくいきません。仕様を参照してください:「ドメイン属性がオリジンサーバーを含むCookieのスコープを指定しない限り、ユーザーエージェントはCookieを拒否します。」
クエンティン

0

AからPOSTリクエストを送信します。Postリクエストはサーバーサイドにのみ存在し、クライアントからはアクセスできません。

からa.comb.comCURL(推奨、サーバーサイド)または非表示method="POST"フォーム(クライアントサイド)を使用してPOSTリクエストを送信できます。後者の場合は、JavaScriptを難読化して、ユーザーがアルゴリズムを理解して干渉できないようにすることができます。

ゲートウェイをオンにb.comしてCookieを設定します。

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

セキュリティをさらに一歩進めたい場合は、両側に(a.comおよびb.com)関数を実装して、暗号化暗号を使用してデータを暗号化(オンa.com)および復号化(オンb.com)します。

絶対に安全である必要のある操作(ログインセッションの転送など)を実行する場合は、oAuthを試すか、https://api.cloudianos.com/docs#v2/authからヒントを得てください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.