Я прочитал пару связанных сообщений здесь, но, похоже, не могу заставить мой скрипт работать по назначению.
У меня есть страница входа в систему, в которой пользователь входит в систему. Если пароль совпадает, скрипт записывает два значения в переменную $_SESSION
: ['loggedin']='yes'
и ['loginname']="username"
.
После успешного входа в систему пользователь переходит на другую страницу с двумя iframe.
Один iframe использует внешний контент и не требует аутентификации (удаление этого iframe со страницы ничего не меняет).
Другой iframe использует динамически сгенерированный контент из того же домена и проверяет, все ли существуют переменные сеанса.
Одна из функций обновляет содержимое этого динамически генерируемого iframe.
Как только это будет сделано, переменные сеанса будут потеряны. На самом деле сама сессия больше не существует.
У меня есть session_start();
на каждой странице, которая используется в связи с этим скриптом.
Любая помощь будет принята с благодарностью.
Я считаю, что эта статья будет полезна: http://www.how2guru.com/archives/php-session-problem-while-using-iframe/
Короткий ответ: в iframe начните сеанс следующим образом:
header('P3P: CP="CAO PSA OUR"'); session_start();
РЕДАКТИРОВАТЬ:
Думаю, я должен обновить этот ответ, так как я наткнулся на что-то интересное, о котором все должны знать.
Этот взломанный заголовок p3p не работает на сафари .
Ниже я описываю свой логин и как я решил эту проблему.
Мой поток входа выглядит так (приложение страницы):
НО здесь идет добыча.
Если пользователь использует сафари и пытается открыть это приложение, когда сеансы уже были уничтожены (через несколько дней для примера), произойдет следующее:
Важно отметить, что этот код работает на вкладке страницы внутри iframe.
Поэтому для большинства пользователей код будет работать, из-за взлома заголовка p3p.
Но для пользователей сафари это не будет.
Safari не заботится о данном заголовке, он отказывается сохранять сеанс, поэтому пользователь входит в приложение, все работает нормально, но вызовы ajax не будут работать, поскольку у них не будет сеанса работайте с.
Обходной путь:
Довольно просто на самом деле – хотя и не слишком изящный, но эй, он работает. -: Я проверяю, является ли клиентский браузер сафари или нет, и если это так, я перенаправляю к настраиваемому URL-адресу, где я запускаю сеанс – вне фреймбэка iframe, а затем перенаправляю обратно в приложение.
Это создаст файл cookie без проблем, поэтому сеансы будут доступны.
Здесь есть код:
Проверка сессии (кредит идет этому парню)
if (strpos($_SERVER['HTTP_USER_AGENT'], 'Safari') && !strpos($_SERVER['HTTP_USER_AGENT'], 'Chrome')) { if (count($_COOKIE) === 0) { echo '<script> top.location = "http://www.domain.com/setcookie.php"; </script>'; } }
настройка сеанса (setcookie.php)
header('P3P: CP="CAO PSA OUR"'); session_start(); $_SESSION = array(); echo '<script> top.location = "http://back-to-the-facebook-app.com"; </script>';
Надеюсь, этот дополнительный трюк поможет кому-то.
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 .
Добавьте следующие кадры в каждую из своих страниц:
echo "Session ID: ".session_id();
Это должно выводить идентификатор сеанса на каждой странице. Возможно, что новый сеанс может быть сгенерирован на одном из фреймов, проверив вышеизложенное, вы можете управлять этой возможностью.