2014-07-23 65 views
0

首先,關於該項目的PHP會話不被想起

這個問題在一個網站我在PHP開發發生的一些信息。我們決定使用一個不同的子域對於我們JSON API,因爲這樣的:

子域,我們在:tickets.example.com JSON的位置:api.example.com/json

爲了登錄我們正在開發的票據系統,我們發送一個獲取請求到一個php腳本,它將結果作爲json字符串返回。

問題

看來,PHP不能看到我們有媒體鏈接創建一個會話,當我們發送給我們的登錄腳本的請求。雖然我們已經有一個PHPSESSID Cookie設置,但由於某種原因,我在響應頭文件中獲得了一個新的會話ID。

你可以說:「嘿,不同的子域名,當然這不起作用!」

我就想到這裏我自己,而是使用一個Cookie編輯器會話ID更改爲組中的一個-cookie頭的響應登錄我進去。

數據流量

對於缺乏更好的名稱

步驟1:請求是通過jQuery sendt,像這樣:

$('#loginForm').submit(function(e) { 
    e.preventDefault(); 
    $.post('http://api.website.com/json/login.php', $('#loginForm').serialize(), function(data) { 
     if(data.result==true) 
     { 
      location.reload(); 
     } 
     else 
     { 
      error(data.message); 
     } 
     }, 
     'json' 
    ); 
}); 

正如你所看到的,如果我們在json文件中得到result = true,那麼網站應該重新加載(並顯示登錄的網站)。發生這種情況,但由於會話處理有問題,我們被設置爲在另一個會話ID中「登錄」。

這是請求sendt和響應頭:

image http://puu.sh/anKCX/75701a8891.png

正如你所看到的,我們得到一個Set-Cookie頭,告訴我們到cookie PHPSESSID設置的東西。這從來沒有實際完成,並且Cookie保持與登錄前相同(r71qijt6utua4qjgarm59oe535)

如我所述,將cookie更改爲我們的新會話ID將使我們進入。

代碼

下面是一些片段:

的login.php

<?php 
require_once 'utils.php'; //Runs session_start(); 

[...] 

if (!Utils::isAuthenticated()) { 
    if (isset($_POST['username']) && 
     isset($_POST['password']) && 
     !empty($_POST['username']) && 
     !empty($_POST['password'])) { 
     $username = $_POST['username']; 
     $password = hash('sha256', $_POST['password']); 

     if (UserHandler::userExists($username)) { 
      $user = UserHandler::getUserByName($username); 
      $storedPassword = $user->getPassword(); 

      if ($password == $storedPassword) { 
       $_SESSION['user'] = $user; 
[...] 
+1

你叫'session_start'嗎? –

+0

是的,在utils.php。這是require_once'd無處不在,所以不應該是一個問題 –

回答

0

我認爲你正在尋找session_set_cookie_params。根據文檔此功能:

設置在php.ini文件中定義的cookie參數。此功能的效果只會持續腳本的持續時間。因此,您需要在每個請求和session_start()被調用之前調用session_set_cookie_params()。

此函數更新可以使用ini_get()檢索的相應PHP ini配置密鑰的運行時ini值。

通過指定.example.com而不是exchange.example.comapi.example.com您創建一個能夠在所有子域名中使用通配符的cookie。 0表示這是一個將在瀏覽會話結束時過期的會話cookie(例如瀏覽器關閉時),並且/這裏只是指定將Cookie設置在您網站的根目錄。

session_set_cookie_params(0, '/', '.example.com'); 
session_start(); 

參考:session_set_cookie_params(...);

注:確保你,你調用session_start();前放置session_set_cookie_params(...);,因爲它引用了你設置的值。如果您將其放置在session_start();之後,則會話cookie已被設置後會更新這些值,從而破壞運行此功能的目的。

+0

它看起來像cookie allready設置爲.example.com,雖然 –

+0

@ LiamS.Crouch對不起,我可能會錯過它。你在哪裏看到? – War10ck

+0

它不是在圖像中的「響應標題」下的「Set-Cookie」中說的,還是我誤解了它? –