Safari 타사 쿠키 iframe 트릭이 더 이상 작동하지 않습니까?


137

그래서 이것은 "사파리에서 제 3 자 쿠키를 작동시키는 방법"질문의 10 번째 복수이지만 2012 년 2 월 이후에 경기장이 변경되었다고 생각하기 때문에 다시 묻습니다. Safari의 파티 쿠키는 다음과 같습니다. 일부 자바 스크립트를 사용하여 숨겨진 iframe에 POST합니다. 사파리가 사용자가 제 3 자 콘텐츠와 상호 작용하고 쿠키를 설정할 수 있다고 생각하도록 속였습니다.

나는 생각 이 허점이가 구글의 광고와의 트릭을 사용하던 것으로 나타났다 온화한 스캔들의 여파로 폐쇄되었습니다. 적어도이 트릭을 사용하는 동안 Safari에서 쿠키를 완전히 설정할 수 없었습니다. 애플이 허점을 막기 위해 노력하고 있다고 주장하는 임의의 인터넷 게시물을 발굴했지만 공식 단어를 찾지 못했습니다.

폴백으로 메인 타사 프레임을 다시 디자인하여 내용이로드되기 전에 버튼을 클릭해야했지만 해당 수준의 직접적인 상호 작용조차도 Safari의 차가운 차가운 마음을 녹이기에 충분하지 않았습니다.

사파리가 실제로이 허점을 막았는지 아는 사람이 있습니까? 그렇다면 다른 해결 방법이 있습니까 (모든 요청에 ​​세션 ID를 수동으로 포함하는 것 제외)?


21
쿠키가 필요한 타사 iframe을 사용하는 것은 확실히 보안 공격이 아닙니다 ! 우리는 다양한 도메인에서 iframe으로 사용되는 웹샵을 운영하고 있으며 최근에 Safari에 모든 종류의 문제가 있으므로이 (합법적 인) 질문에 대한 답변에 매우 관심이 있습니다.
mscha

14
Facebook 앱을 제작하는 거의 모든 사람들이 Safari에이 문제가 있습니다. Facebook 앱은 iframe에서 실행되며 정의에 따라 모두 타사에서 제공됩니다. 이것이 Facebook 앱에서 Safari를 지원하는 것이 약간 드문 이유입니다. 쿠키를 사용할 수 없습니다.
gs hurley

Safari 5.1.7에서이 문제를 재현 할 수 없습니다. 기본 "타사 쿠키 없음"설정으로 Facebook 앱 iframe의 쿠키를 허용합니다. 그러나 동일한 설정의 Chrome 19.0.1084.46은 쿠키를 차단합니다.
Evgeny Shadchnev

4
기본이 아닌 "제 3 자 쿠키 및 사이트 데이터 차단"옵션이 선택되어있는 Chrome 19 이상은 Safari의 기본 "제 3 자 및 광고주의 쿠키 차단"설정보다 훨씬 더 강합니다. 크롬에서는 제 3 자 도메인을 방문하여 쿠키를 설정하더라도 iframe으로 전송되지 않습니다. 사용자는 실제로 Chrome 보안 설정에서 도메인에 대한 "예외"를 추가해야합니다.
Aaron

2012 년 2 월은 무엇을 의미하나요? Safari에 기술적 인 변화가 있습니까, 아니면 법률에 변화가 있습니까?
액체

답변:


51

사용자 상호 작용이 필요없는 간단한 작업 솔루션을 여기에두고 싶었습니다 .

내가 게시물에 언급 한대로 :

기본적으로 페이지를 top.location에로드하고 세션을 생성 한 다음 다시 페이스 북으로 리디렉션하기 만하면됩니다.

이 코드를 상단에 추가 index.php하고 $page_url애플리케이션 최종 탭 / 앱 URL로 설정하면 애플리케이션이 아무런 문제없이 작동하는 것을 볼 수 있습니다.

<?php
    // START SAFARI SESSION FIX
    session_start();
    $page_url = "http://www.facebook.com/pages/.../...?sk=app_...";
    if (isset($_GET["start_session"]))
        die(header("Location:" . $page_url));

    if (!isset($_GET["sid"]))
        die(header("Location:?sid=" . session_id()));
    $sid = session_id();
    if (empty($sid) || $_GET["sid"] != $sid):
?>
   <script>
        top.window.location="?start_session=true";
    </script>
<?php
    endif;
    // END SAFARI SESSION FIX
?>

참고 : 이것은 페이스 북을 위해 만들어졌지만 실제로는 다른 유사한 상황에서 작동합니다.


2012 년 12 월 20 일 수정-서명 된 요청 유지 관리 :

위의 코드는 요청 게시 데이터를 유지하지 않으며, 서명 된 요청에 응용 프로그램이 의존하는 경우 signed_request를 느슨하게하면 다음 코드를 시도하십시오.

참고 : 이것은 여전히 ​​제대로 테스트되고 있으며 첫 번째 버전보다 안정성이 떨어질 수 있습니다. 귀하의 책임하에 사용 / 피드백 부탁드립니다.

( CBroe 에게 솔루션을 개선 할 수 있도록 올바른 방향으로 안내해 주셔서 감사합니다 )

// Start Session Fix
session_start();
$page_url = "http://www.facebook.com/pages/.../...?sk=app_...";
if (isset($_GET["start_session"]))
    die(header("Location:" . $page_url));
$sid = session_id();
if (!isset($_GET["sid"]))
{
    if(isset($_POST["signed_request"]))
       $_SESSION["signed_request"] = $_POST["signed_request"];
    die(header("Location:?sid=" . $sid));
}
if (empty($sid) || $_GET["sid"] != $sid)
    die('<script>top.window.location="?start_session=true";</script>');
// End Session Fix

감사합니다, 마법처럼 작동하고 너무 쉽게 기존 앱에서 구현하는 :-)입니다
SamiSalami

그래서 이것은 기본적으로 몇 가지 리디렉션과 함께 작동합니다.
Aaron Gibralter

1
@hugoderhungrige 환영합니다. 방금 새 버전을 추가했습니다. 앱에서 서명 된 요청을 유지해야하는 경우 언제든지 확인하십시오.
Diogo Raminhos

1
@CBroe 지적 해 주셔서 대단히 감사합니다! 두 번째 요청에 의해 사용자가 이미 세션을 시작했기 때문에 당신은 옳았습니다. "최악의 장님은보고 싶지 않은 사람"이라고 생각합니다.
Diogo Raminhos

1
@Whiteagle 1과 2를 보여주는 테스트 사례를 제공 할 수 있습니까?
Gajus

35

콘텐츠가로드되기 전에 사용자가 버튼을 클릭하도록 기꺼이했다고합니다. 내 솔루션은 버튼을 사용하여 새 브라우저 창을 여는 것이 었습니다. 이 창은 내 도메인의 쿠키를 설정하고 오프너를 새로 고친 다음 닫습니다.

따라서 기본 스크립트는 다음과 같습니다.

<?php if(count($_COOKIE) > 0): ?>
<!--Main Content Stuff-->
<?php else: ?>
<a href="/safari_cookie_fix.php" target="_blank">Click here to load content</a>
<?php endif ?>

그런 다음 safari_cookie_fix.php는 다음과 같습니다.

<?php
setcookie("safari_test", "1");
?>
<html>
    <head>
        <title>Safari Fix</title>
        <script type="text/javascript" src="/libraries/prototype.min.js"></script>
    </head>
    <body>
    <script type="text/javascript">
    document.observe('dom:loaded', function(){
        window.opener.location.reload();
        window.close();
    })
    </script>
    This window should close automatically
    </body>
</html>

나는 그런 것을 생각하고있었습니다. 완벽하게 작동합니다. 권한 대화 상자와 함께로드합니다. 감사!
vwoelm

이것도 Safari의 설정에서 작동하는 것으로 보이며 일단 공통 지식이 있으면 다른 "솔루션"과 마찬가지로 도끼가됩니다. 적절한 방법으로 사용하더라도 타사 쿠키가 이제 악마라는 것이 분명해지기 때문에 다른 솔루션을 찾고 있습니다.
LocalPCGuy

1
그러나이 솔루션은 저에게 효과적이었습니다. 팝업이 필요합니까? iframe을 Safari 페이지로 리디렉션하고 쿠키를 설정 한 다음 리디렉션 헤더를 사용하여 게임으로 다시 리디렉션 할 수 있습니까? 또는 사용자가 서버와 직접 연락 할 수있는 팝업이 필요합니까?
Anthony Hastings

이것은 잘 작동했다; 운 좋게도, 이것을 초기화하기 위해 버튼을 누르는 것은 내 응용 프로그램에서별로 중요하지 않았습니다.
18 분 46 초에 littlered

@LocalPCGuy 팝업이 차단되지 않도록하려면 사용자가 실제로 페이지를 클릭 / 상호 작용해야하기 때문에 다른 솔루션과 같이 도끼질 지 확신 할 수 없습니다. Safari가 제시 한이 솔루션은 효과가있는 것 같습니다. 광고주는 도메인 간 쿠키를 비밀리에 설정할 수 없으며, 내장 된 앱은 쿠키를 설정하기 전에 사용자와 상호 작용해야합니다.
Aaron Gibralter

15

.htaccess로 Safari를 속였습니다.

#http://www.w3.org/P3P/validator.html
<IfModule mod_headers.c>
Header set P3P "policyref=\"/w3c/p3p.xml\", CP=\"NOI DSP COR NID CUR ADM DEV OUR BUS\""
Header set Set-Cookie "test_cookie=1"
</IfModule>

그리고 그것은 나에게도 효과가 없었습니다. 내 모든 앱이 Safari에서 세션을 잃고 Facebook에서 리디렉션됩니다. 서둘러 해당 앱을 고 치면서 현재 솔루션을 찾고 있습니다. 계속 게시하겠습니다.

편집 (2012-04-06) : 애플은 분명히 5.1.4로 "고정"했습니다. Google 쿠키에 대한 반응이라고 확신합니다. "쿠키 정책을 시행 할 때 문제가 발생했습니다. Safari의"쿠키 차단 "환경 설정이" 타사 및 광고주로부터 "" http://support.apple.com/kb/HT5190


1
애플은 분명히 5.1.4로 "고정"했다. Google 쿠키에 대한 반응이라고 확신합니다. "쿠키 정책을 시행 할 때 문제가 발생했습니다. Safari의"쿠키 차단 "환경 설정이" 타사 및 광고주로부터 "" support.apple.com/kb/HT5190
vwoelm

1
따라서 vwoelm 의이 의견은 내가 찾은 답변과 가장 가깝습니다. 가장 먼저, 나는 애플이 허점을 확실히 닫았 음을 확인하고 싶었고 애플 지원 기사에 대한 언급은 바로 그 것입니다. 내 질문의 두 번째 부분은 여전히 ​​관련이 있습니다. 대안에 대한 옵션 범위는 무엇입니까? 분명히 세션 ID를 GET / POST 매개 변수로 인코딩 할 수 있지만 다른 옵션은 무엇입니까? 이 상황에서 로컬 스토리지가 작동합니까? 플래시 쿠키?
gs hurley 1

@ vwoelm : 그것은 실제로 내가 찾던 (하지만 기대하지 않은) 대답입니다. 이것을 의견 대신 답변에 넣으면 현상금을 지정합니다.
mscha

3
@gshurley GET / POST 매개 변수를 통해 세션 ID를 보내는 것이 유일한 옵션이라고 생각합니다. 안전하지 않지만 Facebook은 SSL없이 캔버스 앱을 제공하도록 강요합니다. 그리고 Facebook 앱 haha를 해킹하여 실제로 얻는 것은 무엇입니까? 우리는 Apple의 자비에 있으며 현재 잔인한 모드에 있습니다.
hekevintran

14

Ruby on Rails 컨트롤러에서 다음을 사용할 수 있습니다.

private

before_filter :safari_cookie_fix

def safari_cookie_fix
  user_agent = UserAgent.parse(request.user_agent) # Uses useragent gem!
  if user_agent.browser == 'Safari' # we apply the fix..
    return if session[:safari_cookie_fixed] # it is already fixed.. continue
    if params[:safari_cookie_fix].present? # we should be top window and able to set cookies.. so fix the issue :)
      session[:safari_cookie_fixed] = true
      redirect_to params[:return_to]
    else
      # Redirect the top frame to your server..
      render :text => "<script>alert('start redirect');top.window.location='?safari_cookie_fix=true&return_to=#{set_your_return_url}';</script>"
    end
  end
end

사파리 세션과 비슷한 문제가 있습니까?
Rails 초보자

당신은 우리가 iframe이 - D 내부에로 request.env [ 'HTTP_REFERER']에 set_your_return_url를 대체 할 수
뤽 Boissaye

이 솔루션을 시도했지만 유일한 문제는 부모 iframe URL로 돌아갈 수 없다는 것입니다. Rails에 부모 iframe의 URL을 얻는 방법이 있습니까? 감사합니다
idejuan

시간이 걸렸지 만 마침내 가장 쉬운 방법 (TMO)은 단순히 레일 앱의 리디렉션 URL에 쿼리 문자열 매개 변수로 추가하는 것입니다. 깨끗하고 깨끗합니다.
guyaloni

1
이 답변은 일반적인 보안 문제인 공개 리디렉터를 만듭니다. 위험한 코드는 redirect_to params[:return_to]입니다. 해당 매개 변수는 리디렉션 할 안전한 장소의 허용 목록과 비교하여 확인해야합니다. owasp.org/index.php/…
phylae

13

특정 상황에서는 window.postMessage ()를 사용하고 사용자 상호 작용을 제거하여 문제를 해결했습니다. 이것은 부모 창에서 어떻게 든 js를 실행할 수있는 경우에만 작동합니다. 도메인의 js를 포함 시키거나 소스에 직접 액세스 할 수있는 경우.

iframe (도메인 -b)에서 쿠키가 있는지 확인하고 쿠키가 설정되어 있지 않으면 부모 (도메인 -a)에게 postMessage를 보냅니다. 예를 들어;

if (navigator.userAgent.indexOf('Safari') != -1 && navigator.userAgent.indexOf('Chrome') == -1
    && document.cookie.indexOf("safari_cookie_fix") < 0) {
    window.parent.postMessage(JSON.stringify({ event: "safariCookieFix", data: {} }));
}

그런 다음 상위 창 (도메인 -a)에서 이벤트를 수신하십시오.

if (typeof window.addEventListener !== "undefined") {
    window.addEventListener("message", messageReceived, false);
}

function messageReceived (e) {
    var data;

    if (e.origin !== "http://www.domain-b.com") {
        return;
    }

    try {
        data = JSON.parse(e.data);
    }
    catch (err) {
        return;
    }

    if (typeof data !== "object" || typeof data.event !== "string" || typeof data.data === "undefined") {
        return;
    }

    if (data.event === "safariCookieFix") {
        window.location.href = e.origin + "/safari/cookiefix"; // Or whatever your url is
        return;
    }
}

마지막으로 서버 (http://www.domain-b.com/safari/cookiefix)에서 쿠키를 설정하고 사용자의 위치로 다시 리디렉션합니다. 아래 예제는 ASP.NET MVC를 사용하고 있습니다.

public class SafariController : Controller
{
    [HttpGet]
    public ActionResult CookieFix()
    {
        Response.Cookies.Add(new HttpCookie("safari_cookie_fix", "1"));

        return Redirect(Request.UrlReferrer != null ? Request.UrlReferrer.OriginalString : "http://www.domain-a.com/");
    }

}

postMessage 호출로 구문 오류가 발생하지 않습니까?
akousmata

필요는 두 번째 매개 변수를 추가 "*"하는 PostMessage구문 오류를 수정
마이클 Baldry에게

이 답변에 더 많은 투표를 해주기를 바랍니다. 실제로이 문제를 해결하는 가장 간단하고 올바른 방법입니다. 게시 해 주셔서 감사합니다!
AaronP

9

나는 같은 문제가 있었고 오늘 나에게 잘 맞는 수정 프로그램을 발견했다. 사용자 에이전트에 Safari쿠키가 설정 되어 있지 않으면 사용자를 OAuth 대화 상자로 리디렉션합니다.

<?php if ( ! count($_COOKIE) > 0 && strpos($_SERVER['HTTP_USER_AGENT'], 'Safari')) { ?>
<script type="text/javascript">
    window.top.location.href = 'https://www.facebook.com/dialog/oauth/?client_id=APP_ID&redirect_uri=MY_TAB_URL&scope=SCOPE';
</script>
<?php } ?>

인증 및 권한 요청 후 OAuth 대화 상자가 최상위 위치에서 내 URI로 리디렉션됩니다. 쿠키 설정이 가능합니다. 모든 캔버스 및 페이지 탭 앱에 대해 이미 다음 스크립트를 포함했습니다.

<script type="text/javascript">
    if (top.location.href==location.href) top.location.href = 'MY_TAB_URL';
</script>

따라서 유효한 쿠키가 이미 설정된 상태 에서 사용자가 Facebook 페이지 탭으로 다시 리디렉션 되고 서명 된 요청이 다시 게시됩니다.


이것에 대단한 일. Chrome에 사용자 에이전트 문자열에 Safari가 있기 때문에 사용자 에이전트에 Chrome이 없는지 확인하기 위해 사용자 에이전트 확인을 업데이트했습니다. 도메인 페이지로 리디렉션하고 필요한 쿠키 / 시작 세션을 설정 한 다음 apps.facebook.com에서 앱으로 다시 리디렉션하는 것이 매력처럼 작동했습니다. 어리석은 것처럼 보이지만 잘 작동합니다. 팁 주셔서 감사합니다 Sascha!
Mike

7

나는 마침내 Sascha가 제공 한 것과 비슷한 솔루션을 찾았지만 PHP에서 쿠키를 명시 적으로 설정했기 때문에 약간의 조정만으로도 약간의 조정이 이루어졌습니다.

// excecute this code if user has not authorized the application yet
// $facebook object must have been created before

$accessToken = $_COOKIE['access_token']

if ( empty($accessToken) && strpos($_SERVER['HTTP_USER_AGENT'], 'Safari') ) {

    $accessToken = $facebook->getAccessToken();
    $redirectUri = 'https://URL_WHERE_APP_IS_LOCATED?access_token=' . $accessToken;

} else {

    $redirectUri = 'https://apps.facebook.com/APP_NAMESPACE/';

}

// generate link to auth dialog
$linkToOauthDialog = $facebook->getLoginUrl(
    array(
        'scope'         =>  SCOPE_PARAMS,
        'redirect_uri'  =>  $redirectUri
    )
);

echo '<script>window.top.location.href="' . $linkToOauthDialog . '";</script>';

브라우저가 사파리 일 때 쿠키를 사용할 수 있는지 확인합니다. 다음 단계에서는 애플리케이션 도메인, 즉 위의 URL_WHERE_APP_IS_LOCATED로 제공된 URI에 있습니다.

if (isset($_GET['accessToken'])) {

    // cookie has a lifetime of only 10 seconds, so that after
    // authorization it will disappear
    setcookie("access_token", $_GET['accessToken'], 10); 

} else {

  // depending on your application specific requirements
  // redirect, call or execute authorization code again
  // with the cookie now set, this should return FB Graph results

}

따라서 응용 프로그램 도메인으로 리디렉션 한 후 쿠키가 명시 적으로 설정되고 사용자를 권한 부여 프로세스로 리디렉션합니다.

필자의 경우 (CakePHP를 사용하고 있지만 다른 MVC 프레임 워크와 잘 작동하므로) FB 인증이 다른 시간에 실행되는 로그인 작업을 다시 호출하고 있으며 이번에는 기존 쿠키로 인해 성공합니다.

앱을 한 번 승인 한 후에 Safari (5.1.6)에서 앱을 사용하는 데 더 이상 문제가 없었습니다.

그것이 누군가를 도울 수 있기를 바랍니다.


1
이것은 나를 위해 일했다!! 감사!! .. Safari 5.1.7에서이 문제가 발생했습니다. 이제 해결되었습니다!
Khalizar

5

iOS를 실행하는 기기에서이 문제가 발생했습니다. iframe을 사용하여 일반 웹 사이트에 내장 할 수있는 상점을 만들었습니다. 어쨌든, 모든 페이지로드에서 사용자는 새로운 sessionid를 얻었으며, 세션에 일부 값이 없기 때문에 프로세스의 절반이 중단되었습니다.

이 페이지에 제공된 솔루션 중 일부를 시도했지만 iPad에서 팝업이 잘 작동하지 않아 가장 투명한 솔루션이 필요했습니다.

리디렉션을 사용하여 해결했습니다. 내 사이트를 포함하는 웹 사이트는 먼저 사용자를 내 사이트로 리디렉션해야하므로 상단 프레임에는 URL이 내 사이트로 연결되어 쿠키를 설정하고 사용자를 내 사이트를 포함하는 웹 사이트의 적절한 페이지로 리디렉션합니다. URL을 통해.

PHP 코드 예

원격 웹 사이트는 사용자를

http://clientname.example.com/init.php?redir=http://www.domain.com/shop/frame

init.php

<?php
// set a cookie for a year
setcookie('initialized','1',time() + 3600 * 24 * 365, '/', '.domain.com', false, false);
header('location: ' . $_GET['redir']);
die;

사용자는 http://www.domain.com/shop/frame내 사이트가 임베드 된 위치에서 세션을 저장하고 쿠키를 먹습니다.

이것이 누군가를 돕기를 바랍니다.


3

ASP.NET MVC 4에서 수정 사항을 공유하겠습니다. PHP의 정답과 같은 주요 아이디어. 다음 코드는 스크립트 섹션 근처의 헤더에서 기본 레이아웃에 추가되었습니다.

@if (Request.Browser.Browser=="Safari")
{
    string pageUrl = Request.Url.GetLeftPart(UriPartial.Path);
    if (Request.Params["safarifix"] != null && Request.Params["safarifix"] == "doSafariFix")
    {
        Session["IsActiveSession"] = true;
        Response.Redirect(pageUrl);
        Response.End();
    }
        else if(Session["IsActiveSession"]==null)
    {
        <script>top.window.location = "?safarifix=doSafariFix";</script>
    }
}

3

이 솔루션은 가능한 경우에 적용됩니다.

iframe 컨텐츠 페이지가 iframe을 포함하는 페이지의 하위 도메인을 사용하는 경우 쿠키는 더 이상 차단되지 않습니다.


이것은 유용한 정보입니다-내가 찾던 것입니다. 대부분의 사람들이 도메인을 변경할 수 없다고 확신하지만 그게 내가 할 것입니다. 내가 포함하는 사이트에 내 도메인의 IP 및 VHost에 매핑되는 <mycompany>. <theircompany> .com 하위 도메인을 생성하고 해당 URL을 iFrame에서 사용하도록합니다. 복잡하지만 방탄해야합니다.
Elocution Safari

1
하위 도메인 서버와 일치하는 SSL 인증서가 필요하기 때문에 하위 도메인과 함께 https를 사용하는 경우 복잡해질 수 있습니다.
로저 할리 버튼

1

구글은 실제로 고양이를 가방에서 꺼냈다. 추적 쿠키에 액세스하는 데 잠시 동안 사용했습니다. 그것은 거의 즉시 Apple에 의해 수정되었습니다 = \

월스트리트 저널 게시물 원본


나는 구글에 대해 알고 있지만, 애플이 실제로 이것을 "고정"하고 인터넷의 절반을 깨는 것에 대해 아무것도 보지 못했다. 그것에 대한 자세한 내용이 있습니까?
mscha

1

내가 사용하는 코드는 다음과 같습니다. 내 사이트에서 쿠키를 설정하면 쿠키가 그때부터 iframe에서 마술처럼 작동한다는 것을 알았습니다.

http://developsocialapps.com/foundations-of-a-facebook-app-framework/

 if (isset($_GET['setdefaultcookie'])) {
        // top level page, set default cookie then redirect back to canvas page
        setcookie ('default',"1",0,"/");
        $url = substr($_SERVER['REQUEST_URI'],strrpos($_SERVER['REQUEST_URI'],"/")+1);
        $url = str_replace("setdefaultcookie","defaultcookieset",$url);
        $url = $facebookapp->getCanvasUrl($url);
        echo "<html>\n<body>\n<script>\ntop.location.href='".$url."';\n</script></body></html>";
        exit();
    } else if ((!isset($_COOKIE['default'])) && (!isset($_GET['defaultcookieset']))) {
        // no default cookie, so we need to redirect to top level and set
        $url = $_SERVER['REQUEST_URI'];
        if (strpos($url,"?") === false) $url .= "?";
        else $url .= "&";
        $url .= "setdefaultcookie=1";
        echo "<html>\n<body>\n<script>\ntop.location.href='".$url."';\n</script></body></html>";
        exit();
    }

1

PHP에서 다른 사람들이 게시 한 내용의 약간 더 간단한 버전 :

if (!isset($_COOKIE, $_COOKIE['PHPSESSID'])) {
    print '<script>top.window.location="https://example.com/?start_session=true";</script>';
    exit();
}

if (isset($_GET['start_session'])) {
    header("Location: https://apps.facebook.com/YOUR_APP_ID/");
    exit();
}

1

나는 Allan이라는 사람에게 감사의 말을 전한다. ( http://www.allannienhuis.com/archives/2013/11/03/blocked-3rd-party-session-cookies-in-iframes/ )

그의 해결책은 간단하고 이해하기 쉽다.

iframe 컨텐츠 서버 (도메인 2) 에서 다음을 포함하는 루트 도메인 레벨에 startsession.php 라는 파일을 추가하십시오 .

<?php
// startsession.php
session_start();
$_SESSION['ensure_session'] = true;
die(header('location: '.$_GET['return']));

이제 iframe (domain1)이 포함 된 최상위 웹 사이트에서 iframe이 포함 된 페이지에 대한 호출은 다음과 같아야합니다.

<a href="https://domain2/startsession.php?return=http://domain1/pageWithiFrame.html">page with iFrame</a>

그리고 그게 다야! 단순 :)

이것이 작동하는 이유는 브라우저를 타사 URL로 보내서 iframe 내에서 콘텐츠를 표시하기 전에 브라우저가이를 신뢰하도록 지시하기 때문입니다.


0

Whiteagle의 트릭을 수정하여 (signed_request 매개 변수를 링크에 추가) 사용했으며 사파리에서는 정상적으로 작동했지만 IE는이 경우 페이지를 계속 새로 고칩니다. 사파리 및 인터넷 익스플로러에 대한 나의 해결책은 다음과 같습니다.

$fbapplink = 'https://apps.facebook.com/[appnamespace]/';
$isms = stripos($_SERVER['HTTP_USER_AGENT'], 'msie') !== false;

// safari fix
if(! $isms  && !isset($_SESSION['signed_request'])) {

    if (isset($_GET["start_session"])) {
        $_SESSION['signed_request'] = $_GET['signed_request'];
        die(header("Location:" . $fbapplink ));

    }
    if (!isset($_GET["sid"])) {
        die(header("Location:?sid=" . session_id() . '&signed_request='.$_REQUEST['signed_request']));
    }
    $sid = session_id();
    if (empty($sid) || $_GET["sid"] != $sid) {
    ?>
    <script>
        top.window.location="?start_session=true";
    </script>
    <?php
    exit;
    }
}

// IE fix
header('P3P: CP="CAO PSA OUR"');
header('P3P: CP="HONK"');


.. later in the code

$sr = $_REQUEST['signed_request'];
if($sr) {
        $_SESSION['signed_request'] = $sr;
} else {
        $sr = $_SESSION['signed_request'];
}

0

나는 또한이 문제로 고통 받고 있지만 마침내 해결책을 얻었습니다. 처음에는 작은 팝업처럼 브라우저에서 iframe URL을 직접로드 한 다음 iframe 내부의 세션 값에만 액세스하십시오.


-1

최근에 Safari에서도 같은 문제가 발생했습니다. 내가 알아 낸 솔루션은 로컬 스토리지 HTML5 API를 기반으로합니다. 로컬 저장소를 사용하면 쿠키를 에뮬레이션 할 수 있습니다.

자세한 내용은 내 블로그 게시물입니다 : http://log.scalemotion.com/2012/10/how-to-trick-safari-and-set-3rd-party.html



-2

$_SESSION변수를 모두 제거하기로 결정 하고 세션을 모방하기 위해 memcache 주위에 래퍼를 작성했습니다.

https://github.com/manpreetssethi/utils/blob/master/Session_manager.php를 확인 하십시오

사용 사례 : 사용자가 앱을 방문하고 Session_manager를 사용하여 서명 된 요청을 저장하는 순간 캐시에 있기 때문에 어느 페이지에서나 액세스 할 수 있습니다.

참고 : 페이지를 다시로드 할 때마다 session_id가 재설정되므로 Safari에서 비공개로 탐색 할 때는 작동하지 않습니다. (스투 피드 사파리)


-9

p3p policy..i로 헤더를 추가 하여이 문제를 해결할 수 있습니다 .i는 사파리에서 동일한 문제가 있었으므로 파일 위에 헤더를 추가 한 후에도 문제가 해결되었습니다.

<?php
header('P3P:CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"');
?>

이것이 아직도 최신 버전의 Safari에서 작동합니까? 우리는 IE를 위해 수년간 P3P 헤더를 가지고 있었지만 Safari는 여전히 고장났습니다.
mscha

2
모든 쿠키를 지우고 다시 테스트하십시오. 브라우저에 iframed 사이트에 대한 쿠키가 이미 있으면 문제가 표시되지 않습니다.
rmarscher

흠, P3P 헤더도 작동하지 않습니다. 그들은 여전히 ​​IE에서 작동합니다!
세스 브라운

2
이것은 작동했습니다. 그러나 최신 버전의 Safari는 그렇지 않습니다. 캐시를 비우고 다시 시도하십시오 ....
chantheman

2
이 솔루션이 작동한다고 말하고 싶습니다. 사파리에서 모든 쿠키를 삭제하십시오. 그리고 이것을 시도하십시오.
dnuske
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.