Php session & iframe

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

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

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

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

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

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

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

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

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

Ответ 1

Я считаю, что эта статья будет полезна: 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-адрес, где я использую параметр "код" GET, который дает мне, чтобы получить токен доступа, который я могу сохранить для последующего использования. (Сохранение в DB и для сеанса.) Если я покончу с этим, я перенаправляю пользователя в свое приложение для страниц, где все будет работать.
  • каждый должен быть счастлив на этом этапе.

НО здесь идет поиск.

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

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

Важно отметить, что этот код работает на вкладке страницы внутри 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.

Ответ 2

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

echo "Session ID: ".session_id();

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