문제

에버 노트의 북마크는이 작업을 수행 할 수 있으므로 바운티가 (비생산적으로) 현금으로 갈지라도 가장 활용 된 답변은 이에 대한 답을 얻지 못합니다.

도메인 B.com에서 도메인 A.com (쿠키를 HTTP로 설정)을 호출해야합니다. 도메인 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에서 쿠키를 설정합니다. 놀랍게도 이것은 P3P 헤더가 없어도 IE6에서 작동합니다.

사파리 에서이 일을 할 수있는 방법이 있습니까?

도움이 되었습니까?

해결책

로부터 Safari Developer FAQ:

Safari는 보수적 인 쿠키 정책을 통해 쿠키를 제한하는 쿠키가 사용자가 선택한 페이지 ( "탐색") 만 제한합니다. 이 기본 보수 정책은 쿠키를 작성하고 실패하는 프레임 기반 사이트를 혼동 할 수 있습니다.

나는 이것을 둘러 볼 방법을 찾지 못했습니다.

가치가 있다면 Chrome은 사용하는 경우 쿠키를 설정하지 않습니다. <script> 추가 방법이지만 숨겨진 경우 <img> 동일한 소스를 사용하여 Chrome은 나머지 브라우저 외에도 작동합니다 (Safari 제외).

다른 팁

다음은 작동하는 솔루션입니다.

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

플래시가 설치되어 있다고 가정하면 약간의 사악한 트릭이 있습니다.

여전히 작동하는지 아닌지는 확실하지 않지만 Flash'es "로컬 공유 물체"일명 플래시 쿠키 Safari의 동일한 도메인 정책을 우회하는 데 도움이 될 수 있습니다.

로컬 공유 객체 튜토리얼

그러나 최소한의 말을하는 것은 구현이 복잡 할 수 있습니다.

또한 LSO는 보안 악몽으로 빛을 발하고 있습니다.

따라서 사용하기 전에주의 깊게 생각하십시오.

숨겨진 게시물 <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>

2015 년 에이 작업에 대한 적절한 해결 방법이 있습니다. 사이트 x.com과 함께 iframe을 포함하는 웹 사이트 Y.com이 있다고 가정 해 봅시다. x.com iframe은 쿠키를 저장하려고합니다. 이는 Safari 정책에 의해 허용되지 않지만 Y.com 은이를 저장할 수 있습니다. 따라서 y.com은 x.com의 메시지를 듣고 쿠키 자체를 저장해야합니다.

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이 쿠키를 저장 해야하는 경우 y.com에 메시지를 게시해야합니다.

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

또한 쿠키를 읽으려면 Iframe에 메시지를 게시하는 방법을 사용할 수 있습니다. 또는 JavaScript를 사용하여 x.com iframe URL에 매개 변수로 포함 할 수 있습니다.

iframe.setAttribute('url','x.com/?cookieval='+YOUR_COOKIE_GET_METHOD('cookiename'));

우리가 방금 제시 한 해결 방법은 Window.open ()을 통해 쿠키를 설정하는 것이었다. . 우리는 Oauth 인증을 위해 어쨌든 팝업 창을 열어야했습니다.

그래서 우리가 한 일의 jist는 다음과 같습니다.

  1. 사용자는 b.com에서 링크를 클릭합니다
  2. 팝업 창은 a.com/setcookie로 열립니다
  3. A.com은 쿠키를 설정 한 다음 적절한 장소에서 B.com으로 리디렉션합니다.

다시 말하지만, 모든 솔루션에서 유효하지는 않지만 우리에서 작동했습니다. 도움이 되었기를 바랍니다.

이 질문이 다소 오래되었다는 것을 알고 있지만 쿠키 문제를 해결하는 데 도움이되었습니다.

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

cookieForm.submit();

쿠키를 설정하는 페이지에 양식 게시물을 작성하는 아이디어.

*편집하다*이 해결 방법은 WebKit에서 폐쇄 된 것으로보고되었습니다.

루카,

자,이 대답은 2 살이지만 ... 숨겨진 iframe에 양식을 게시하면 iframe에서 쿠키를 설정할 수 있습니다. 양식을 작성 하여이 작업을 수행 할 수 있습니다.

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

그런 다음 JavaScript에서 양식에 대한 참조를 받고 제출을 호출하십시오.

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

iframe의 onload를들을 수 있거나 Iframe 액션 페이지가 부하를 나타내는 JavaScript를 발행 할 수 있습니다. 나는 이것을 Safari와 Chrome에서 테스트했으며 작동합니다.

건배.

이것은 모든 사람에게 효과가 없을 수도 있지만 API와 다른 호스트의 React 앱을 제공하고 있기 때문에이 문제를 발견했으며 궁극적으로 작동하는 솔루션은 DNS를 사용하는 것이 었습니다.

우리의 고객은 www.company-name.com에서 서비스를 받았으며 API는 Company-Name.herokuapp.com에있었습니다. a cname api.company-name.com-> company-name.herokuapp.com을 기록하고 고객이 API 호출에 해당 하위 도메인을 사용하게되면 Safari는 "제 3 자"쿠키를 고려하지 않았습니다.

거꾸로 코드가 거의 관련이 없으며 모두 잘 정립 된 물건을 사용하고 있다는 것입니다. 단점은 HTTPS를 사용하려면 API 호스트를 통해 약간의 제어/소유권이 필요하다는 것입니다. 유효한 인증서가 필요합니다. 클라이언트 도메인의 경우 또는 사용자가 인증서 경고를받습니다. 따라서 해당 API가 귀하 또는 파트너가 아닌 경우에는 작동하지 않습니다 (최종 사용자가 최종 사용자를 대면하지 않음).

아마도 실용적으로 링크를 만들고 클릭하십시오 href="A.com/setCookie?cache=1231213123" 그리고 숨겨진 iframe을 가리키는 대상 속성. 저것 5월 쿠키 설정을위한 Safari의 사용자 탐색 정책을 우회하는 (테스트 할 Safari가 없습니다.)

Windows Live ID를 사용한 사이트를 배포하려고 할 때이에 대한 광범위한 조사를 수행했습니다.이 사이트는 로그 아웃하기 위해 타사 쿠키를 설정할 수있는 능력에 의존했습니다. 그냥 ... 작동하지 않았습니다. 우리가 할 수있는 일은 작동하지 않을 것입니다. 라이브 ID 팀은 또한 광범위한 조사를 수행했으며 그들의 대답은 "작동 할 수 없다"는 것이 었습니다.

이 선에 주목하십시오 :

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

http를 추가 할 때 까지이 일을 할 수 없었습니다.

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

간단한 해결책을 찾았습니다. 요청이 동일한 원산지에서 오는지 확인하기 위해 쿠키를 처음 설정하면 필요합니다. 평소와 같이 쿠키를 할당 할 수있는 권한이있는이 요청을 반복하는 스크립트를 iframe에 반환해야합니다. 그 후이 쿠키에 액세스하는 iframe을 통해 직접 다른 요청을 할 수 있습니다. 이것은 추적 시스템에서 도움이되었습니다. 시도해보십시오.

Safari의 이러한 제한은 하위 도메인에 적용되지 않는다는 점에 주목할 가치가 있습니다. 따라서 sitea.com을 직접 방문하면 직접 사용자 상호 작용 (iframe/javascript)없이 Subdomain.sitea.com에서 쿠키를 설정할 수 있습니다.

이것은 API를 개발할 때 내 사례와 관련이있었습니다. 방문자가 MySite.com에 도착한 경우 API와 상호 작용하기 위해 JavaScript가 원하는 경우 API가 API.mysite.com에서 호스팅되면 Safari에서 작동합니다.

이 JavaScript가 페이지에 크로스 도메인 요청을 작성하고, http://example1.com/index.html:

  <script>
  var gup = function(name, url) {
     if(!url) url = location.href;
     name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
     var regexS = "[\\?&]"+name+"=([^&#]*)";
     var regex = new RegExp( regexS );
     var results = regex.exec( url );
     return results == null ? null : results[1];
  }
  var isSafari = navigator.vendor && navigator.vendor.indexOf('Apple') > -1 && navigator.userAgent && !navigator.userAgent.match('CriOS');
  var n = gup("activated");
  if(isSafari && n == null) {
     //browser is Safari and cookies have not yet been activated
     var current_url = location.protocol + '//' + location.host + location.pathname;
     var query_string = '?callback=' + encodeURIComponent(current_url + '?activated=1');
     var new_url = 'http://example2.com/activate.php' + query_string;
     window.location.href = new_url;
  }
  //the rest of your code goes here, and you can now set cross-domain cookies on Safari
  </script>

그런 다음 쿠키를 설정 해야하는 다른 서버에서 파일을 만듭니다. http://example2.com/activate.php:

  <?php
  if(isset($_GET['callback'])) {
     header('Location: '.$_GET['callback']);
     exit();
  } else {
     //in case callback param is not set, simply go back to previous page
     echo "<script>";
     echo "window.history.back();";
     echo "</script>";
     exit();
  }
  ?>

이것이 작동하는 방법은 다음과 같습니다.

  1. 언제 http://example1.com/index.html 처음 방문한 경우 브라우저가 사파리인지 여부와 "활성화 된"이름의 get 매개 변수가 존재하지 않는지 확인하기위한 확인이 이루어집니다. 두 조건이 모두 충족되면 (사파리 브라우저의 첫 번째 방문에서 발생) 브라우저는 http://example2.com/activate.php "활성화 된"매개 변수로 추가 된 호출 URL이 포함 된 get 매개 변수 인 "콜백"을 사용합니다.

  2. http://example2.com/activate.php Get 매개 변수 "콜백"에 포함 된 URL로 다시 리디렉션됩니다.

  3. 언제 http : //example1.index.html 리디렉션 된 후 두 번째로 타격을 받으면 Get 매개 변수 "활성화 된"이 설정되므로 1 단계의 조건부가 실행되지 않으므로 스크립트가 계속 실행 될 수 있습니다.

이는 쿠키 설정을 시작하기 위해 브라우저가 제 3 자 도메인을 한 번 이상 방문하도록 해야하는 Safari의 요구 사항을 충족시킵니다.

다음과 같은 것을 시도하십시오.

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

Safari의 보안 정책을 우회 할 수 있습니다.

당신을 짜증나게하는 것은 누락 된 유형의 변호사가 아닙니다?-)

<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>
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top