Jest to więc kolejna zemsta na pytanie „jak sprawić, by pliki cookie innych firm działały w Safari”, ale pytam ponownie, ponieważ myślę, że pole gry się zmieniło, być może po lutym 2012 r. Jedna ze standardowych sztuczek, aby uzyskać trzecią pozycję pliki cookie firm w Safari wyglądały następująco: użyj javascript do POST w ukrytej ramce iframe. To (kiedyś) oszukiwało Safari, by myślało, że użytkownik wszedł w interakcję z treściami stron trzecich, a więc zezwala na ustawienie plików cookie.
Myślę, że ta luka została zamknięta po łagodnym skandalu, w którym ujawniono, że Google używa tej sztuczki w swoich reklamach. Przynajmniej podczas korzystania z tej sztuczki nie byłem w stanie ustawić plików cookie w Safari. Odkryłem kilka przypadkowych wpisów internetowych, w których twierdzono, że Apple pracuje nad zamknięciem luki, ale nie znalazłem żadnego oficjalnego słowa.
Jako rozwiązanie awaryjne próbowałem nawet przeprojektować główną ramkę strony trzeciej, tak aby trzeba było kliknąć przycisk, zanim zawartość się załaduje, ale nawet ten poziom bezpośredniej interakcji nie był wystarczający, aby stopić zimne serce Safari.
Czy ktoś wie na pewno, czy Safari rzeczywiście zamknęło tę lukę? Jeśli tak, czy istnieją inne obejścia (inne niż ręczne uwzględnianie identyfikatora sesji w każdym żądaniu)?
źródło
Odpowiedzi:
Chciałem tylko zostawić tutaj proste działające rozwiązanie, które nie wymaga interakcji użytkownika .
Jak napisałem w poście, który zrobiłem :
W zasadzie wszystko, co musisz zrobić, to załadować swoją stronę na top.location, utworzyć sesję i przekierować ją z powrotem na Facebook.
Dodaj ten kod u góry
index.php
i ustaw$page_url
na końcowej karcie / adresie URL aplikacji, a zobaczysz, że aplikacja będzie działać bez żadnego problemu.Uwaga: to zostało stworzone dla Facebooka, ale faktycznie działałoby w innych podobnych sytuacjach.
Edycja 20 grudnia 2012 - Utrzymanie podpisanego wniosku:
Powyższy kod nie obsługuje danych wysłania żądań i straciłbyś podpisane_żądanie, jeśli Twoja aplikacja opiera się na podpisanym żądaniu, możesz wypróbować następujący kod:
Uwaga: to jest nadal poprawnie testowane i może być mniej stabilne niż pierwsza wersja. Używaj na własne ryzyko / Opinie są mile widziane.
(Podziękowania dla CBroe za skierowanie mnie we właściwym kierunku, co pozwoliło ulepszyć rozwiązanie)
źródło
Powiedziałeś, że chcesz, aby użytkownicy klikali przycisk przed załadowaniem treści. Moim rozwiązaniem było otwarcie nowego okna przeglądarki za pomocą przycisku. To okno ustawia plik cookie dla mojej domeny, odświeża otwieracz, a następnie zamyka się.
Twój główny skrypt mógłby więc wyglądać następująco:
Następnie safari_cookie_fix.php wygląda następująco:
źródło
Oszukałem Safari z .htaccess:
I dla mnie też przestało działać. Wszystkie moje aplikacje tracą sesję w Safari i są przekierowywane z Facebooka. Ponieważ spieszę się, aby naprawić te aplikacje, obecnie szukam rozwiązania. Będę was informować.
Edycja (2012-04-06): Najwyraźniej Apple „naprawiło” to w wersji 5.1.4. Jestem pewien, że jest to reakcja na Google-thing: „Wystąpił problem z egzekwowaniem polityki plików cookie. Witryny stron trzecich mogą ustawiać pliki cookie, jeśli preferencja„ Blokuj pliki cookie ”w Safari została ustawiona na ustawienie domyślne„ Od stron trzecich i reklamodawców ”. Http://support.apple.com/kb/HT5190
źródło
W swoim kontrolerze Ruby on Rails możesz użyć:
źródło
redirect_to params[:return_to]
. Ten parametr należy sprawdzić na białej liście bezpiecznych miejsc do przekierowania. Zobacz owasp.org/index.php/…W mojej konkretnej sytuacji rozwiązałem problem, używając metody window.postMessage () i eliminując wszelkie interakcje użytkownika. Zauważ, że zadziała to tylko wtedy, gdy możesz w jakiś sposób wykonać js w oknie nadrzędnym. Albo przez dołączenie js ze swojej domeny, albo jeśli masz bezpośredni dostęp do źródła.
W ramce iframe (domena-b) sprawdzam obecność pliku cookie i jeśli nie jest ustawiony, wyślę wiadomość postMessage do nadrzędnego (domena-a). Na przykład;
Następnie w oknie nadrzędnym (domena-a) nasłuchuj zdarzenia.
Wreszcie na swoim serwerze (http://www.domain-b.com/safari/cookiefix) ustawiasz plik cookie i przekierowujesz z powrotem do miejsca, z którego przyszedł użytkownik. Poniższy przykład wykorzystuje ASP.NET MVC
źródło
"*"
abyPostMessage
naprawić błąd składniMiałem ten sam problem i dziś znalazłem poprawkę, która działa dobrze. Jeśli klient użytkownika zawiera
Safari
i nie są ustawione żadne pliki cookie, przekierowuję użytkownika do okna dialogowego OAuth:Po uwierzytelnieniu i zapytaniu o uprawnienia okno dialogowe OAuth przekieruje do mojego URI w górnej lokalizacji. Możliwe jest więc ustawienie plików cookie. Do wszystkich naszych aplikacji na kanwie i kartach strony dołączyłem już następujący skrypt:
W ten sposób użytkownik zostanie ponownie przekierowany do zakładki strony na Facebooku z ustawionym już ważnym plikiem cookie, a podpisane żądanie zostanie ponownie wysłane.
źródło
W końcu zdecydowałem się na rozwiązanie podobne do tego, które dostarczyła Sascha, jednak z niewielkimi zmianami, ponieważ ustawiam pliki cookie bezpośrednio w PHP:
W ten sposób sprawdza, czy plik cookie jest dostępny, gdy przeglądarka to safari. W następnym kroku jesteśmy w domenie aplikacji, a mianowicie w URI podanym powyżej jako URL_WHERE_APP_IS_LOCATED.
Tak więc po przekierowaniu do domeny aplikacji, plik cookie jest ustawiany jawnie, a ja przekierowuję użytkownika do procesu autoryzacji.
W moim przypadku (ponieważ używam CakePHP, ale powinno działać dobrze z każdym innym frameworkiem MVC) ponownie wywołuję akcję logowania, w której autoryzacja FB jest wykonywana innym razem i tym razem kończy się sukcesem z powodu istniejącego pliku cookie.
Po jednorazowym autoryzowaniu aplikacji nie miałem już problemów z używaniem aplikacji w Safari (5.1.6)
Mam nadzieję, że to może pomóc każdemu.
źródło
Miałem ten problem na urządzeniach z systemem iOS. Stworzyłem sklep, który można osadzić w normalnej witrynie za pomocą elementu iframe. W jakiś sposób przy każdym ładowaniu strony użytkownik otrzymywał nowy identyfikator sesji, co powodowało, że użytkownicy utknęli w połowie procesu, ponieważ niektóre wartości nie były obecne w sesji.
Wypróbowałem kilka rozwiązań podanych na tej stronie, ale wyskakujące okienka nie działają zbyt dobrze na iPadzie i potrzebowałem najbardziej przejrzystego rozwiązania.
Rozwiązałem to za pomocą przekierowania. Witryna, która osadza moją witrynę, musi najpierw przekierować użytkownika do mojej witryny, więc na górę ramka zawiera adres URL do mojej witryny, gdzie ustawiam plik cookie i przekierowuję użytkownika na odpowiednią stronę w witrynie, która osadza moją witrynę, czyli jest przekazywana w adresie URL.
Przykładowy kod PHP
Zdalna witryna przekierowuje użytkownika do
init.php
Użytkownik trafia na miejsce, w
http://www.domain.com/shop/frame
którym osadzona jest moja witryna, zapisuje sesje tak, jak powinien i zjada pliki cookie.Mam nadzieję, że to komuś pomoże.
źródło
Pozwólcie, że podzielę się moją poprawką w ASP.NET MVC 4. Główną ideą jest poprawna odpowiedź dla PHP. Kolejny kod dodany w głównym Układzie w nagłówku obok sekcji skryptów:
źródło
To rozwiązanie ma zastosowanie w niektórych przypadkach - jeśli to możliwe:
Jeśli strona z treścią iframe korzysta z subdomeny strony zawierającej iframe, plik cookie nie jest już blokowany.
źródło
Google faktycznie wypuścił kota z torby na tym. Używali go przez jakiś czas, aby uzyskać dostęp do śledzących plików cookie. Zostało to prawie natychmiast naprawione przez Apple = \
oryginalny post w Wall Street Journal
źródło
Oto kod, którego używam. Zauważyłem, że jeśli ustawię jakikolwiek plik cookie z mojej witryny, wówczas pliki cookie będą magicznie działać w elemencie iframe.
http://developsocialapps.com/foundations-of-a-facebook-app-framework/
źródło
Nieco prostsza wersja w PHP tego, co opublikowali inni:
źródło
Znalazłem idealną odpowiedź na to pytanie, wszystko dzięki facetowi o imieniu Allan, który zasługuje na wszystkie pochwały. ( http://www.allannienhuis.com/archives/2013/11/03/blocked-3rd-party-session-cookies-in-iframes/ )
Jego rozwiązanie jest proste i łatwe do zrozumienia.
Na serwerze zawartości iframe (domena 2) dodaj plik o nazwie startedession.php na poziomie domeny głównej, który zawiera:
Teraz w witrynie najwyższego poziomu zawierającej element iframe (domena1) wywołanie strony zawierającej element iframe powinno wyglądać następująco:
I to wszystko! Simples :)
Powodem tego jest to, że kierujesz przeglądarkę na adres URL strony trzeciej, a tym samym mówisz jej, aby ufała jej przed wyświetleniem zawartości z niej w ramce iframe.
źródło
Użyłem zmodyfikowanej (dodałem parametr signed_request do linku) sztuczki Whiteagle i działało dobrze na safari, ale IE w tym przypadku stale odświeża stronę. Więc moje rozwiązanie dla Safari i Internet Explorera to:
źródło
Również cierpiałem z powodu tego problemu, ale w końcu znalazłem rozwiązanie. Początkowo bezpośrednio ładuj adres URL elementu iframe w przeglądarce, jak małe wyskakujące okienko, a następnie uzyskuj dostęp tylko do wartości sesji wewnątrz elementu iframe.
źródło
Niedawno napotkałem ten sam problem w Safari. Rozwiązanie, które wymyśliłem, jest oparte na interfejsie API HTML5 lokalnego magazynu. Korzystając z Local Storage, możesz emulować pliki cookie.
Oto mój post na blogu ze szczegółami: http://log.scalemotion.com/2012/10/how-to-trick-safari-and-set-3rd-party.html
źródło
Postanowiłem pozbyć się tej
$_SESSION
zmiennej razem i napisałem otokę wokół memcache, aby naśladować sesję.Sprawdź https://github.com/manpreetssethi/utils/blob/master/Session_manager.php
Przykład zastosowania: w momencie, gdy użytkownik wyląduje w aplikacji, zapisz podpisane żądanie za pomocą menedżera sesji, a ponieważ znajduje się w pamięci podręcznej, możesz odtąd uzyskać do niego dostęp na dowolnej stronie.
Uwaga: to nie zadziała podczas przeglądania prywatnego w Safari, ponieważ session_id resetuje się za każdym razem, gdy strona jest ponownie ładowana. (Głupie safari)
źródło
Możesz rozwiązać ten problem, dodając nagłówek jako zasady p3p ... miałem ten sam problem na safari, więc dodanie nagłówka na górze plików rozwiązało mój problem.
źródło