Як Facebook встановлює міждоменні файли cookie для iFrames на полотняних сторінках?


75

Я переглядав документацію Facebook, читаючи про програми для полотна, і натрапив на приклад програми: http://developers.facebook.com/docs/samples/canvas . Однак, читаючи їх приклад, я дуже заплутався щодо використання ними файлів cookie у програмі iframe.

Трохи попередньої історії ...

Я вже погрався з використанням фреймів для вбудованих віджетів (не пов'язаних з Facebook), і виявив, що деякі браузери (Chrome, Safari тощо) мають жорстку політику щодо файлів cookie і не дозволяють встановлювати міждоменні файли cookie у фреймах (Firefox, з іншого боку, дозволяє iframes встановлювати міждоменні файли cookie в iframes). Наприклад, якщо foo.com має iframe із src="http://bar.com/widget"віджетом iframe, він не зможе встановити файли cookie для bar.com і, отже, матиме проблеми зі збереженням стану в iframe: bar.com буде інтерпретувати кожен запит (включаючи запити ajax) від віджет як новий запит без встановленого сеансу. Я боровся і знайшов спосіб обійти це, використовуючи JSONP і javascript, щоб замість цього встановити файли cookie для foo.com ...

... і так?

Ну, я розглядав приклад програми canvas iframe Facebook і помітив, що їх додаток (розміщений на runwithfriends.appspot.com) може встановити файл cookie uз поточним ідентифікатором користувача разом із кількома іншими параметрами для runwithfriends. домен appspot.com. Він надсилає цей файл cookie з кожним запитом ... і він працює як у Chrome, так і у Firefox! WTF? Як Facebook обходить обмеження міждоменних файлів cookie в Chrome?

(Я вже знаю відповідь, але я вважав, що це може бути корисно для тих, хто намагається зрозуміти те саме - відповідь я розміщу нижче).


1
Оновлення: останні версії деяких браузерів (Safari v6.x + на OS X, Safari на iOS 6+, і я припускаю, що Chrome та FF найближчим часом) більше не дозволяють встановлювати міждоменні файли cookie, навіть на post-to-iframe запитів.
Аарон Гібралтер

Відповіді:


80

Отже, iFrame насправді не встановлює uфайл cookie для домену runwithfriends.appspot.com. Що Facebook робить, це створює форму <form action="runwithfriends.appspot.com/..." target="name_of_iframe" method="POST">та використовує javascript для надсилання форми при завантаженні сторінки. Оскільки метою форми є iframe, вона не перезавантажує сторінку ... вона просто завантажує iframe з відповіддю POST. Очевидно, навіть Chrome та інші браузери із суворою політикою щодо файлів cookie встановлюють файли cookie для міждоменних запитів, якщо це запити POST ...


2
Я створив доказ концепції програми sinatra,
Аарон Гібралтер

2
@LShetty - вибачте, я не впевнений, що розумію, що ви маєте на увазі ... чистий Javascript? Частина демо-версії Ruby виконує роль веб-сервера ... ви маєте на увазі, що хочете побачити демонстраційну версію, написану в Node.js?
Аарон Гібралтер

6
@Seth Я не перевіряв давно, але остання версія Safari (v6.0 / iOS6, і я припускаю, незабаром Chrome і FF) більше не дозволяє цей фокус: файли cookie не встановлюються на post-to -іфреймові запити. Мені довелося б вивчити, як Facebook обробляє це для нових браузерів. На даний момент localStorage здається хорошим альтернативним методом.
Аарон Гібралтер

1
Дозвольте мені просто сказати вам, що якщо у вас є "вимкнути сторонні файли cookie", цей спосіб обходу iframe перестане працювати, я вважаю.
Мігель

3
Тож чи є спосіб встановити сторонні файли cookie сьогодні, коли в браузері встановлено блокування файлів cookie сторонніх розробників? Або хтось може підтвердити, що сьогодні це ніяк не можливо?
навірам
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.