66

ドメイン B.com からドメイン A.com (http で Cookie を設定する) を呼び出す必要があります。私がドメイン B.com で行うことは (javascript):

var head = document.getElementsByTagName("head")[0];
var script = document.createElement("script");
script.src = "A.com/setCookie?cache=1231213123";
head.appendChild(script);

これにより、Safari を除く、テストしたすべてのブラウザーで A.com に Cookie が設定されます。驚くべきことに、これは P3P ヘッダーがなくても IE6 で機能します。

これをSafariで機能させる方法はありますか?

4

18 に答える 18

61

からSafari Developer FAQ

Safariには、ユーザーが選択した(「ナビゲートした」)ページにのみCookieの書き込みを制限する保守的なCookieポリシーが付属しています。このデフォルトの保守的なポリシーは、Cookieを書き込もうとして失敗するフレームベースのサイトを混乱させる可能性があります。

私はこれを回避する方法を見つけられませんでした。

何か価値がある場合、<script追加方法を使用してもChromeはCookieを設定しませんが<img、同じソースで非表示になっている場合は、Chromeは他のブラウザ(Safariを除く)に加えて機能します。

于 2009-01-28T05:29:29.813 に答える
13

これが機能する解決策です:

http://anantgarg.com/2010/02/18/cross-domain-cookies-in-safari/

于 2010-02-18T12:30:19.007 に答える
4

フラッシュがインストールされていると仮定すると、少し邪悪なトリックがあります。

それでも機能するかどうかはわかりませんが、Flash の「ローカル共有オブジェクト」別名Flash Cookieは、Safari の同一ドメイン ポリシーを回避するのに役立つ可能性があります。

ローカル共有オブジェクトのチュートリアル

ただし、控えめに言っても、実装は複雑になる可能性があります。

さらに、LSO はセキュリティ上の悪夢であることが明らかになりつつあります。

したがって、それらを使用する前によく考えてください。

于 2009-02-04T13:09:14.603 に答える
3

非表示に投稿すると<iframe>、Safari でこの制限を回避できます -- http://gist.github.com/586182 :

<?php
  header('P3P: CP=HONK');
  setcookie('test_cookie', '1', 0, '/');
?>
<div id="test_cookie" style="position: absolute; top: -10000px"></div>
<script>
  window.setTimeout(function() {
    if (document.cookie.indexOf('test_cookie=1') < 0) {
      var      
        name = 'test_cookie',
        div = document.getElementById(name),
        iframe = document.createElement('iframe'),
        form = document.createElement('form');

      iframe.name = name;
      iframe.src = 'javascript:false';
      div.appendChild(iframe);

      form.action = location.toString();
      form.method = 'POST';
      form.target = name;
      div.appendChild(form);

      form.submit();
    }
  }, 10);
</script>
于 2010-10-01T07:51:38.503 に答える
3

2015 年には、これに対する適切な回避策があります。サイト x.com の iframe を含む Web サイト y.com があるとします。x.com iframe は Cookie を保存しようとしています。これは Safari のポリシーでは許可されていませんが、y.com では保存できます。したがって、y.com は x.com からのメッセージをリッスンしてから、Cookie 自体を保存する必要があります。

var _cookieEvMth = window.addEventListener ? "addEventListener" : "attachEvent";
var _cookieEvAction = window[_cookieEvMth];
var _cookieEv = _cookieEvMth == "attachEvent" ? "onmessage" : "message";
_cookieEvAction(_cookieEv, function(evt){
  if(evt.data.indexOf('cookieset')!=-1){
    var datack = evt.data.split('|');
    YOUR_CUSTOM_COOKIE_SAVE_METHOD(datack[1],datack[2],datack[3]);
  }
},false);

x.com が Cookie を保存する必要がある場合、y.com にメッセージを投稿する必要があります。

window.parent.postMessage('cookieset|'+ckName+'|'+ckVal+'|'+days,'*');

また、Cookie を読みたい場合は、メッセージを iframe に投稿することもできます。または、javascript を使用して x.com iframe URL にパラメーターとして含めることができます。

iframe.setAttribute('url','x.com/?cookieval='+YOUR_COOKIE_GET_METHOD('cookiename'));
于 2015-06-12T13:05:26.687 に答える
2

私はこの質問がかなり古いことを知っていますが、これはクッキーの問題を解決するのに役立ちました:

var cookieForm = document.createElement("form");
cookieForm.action = "A.com/setCookie?cache=1231213123";
cookieForm.method = "post";
document.body.appendChild(cookieForm);

cookieForm.submit();

Cookie を設定するページにフォームを投稿するというアイデア。

于 2010-07-27T08:57:45.650 に答える
2

私の仕事で思いついた回避策は、window.open() を介して Cookie を設定することでした。これは最適ではないかもしれません (見苦しいポップアップ ウィンドウが開いてしまうため)。 . とにかく、OAuth 認証のためにポップアップ ウィンドウを開く必要がありました。

それで、私たちがしたことの要点は次のとおりです。

  1. ユーザーが B.com からのリンクをクリックする
  2. A.com/setCookie へのポップアップ ウィンドウが開きます
  3. A.com は Cookie を設定し、適切な場所で B.com にリダイレクトします

繰り返しますが、すべてのソリューションで有効というわけではありませんが、私たちのソリューションでは機能しました。お役に立てれば。

于 2009-05-08T19:53:24.653 に答える
1

*編集* この回避策は、WebKit でクローズされたと報告されています。

ルカ、

わかりましたので、この回答は 2 年前のものですが... フォームを非表示の iframe に投稿すると、iframe から Cookie を設定できます。これを行うには、フォームを作成します。

<form id="myiframe" action="http://yourdomain.com" method="POST" target="iframe_target">

次に、Javascript でフォームへの参照を取得し、submit を呼び出します。

document.getElementsByTagName('form')[0].submit();

iframe の onload をリッスンするか、iframe アクション ページに負荷を通知する JavaScript を発行させることができます。これを Safari と Chrome でテストしましたが、動作します。

乾杯。

于 2011-01-26T02:03:51.997 に答える
0

ログアウトするためにサードパーティのCookieを設定できるかどうかに依存する、Windows Live IDを使用するサイトを展開しようとしたときに、これについて詳細な調査を行いました。それはただ...うまくいきませんでした。私たちにできることは何もそれを機能させることはできません。Live IDチームも徹底的な調査を行い、彼らの答えは「それを機能させることができない」でした。

于 2009-02-04T05:55:47.677 に答える
0

href="A.com/setCookie?cache=1231213123"おそらく、非表示の iframe を指すターゲット属性を持つリンクを実際に作成してクリックします。これ、Cookie を設定するためのユーザー ナビゲーションの Safari のポリシーをバイパスする可能性があります (テストするのに便利な Safari はありません)。

于 2009-01-28T05:50:09.290 に答える
0

次の行に注意してください。

script.src = "A.com/setCookie?cache=1231213123";

httpを追加するまで、これを機能させることができませんでした。

script.src = "http://A.com/setCookie?cache=1231213123";
于 2009-07-28T01:24:11.930 に答える
0

簡単な解決策を見つけました。初めて Cookie を設定して、リクエストが同じオリジンからのものかどうかを確認する必要があります。通常とは異なる場合は、このリクエストを繰り返すスクリプトを iframe に戻す必要があります。すでに Cookie を割り当てる権限があります。その後、この Cookie にアクセスする iframe を介して直接他のリクエストを行うことができます。これは、追跡システムで役立ちました。試してみてください、これはうまくいきます。

于 2016-01-29T22:15:05.347 に答える
-2

次のようなものを試してください:

var w = window.open("A.com/setCookie?cache=1231213123");
w.close();

Safari のセキュリティ ポリシーをバイパスする可能性があります。

于 2009-02-02T16:16:03.543 に答える
-13

あなたを悩ませているのは型属性の欠落ではありませんか?-)

<script type="text/javascript">
  var head = document.getElementsByTagName("head")[0];
  var script = document.createElement("script");
  script.setAttribute("type","text/javascript");
  script.src = "A.com/setCookie?cache=1231213123";
  head.appendChild(script);
</script>
于 2009-01-03T11:31:28.767 に答える