php сессия и iframe - PullRequest
       4

php сессия и iframe

8 голосов
/ 22 января 2012

Я прочитал пару похожих постов здесь, но не могу заставить мой скрипт работать так, как задумано.

У меня есть страница входа, где пользователь входит в систему. Если пароль совпадает, сценарий записывает два значения в переменную $_SESSION: ['loggedin']='yes' и ['loginname']="username".

После успешного входа пользователь переходит на другую страницу, на которой есть 2 фрейма.

Один iframe использует внешний контент и не требует аутентификации (удаление этого iframe со страницы ничего не меняет).

Другой iframe использует динамически генерируемый контент из того же домена и проверяет, есть ли там переменные сеанса.

Одна из функций обновляет содержимое этого динамически генерируемого iframe.

Как только это будет сделано, переменные сеанса будут потеряны. Фактически, сам сеанс больше не существует.

У меня есть session_start(); на каждой странице, которая используется в связи с этим сценарием.

Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

16 голосов
/ 25 июля 2012

Я верю, что эта статья будет полезна: http://www.how2guru.com/archives/php-session-problem-while-using-iframe/

Краткий ответ: в iframe запустите сессию так:

header('P3P: CP="CAO PSA OUR"');
session_start();

EDIT:

Думаю, мне следует обновить этот ответ, поскольку я наткнулся на что-то интересное, о чем все должны знать.

Этот хак заголовка p3p не работает в сафари .

Ниже я опишу поток входа в систему и то, как я решил эту проблему.

Мой поток входа выглядит так (страница приложения):

  • проверка наличия сеанса у текущего пользователя,
  • , если нет, перенаправить на URL входа в систему (генерируется PHP SDK),
  • диалоговое окно входа перенаправляет обратно на URL, где я использую параметр «code» GET, который дает мне facebook, чтобы получить токен доступа, который я могу сохранить для дальнейшего использования. (Сохранение в БД и в сеансе.) Если я закончу с этим, я перенаправлю пользователя в свое приложение страницы, где все будет работать.
  • все должны быть счастливы в этот момент.

НО вот идет гатча.

Если пользователь использует сафари и пытается открыть это приложение, когда сеансы уже уничтожены (например, через несколько дней), произойдет следующее:

  • Код проверяет сеанс: он находит идентификатор пользователя (метод PHP SDK getUser ()), поэтому сначала я проверяю запись в базе данных.
  • Поскольку пользователь вошел в систему ранее, у него есть запись в базе данных, поэтому я просто беру ее и сохраняю в сеансе, чтобы будущие вызовы AJAX имели всю необходимую информацию.

Здесь важно отметить, что этот код запускается на вкладке страницы в iframe.

Так что для большинства пользователей код будет работать из-за взлома заголовка p3p.

Но для пользователей сафари это не так.

Safari не заботится о заданном заголовке, он отказывается сохранять сеанс, поэтому пользователь входит в приложение, все, кажется, работает нормально, но вызовы ajax не будут работать, так как они не будут иметь любой сеанс для работы.

Обходной путь:

Довольно просто на самом деле - хотя и не слишком элегантно, но эй, это работает. -: я проверяю, является ли браузер клиента сафари или нет, и если это так, я перенаправляю на пользовательский URL-адрес, с которого начинаю сеанс - вне фрейма facebook, - а затем перенаправляю обратно в приложение.

Это создаст куки без проблем, поэтому сессии будут доступны.

Здесь есть код:

Надеюсь, этот дополнительный прием кому-нибудь поможет.

EDIT2

Я еще не пробовал это, но вместо добавления заголовка P3P, вы можете просто добавить следующие строки в ваш .htaccess:

 <IfModule mod_headers.c>
   Header set P3P "policyref=\"/w3c/p3p.xml\", CP=\"IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT\""
 </IfModule>

С комментариями:

# ------------------------------------------------------------------------------
# | Cookie setting from iframes                                                |
# ------------------------------------------------------------------------------

# Allow cookies to be set from iframes in IE.
# http://msdn.microsoft.com/en-us/library/ms537343.aspx
# http://www.w3.org/TR/2000/CR-P3P-20001215/

<IfModule mod_headers.c>
  Header set P3P "policyref=\"/w3c/p3p.xml\", CP=\"IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT\""
</IfModule>

Вся заслуга в этом .htacces-коде для парней, стоящих за проектом Yeoman .

4 голосов
/ 22 января 2012

Добавьте следующее к каждой из ваших страниц во фреймах:

echo "Session ID: ".session_id();

Это должно вывести идентификатор сессии на каждой странице. Возможно, новый сеанс может быть сгенерирован на одном из фреймов, проверив вышеизложенное, вы можете исключить эту возможность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...