Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Вход в сеанс PHP после переключения на SSL

Автор вопроса: Ollie2893Ответов: 2

Я решил потратить несколько часов на попытки защитить свой сайт с помощью SSL. Сервер работает нормально, но мой PHP $_SESSION столкнулся с проблемой. Я понимаю проблему передачи идентификаторов сеанса между HTTP и HTTPS, но здесь этого не происходит (я думаю). Запутанная последовательность сеансов выглядит примерно так:

логин.html:

<form action="https://www.mydomain.com/login.php">

логин.php:

if login details correct {
   session_set_cookie_params(3600,'/','mydomain.com',true);
   session_start();
   $_SESSION['...
   session_commmit

На этом этапе login.js (который управляет диалоговым окном в стиле AJAX) будет перенаправлять на http://www.mydomain.com/desktop.html. Код JS, поддерживающий HTML, затем срабатывает

$.ajax({ url: "https://www.mydomain.com/lib/mySQL/mySQL.php", ... });

mySQL.php:

if (!isset($_COOKIE['PHPSESSID'])) {
   throw wobbly

До того, как я перешел на HTTPS, эта последовательность отлично работала во всех браузерах; с HTTPS он шатается во всех браузерах :( Я могу подтвердить (посмотрев на данные cookie), что Firefox записывает cookie следующим образом:

mydomain.com
Name: PHPSESSID
Content: gobbledygook
Domain: .mydomain.com
Path: /
Send For: Encrypyed connections only.
Expires:  in 1hr.

Все выглядит как в книге. Есть ли у вас какие-либо предложения относительно того, что происходит?

Спасибо.

PS: я не использовал session_set_cookie_params до того, как наткнулся на сообщение на SO при исследовании этой проблемы, предполагая, что мне следует это сделать. То есть до того, как я установил secure=true, Firefox "отправлял" любые подключения, и это тоже не сработало.

РЕДАКТИРОВАТЬ: я наблюдаю еще одну деталь. Я ожидаю, что на панели "Сеть" в Firebug мои запросы AJAX будут отображаться как "POST https://www.mydomain.com/lib/mySQL/mySQL.php", и я смогу выбрать райдер POST и посмотреть, что получилось. Я не понимаю этого для неудачного запроса. Как ни странно, Firebug отображает "ВАРИАНТЫ https://www.mydomain.com/lib/mySQL/mySQL.php" красным цветом и без POST-райдера.

javascriptsslphphttps

Ответы

Ответ 1 · Lekensteyn

Этот заголовок OPTIONS отправляется в качестве проверки, разрешены ли Межсайтовые HTTP-запросы.

https и http - это разные сайты, на которые распространяется Политика единого происхождения. По ссылке выше все понятно.

И еще одна статья о кросс-сайтовом XMLHTTPRequest (кеш Google)

Ответ 2 · Ollie2893

Хорошо, Лекенштейн направил меня в правильном направлении, хотя его ссылки более фаталистичны - с точки зрения программиста на стороне клиента - чем нужно: в мире AJAX ответом на эту конкретную загадку является аббревиатура JSONP. И если вы окажетесь в том же рассоле, то вот тривиальное решение jQuery:

В вашем вызове $.ajax: -

(1)  Set "dataType" to "jsonp"
(2)  Set "type" to "GET".  (The rest of my app is defaulted to POST.  The jQuery code  suggests that POST is supported.  But when I try POST, I get another "Permission denied" from Firefox' OPTIONS header.)
(3)  Where my PHP script would formerly reply

        echo json_encode($data);

     it must now go

        echo $_REQUEST['callback'].'('.json_encode($data).')'

     which effectively formats a function call with $data being the one and only parameter to the function.
(4)  Set "url" to "https://www.mydomain.com/lib/mySQL/mySQL.php"

Работает удовольствие. Формат GET немного уродлив, но эй-хо. Я оставил файл cookie PHPSESSID со значением "secure=true", поэтому он должен передаваться только через зашифрованные рукопожатия.

PS: Apols за ужасное форматирование. Однажды я обязательно выясню, как лучше форматировать свои сообщения на этом форуме.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы